UTR#50 のドラフト第5版に関する批判的コメント

日本語を縦組みしたときに、文字の方向をどう決定するかということについて、何回もブログで書いてきましたがこれはかなり悩ましい問題です。CAS-UBでも縦組のPDFを生成したり、EPUB3には縦組みレイアウト用CSSを指定できますので、早急に整理しなければならないと思っています。

UnicodeやCSSワーキンググループでは、この検討が精力的に行なわれており、UnicodeのUTR#50が先日(5月17日)ドラフト第5版になりました。

http://www.unicode.org/reports/tr50/tr50-5.html

今回の大きな変更点は、レポートの表題が「Unicode Properties for Horizontal and Vertical Text Layout」に変わったことです。従来は、「Unicode Properties for Vertical Text Layout」でしたが、今回から横書きでの文字の方向に関する記述が追加になりました。

横書きプロパティが追加になりました。

○プロパティ
横書き(Horizontal Orientation、HO):横書き用
縦積み方向(Stacked Vertical Orientation、SVO):文字がほとんど正立する世界における縦行用
混在縦組み方向(Mixed Vertical Orientation、MVO):東アジア、特に日本、中国、韓国の縦行用

UTR#50はUnicodeの文字に対して3つのプロパティにおける文字方向のデフォルト値を規定するものです。

○プロパティ値は次のように規定されます。

U:コード表に表れるのと同じ方向で、正立表示する文字
R:コード表を時計方向に時計方向に90度回転して、横倒しで表示する文字
L:コード表を時計方向に反時計方向に90度回転して、横倒しで表示する文字
T、Tu、Tr:単に正立または横倒しではなくて、縦組みで使うときはコード表とは異なるグリフを必要とする。Tuはフォールバックとしてコード表のグリフを正立で使うことができる。Trはフォールバックとしてコード表のグリフを時計方向に90度回転して使うことができる。

Unicodeの各文字に対するプロパティ値のデータ表が提供されています。

http://www.unicode.org/reports/tr50/tr50-5.Orientation.html

第5版では、プロパティ値のデータ表に、HOの列が追加になりました。一方、MVOの値は、これまでA案とB案提案されていましたがB案に一本化されました。

■問題点
UTR#50には、かなり大きな問題があります。

その1:SVOとMVOが明確に規定されていないこと。

原文は次のようになっています。

SVO:「… intended to be used for vertical lines in those parts of the world where characters are mostly upright. 」
MVO:「… intended to be used for vertical lines in East Asia, and more specifically in Japan,…」

MVOについてはサンプルの図3があり、和欧混植の組版を意味していることは明らかです。しかし、SVOの定義でいうところの「文字がほとんど正立する世界」とは一体どこのことなのでしょうか?MVOの定義には「東アジア特に日本の縦書きの行」とありますので、するとSVOは日本は属さないと読めてしまいます。

このあたりの定義をもっと明確にする必要があります。たとえば、SVOは和文のみ、MVOは和文と欧文が混ざるときというように。しかし、おそらく少なくとも日本語の書籍についてはSVOという世界はほとんど存在しないので、日本語の書籍ではあまり意味がない概念でしょう。

その2:方向特性値の決め方がまずい。

方向特性値は、「This default determination is based on the most common use of a character, …」とあります。つまり、デフォルトの方向は文字の最も一般的な使用法に基づいている、とのことです。しかし、最も一般的な使用法をどうやって判断しているか理解できません。

たとえば、プロパティ値のデータ表で見ますと、アラビア数字(ASCIIコード範囲)は、MVOで「R(横倒し)」と決めています。

MVOのサンプルである図3(Figure 3. Japanese vertical text)には数字が3箇所に出てきますが、いづれも正立で、横倒しになっていません。アラビア数字をMVO:Rとするのは、このサンプル図に矛盾しています。たった1枚の図で判断するなよ、と言われるかもしれませんが、しかし、日本で実際に販売されている縦組みの雑誌や書籍では、アラビア数字の大半は正立です。これは市販の縦組本を少し調査すればすぐに分るはずです。

たとえば、このブログで先週調査結果を報告した「刑務所なう。」には、アラビア数字が数百箇所はでてきますが、横倒しになっている箇所はほとんど例外的と言って良いほど少なく、アラビア数字の99%以上は正立しています。

「刑務所なう。」にみる縦組みにおける英数字・記号の向きを参照のこと

方向特性値を「(市販の書籍や雑誌における)最も一般的な使用法」とするならば、例えばアラビア数字(ASCIIコード範囲)は、間違いなくMVOで「U(正立)」にしなければならないでしょう。そうするとUTR#50の「最も一般的な使用法」はどうやって決めているのでしょうか?

もしかすると、InDesignのデフォルトが横倒し?そうすると、DTPオペレータが毎回せっせと数字を立てていることになるのですが。

ここで白状しますと、AH Formatterもアラビア数字(ASCIIコード範囲)は、MVO:Rなのです。困ったな。

つまり、いままでは英数字はASCIIコード範囲は縦書き時横倒し、互換コード範囲は正立という方式がずっとすべてのアプリケーションの実装となっていたのです。で、方向特性値を「(ベンダにとって)最も一般的な使用法」と定義すれば矛盾はなくなるのですが、それで良いのだろうか?いや、それではだめだろう、ということなのです。

縦書きにおける文字の方向について、UTR#50改訂版ドラフトの内容紹介

縦書きにおける文字のデフォルト方向を定義するUnicodeの技術レポートUTR#50の新しい草案(Revison 3)が2月10日に公開されています。

Working draft of Proposed Draft Unicode Technical Report #50
UNICODE PROPERTIES FOR VERTICAL TEXT LAYOUT
http://www.unicode.org/reports/tr50/tr50-3.html

まだ作業中のようですが、以下に内容のあらましを紹介します。

Revision 2からの変更点は次のとおりです。

  1. Revison 2の中のEAC(East Asian Class)が取り除かれました。
  2. 従来のEAO(East Asian Orientation)は名前がEAVO(East Asian Vertical Orientation)に変更されました。
  3. 新しい特性として、DVO(Default Vertical Orientation)が導入されました。

EACは「日本語組版処理の要件」をもとにした空き量の調整ですが、これは、「縦組みにおける英数字成立論」でも疑問を提示しました通り、横組みにも適用されるものですし、そもそも空き量の調整は綺麗な組版のためのものなのでUnicodeのような文字コードレベルで規定するのがふさわしいかどうか疑問があります。取り除いたのは賢明と思います。

Revision 2ではEAOがEACに依存していましたが、この依存性に関する記述はなくなりました。この結果、本文からは全角文字と半角文字に関する記述はなくなりました。

DVOは次のように定義されています:
「文字がほとんど直立する世界における縦書きに使うことを意図している」(5 Properties)

この文章の意味はあまり明確ではありませんが、次の例が挙がっています。

  1. 西欧の縦組みテキストの例(文字を正立させて縦組みしている案内版)
  2. 日本の頭字語(DVD、TV)の例

EAOとDVOをどのように組み合わせるか、あるいは、なんらかの規則を設けるかなどは今後の検討課題となります(Editorial Warningsより)。

縦組みのときの方向特性値は従来どおりで変わりません。次のような定義です。

U:文字コード表に現れるのと同じ方向で直立する
S:文字コード表の方向から右に90度回転する
SB:横倒しにする括弧類
T:直立・横倒しではなくて縦組み時に異なるグリフ(字形)にする必要がある

新しいデータファイルが用意されています。
データファイル

基本ラテンの文字コード別にどのような割り当てになっているかを調べて見ます。

文字コード, DVOの値, EAVOの値
0020(‘ ‘), S , S (空白)
0021(!), U , S
0022(“) , U , S
0023(#) , U , S
0024($) , U , S
0025(%) , U , S
0026(&) , U , S
0027(‘) , U , S
0028(‘(‘) , S , S (開き括弧)
0029(‘)’) , S , S (閉じ括弧)
002A(*) , U , S
002B(+) , U , S
002C(,) , U , S
002D(-) , S , S
002E(.) , U , S
002F(/) , U , S
0030…0039(0…9) , U, S
003A(:) , U, S
003B(;) , U, S
003C(<) , U, S 003D(=) , U, S 003E(>) , U, S
003F(?) , U, S
0040(@) , U, S
0041…005A(A…Z) , U, S
005B([) , S , S
005C(\) , U , S (バックスラッシュ)
005D(]) , S , S
005E(^) , U , S
005F(_) , S , S
0060(`) , U , S
0061..007A(a…z) , U , S
007B({) , S , S
007C(|) , U , S
007D(}) , S , S
007E(~) , U , S

EAVOでは基本ラテンの(~U+007Eまでの)文字はすべて横倒しとなりますが、DVOでは縦書きにおいて括弧類など一部の文字(表でSになっている文字)のみを横倒し、ラテンアルファベットとアラビア数字はデフォルトで正立となります。DVOを使うと「縦組みにおける英数字正立論」の主張と同じとなります。

ここで規定する方向特性の値は、あくまでデフォルト値です。英数字はマークアップで明示的に指定して横倒しにすることはできます。

「縦組みにおける英数字正立論」では記号類は未検討でしたので、これから記号類を含めてもう少し精密な検討をして改訂したいと考えています。

○「縦組みにおける英数字正立論」:http://www.cas-ub.com/project/index.html 

○UTR#50付属のデータファイルでは、EAVO-A方式とEAVO-B方式の二通りがあります。A方式とはすべての記号類に’U’を割り当てる方式、B方式は矢印、数学記号、罫線記号、括弧に’S’を割り当て、その他の記号を’U’とする方式です。どちらが良いか意見を求めています。

全角英数と半角英数の使い分けの煩わしさをなくす100年1回のチャンスが来ています!

いま、UnicodeでUTR#50という仕様が検討されていることは何回も書きました。

この仕様については、Forumでいろいろ議論がされています。論点がいろいろありますので、議論に参加するときりがないのですが、しかし、表題に書いたとおり、全角英数と半角英数の使い分けは日本語の文章を書いたり本を作る上で大変煩わしい問題です。

これは本を書く人だけではなくて詳細は割愛しますが、CAS-UBのようなサービスを開発する上でも大きな負荷になっています。

UTR#50が提案されたことで全角英数と半角英数の使いわけを解消するチャンスが来ているのも確かです。もし、UTR#50で全角文字正立、半角文字横倒しをデフォルトにされてしまうと、この煩わしさをなくすチャンスはほぼ永久になくなると思います。

ということで、この問題を何とかしたいと思っています。

UTR#50のエディターはEric MullerというAdobeの人物で、今朝は、UnicodeのForumでこんなことを言っています。

「DTP/Web users have taken advantage of the existence of the fullwidth characters, in the following way: they use the ASCII code points when they want a cl-27/sideways in vertical treatment, and they use the fullwidth code points when they want a cl-19/upright treatment. Tools such as Word and InDesign allow that usage, and I am pretty sure that a significant fraction of the users would complain if they were told “don’t use the fullwidth characters any longer, use styling instead to indicate if you want cl-27/sideways or cl-19/upright”」
(Eric Muller:http://www.unicode.org/forum/viewtopic.php?f=35&t=252 より引用)

簡単な訳:
「DTPとWebのユーザーは、次のように全角文字の利便を享受している:縦書きではASCIIのコードポイントを使って横倒しにして、全角のコードポイントを使って正立させている。WordやInDesignはこういう使い方を許しており、”もう全角文字は使わない、そして、横倒しと正立を示すにはスタイルを使いなさい”といったら多くのユーザーは不満をもつだろう」

でも・・・

全角文字と半角文字を文字コードで使いわけるのとスタイル指定で使い分けるのは論理的には等価です。しかし、実作業的には文字コードで使い分けるのは、混乱の元になります。マークアップしてスタイルで使い分けるほうが明確になりますし、また、文字コードはテキストに対するハードコードなので、同じテキストを横書きにすると破綻(アルファベットや数字の全角文字は横書きでは見にくい)してしまいます。スタイルを指定して使い分ける方が柔軟になるのです。

このことは、「ラテンアルファベットと数字を縦にするか、横にするか?UTR#50とCSSの関係」でも説明しました。

Mullerさんをうまく説得しないと・・・

CSSの縦書きとUnicode(TR#50)がホットです

CSS3のWriting Modeで縦書きを指定できるようになって、EPUB3がそれを採用してEPUBで縦書きができるようになった、というのは昨年(2010年~2011年)の話です。

CSS Writing Modes Module Level 3

その後、Unicodeで文字のコードポイント毎に方向の特性を定義しようという、TR#50というものが浮上しています。

UNICODE PROPERTIES FOR VERTICAL TEXT LAYOUT(Draft)

この全体像はまだ読んでいないですが、ざっと見ると、縦書きにするときの文字の挙動として、文字単位で次の分類をしようとしています。

U:直立する文字 characters which are displayed upright
S:横倒しになる文字 characters which are displayed sideways
SB:横倒しになる括弧 brackets which are displayed sideways
T:単に上とか横ではなく、別のグリフが必要な文字 characters which are not just upright or sideways, but require a different glyph

スコープとしては、主に日本語の文字ですが、中国語などにも広げようとしているように見えます。

そして、CSS3の新しいEditor’s Draftでは、縦書きではこのUTR#50を利用して縦書きのときの文字の挙動を指定しようとしているようです。(注1)

CSS Writing Modes Module Level 3 Editor’s Draft 5 January 2012

さあ、これはうまく行くのでしょうか?直感的にはあまり意味がないような気がします。理由は以下の通りです。

「PDFインフラストラクチャ解説」http://www.cas-ub.com/project/index.html(でEPUB版を無償配布しています。)で文字と字形について整理しています(『PDFインフラストラクチャ解説』はプリントオンデマンドとEPUBを販売しています。)ので、そこを読んでいただくと分かると思いますが、文字のコードポイントは抽象的字体を定めるものであって、文字の表示形(字形、グリフ)を決めていない、と考えています。そして、文字の字形を与えるものはグリフであって、現在のフォント技術ではグリフはフォントファイルの中にあります。必然的に、コードポイントからグリフへのマッピングの仕組みが必要になります。日本語の縦書きは書記方法のひとつであり、表示形になるので本来コードポイントとは別の階層になります。コードポイントが基底階層とすると印刷や表示は表層です。そして日本語の文字には横書きと縦書きするときでグリフが違うものがあるのですが、これに対処するためにマッピングを切り替えることで文字の表示形を切り替える仕組を入れます。このマッピングの仕組みは必ずフォント依存になります(グリフはフォントファイルの中にあるからです)。

あとは、日本語の中に欧文などのほかの言語の列が来たときは、オリジナル言語の書記方向(たいていは左から右への横書き)で書いておいて、それを言語単位毎に文字列全体を回転させて日本語の文中に埋め込みます。こうすれば縦書きが簡単にできます。

こうして考えると、文字のコードポイント一つ一つに方向性を定義するのはあまり意味のないことだし、抽象化に反します。いわば、数十年前に先祖がえりというか・・・

しかし、CSS3 Writing ModeはTR#50に依存することになりそうです。これが正式な仕様になると、これからのブラウザは文字をひとつづつ回転させることになるかもしれませんね。どうもCSSのワーキングはフォント依存を嫌っているようなのです。その気持ちは分かりますが、しかし、フォント依存性をなくそうとすると文字毎に表示形を自力で操作することになり、また同時に、過去20年程度のフォントの技術の発展を無視することになります。以上のことからUTR#50は完全な解決策にはならないだろうと予想します(以上、1/11メモ)。

2012/1/13 追記(メモ)
TR#50をもう一度読みました。この文書は二つのこと、つまり日本語の(1)縦書きのときに字形を変えるべきかどうか、(2)文字と文字の間の空き量をどう変えるべきか、に対する指針を決めようとしているようです。この二つの問題は一応別の問題なので、とりあえず、ここでは(1)だけ取り上げることにすると、まず、Unicodeをはじめとする文字セットは原則として抽象的な文字(漢字の場合は字体)を決めているものです。そして、抽象的な文字を使って、日本語を横書きか、縦書きで書き表すことになります。現在日本語で使われている文字の中には、a. 横書専用の文字(例:U+2019 RIGHT SINGLE QUOTATION MARK)b.縦書き専用の文字(U+301D REVERSED DOUBLE PRIME QUOTATION MARK)c.縦書きと横書きで字の形(グリフ)が同じでよい文字(ほとんどの漢字)、d.縦書きと横書きで字の形を変えるべき文字(句読点類、括弧類など)があります。例は、日本語組版処理の要件(日本語版)(JLReq)の付属書に記載されているものより。

ですので、もし日本語の文字を分けるとすると上のa.~d.に分けるのが良いと思います。

さて、ラテンアルファベットなども日本語として1文字づつ使うときは、c.(日本語の縦書きで直立)にすべきで、URT#50で、CL-27(Western Character)をS:横倒しとしているのは正しくないでしょう。但し、英語の単語が縦書きの中に現れれば単語ごとそっくり横倒しです。これは文字を回転するのではありません。(CL-27を横倒しにしているのは、UTR#50の著者の頭の中に英語表記のスコープが混じっているからだと思います。しかし、文字単位で考えたら縦になる(正立する)のは自明だと思います)。つまり、TR#50は日本語縦書きの中に英語や他の言語(合わせて欧文という)の表記が入るとどうするか、と言う問題、いわゆる和欧混交の段落を縦書きするときの話を混同していると思います。しかし、日本語の中における欧文の表記、和欧混交の表示問題はTR#50のスコープ外になっているようですし、これは別の問題としてスコープ外のままで良いと思います。(★ここはちょっと表現がよくなくて、コメントがあります)

2012/1/14追記
CSS3のWriting-modeでは日本語縦書きの中にラテン文字を直立させる組版方法は、text-orientation:uprightで、日本語縦書きの中にラテン文字を欧文組版のブロックとして挿入する方法はtext-orientation:upright-rightを指定すると実現できます。従って、問題は縦書きのときのグリフとグリフメトリックスをどう決定するかということに尽きるようです。

2012/1/15追記
JLreqでは、日本語の縦組時に文中に挿入される英数字の向きは、(1)和文文字と同じように正常な向きで1字1字配置する。(2)主に英字の単語、文などは文字を時計回りに90度回転し,配置する。という二通りを挙げている。

英数字(ASCII文字)のUnicodeにおけるコードポイントは、Basic Latin(U+0020~たとえばAにはU+0041)であり、慣例的に半角形と呼ばれる。UnicodeではASCII文字の全角形(異形文字)にはコードポイントU+FF00~(たとえばAの全角形はU+FF21)が与えられている。したがって、(1)のように直立するときは全角形の文字コードを使い、(2)のように寝かせるときは半角形の文字を使いわければ、1冊の出版物の中で(1)と(2)の印刷時の表記を使い分けることができる。しかし、もし、一つの出版物の中ですべての英数字を半角形で作成すれば(1)と(2)の表記を自動的に切り替えることはできない。このときは、英数字の直立・横倒しを切り替えるには何からのマークアップを使う必要がある。

日本語を読む上では、(1)の表記の方が読みやすく、(2)のような横倒しは読みにくいのは明らかである。もし、全角文字と半角文字を使い分けせず、また、文字が横倒しになるのをできるだけ避けるとするならば、解決策としては、連続3文字までは直立し4文字以降は横倒し、というような規則で自動処理する方法もあるだろうが、あまり有効に働きそうもない。

で結局?

ASCII文字を立てる寝かせるというような問題は言語の書記方法の問題なので、Unicodeのような標準にはなじまないのではないか?

————————————————————–
(注1)
CSS Writing Modeのエディタは、UTR#50の文字のスコープをUnicodeの全域に広げようとしているようだ。そのために文字のカテゴリーを少し詳しく定義しなおすことを試みている。
http://dev.w3.org/csswg/css3-writing-modes/#vertical-typesetting-detailsの抄訳
(なお、この文章はエディターズ・ドラフトというものであって、CSSの正式なドキュメントではないので注意。)

1.URT#50と次の規則により縦組みの時の文字の挙動を5つのクラスのどれかに分ける。

なお、‘upright-right’と‘upright’は、CSS Writeing Modeのtext-orientation特性で指定する値である。この詳細は後述する。☆を見よ。

1) 直立upright (U)
‘upright-right’ と ‘upright’ 書記指定時で直立する
2) 横倒しsideways (Sv)
‘upright-right’ と ‘upright’ 書記指定時で横倒し (時計回りに90度回転) (★SvとSBの違いが分かりにくい)
3) 非ネイティブ non-native (Sh)
‘upright-right’ 書記指定時は横倒し、‘upright’ 書記指定時に直立
4) 括弧brackets (SB)
‘upright-right’ と‘upright’ 書記指定時にともに横倒し。しかし、縦書きをサポートするOpenTypeフォントが直立の異形グリフをもつので、縦組みフォント設定オンで直立する。
5) 変形transforms (T)
縦組みと横組みでグリフの形が大幅に変わるもの。‘upright-right’と‘upright’ 書記方向で直立するが、正しい組版では波形グリフを必要とする。

SvとShは、UTR#50執筆時ではSとなっている。‘upright’ 指定時の挙動の違いで分割した。

2)のSvは、Sカテゴリーの次の文字からなる:
・回転する縦書き言語に属する文字 (e.g. Mongolian)
・空白 (Zs), 接続文字 (Pc), ダーシ (Pd) あるいは括弧のような句読文字 (Ps, Pe, Pi, Pf)(★←SBに入っていたのではないか?)
・Box Drawing、Block Element区域の文字

その他のS文字はShになる。

2.Unicode文字の分類は次のようになるだろう。(以下のa, b, cの分類はUTR#50によるものだと思う。英語の文章はそうは読めないけれども。)

a. 括弧類brackets (SB)には次が入る

 東アジアのすべて全角(F) と広い(W) 括弧句読文字 (Ps, Pe, Pi, Pf)

b. 横倒しsideways (S)には次が入る

Currency Symbols (Sc), Math Symbols (Sm), and Modifier Symbols (Sk)、Dashes (Pd)(全角のハイフンマイナスを除く)
東アジアの半角East Asian Halfwidth (H) 文字、上付き、下付き、 and non-Indic fractions from the Other Number (No) category.
Aegean numbers and North Indic fractions from the Other Number (No) category.
All characters from the Box Drawing and Block Elements blocks
All directional arrows: the Arrows block, the Pointing hand symbols from the Miscellaneous Symbols block, any arrow from the Miscellaneous Symbols and Arrows block, any Dingbat arrows from the Dingbats block
Other Symbols (So) from the Latin-1 Supplement and Letterlike Symbols blocks.
Other Symbols (So) from the Aegean Numbers, Ancient Symbols, Common Indic Number Forms blocks
Characters belonging to any horizontal-only or rotating vertical scripts.

c. 直立upright (U)には次が入る

すべての東アジアの全角文字 (F) と広い (W) 文字でSBに割り当てられているものを除く
Other Numbers (No) and Other Symbols (So) except those assigned to S
All letters (L*), marks (M*), and numbers (N*) belonging to any translating vertical scripts.

3.☆text-orientationの値の説明。以下の値は縦組のときの話である。デフォルトは、‘upright-right’ なので、text-orientationになにもしない指定ときは‘upright-right’である。

a. ‘upright-right’ 縦組のとき、横書き専用のsriptの文字は横倒しになる。すなわち、標準の方向から時計回りに90度回転する。縦書きの記法がある文字は固有の方向となる。

b. ‘upright’ 縦組みでは、横書き専用のsriptの文字は直立で可視化される。このような記法の文字の字形は独立系となる(アラビア文字などの独立形のこと)。縦書きscriptの文字は固有の方向で書かれる。縦書き用の異形グリフや縦書きのフォントメトリックスが使えるときはテキストにセットする。