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版を無償配布しています。)で文字と字形について整理していますので、そこを読んでいただくと分かると思いますが、文字のコードポイントは抽象的字体を定めるものであって、文字の表示形(字形、グリフ)を決めていない、と考えています。そして、文字の字形を与えるものはグリフであって、現在のフォント技術ではグリフはフォントファイルの中にあります。必然的に、コードポイントからグリフへのマッピングの仕組みが必要になります。日本語の縦書きは書記方法のひとつであり、表示形になるので本来コードポイントとは別の階層になります。コードポイントが基底階層とすると印刷や表示は表層です。そして日本語の文字には横書きと縦書きするときでグリフが違うものがあるのですが、これに対処するためにマッピングを切り替えることで文字の表示形を切り替える仕組を入れます。このマッピングの仕組みは必ずフォント依存になります(グリフはフォントファイルの中にあるからです)。

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

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

しかし、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の文字は固有の方向で書かれる。縦書き用の異形グリフや縦書きのフォントメトリックスが使えるときはテキストにセットする。

CSSの縦書きとUnicode(TR#50)がホットです” への7件のコメント

  1. おもしろい指摘だと思います。たしかに(ぼくもまだきちんと読んでませんが)UTR#50の筆者達が念頭においておるのは、キャラクターよりもグリフであると思えます。
    ただ、同じキャラクターに統合されているグリフのうちで、UとSに挙動が別れてしまう例を出していただけると、もっと議論が深まるように思えます。ちょっと考えてみたのですが、ぼくにはこれといった例が思い付きませんでした。

  2. 小形さん。コメントありがとうございます。
    1. 同じコードポイントでUとSに挙動が分かれる文字は、EPUBのメーリングリストで、石井・村上両君が口角泡を飛ばして議論している「’」のような文字です。和文縦書きでは直立し、縦書き中の欧文文脈では横倒しです。(精密には、単なる縦横ではないでしょう。)この問題はフォントのグリフ切り替えで実現するしか解決策はないと思います。(それは両名とも知っているようですが)。この問題の根源はUTR#50で、UTR#50のような方向では解決できないのではないかと思います。

    2.同じキャラクター(=コードポイント)に本来統合すべき文字でUとSに挙動が分かれてしまう文字は、いわゆる全角文字と半角文字です。Unicodeでは歴史的いきさつにより、記号類の全角形がFullwidthVariantとして登録されています。しかし、これは文字としては半角形と同じものであり、字形の違いです。従って、文字のコードポイントは同一になるべきものです。全角形を完全に廃止して、OpenTypeのフォントを新しくデザインするとすると次のようになるだろうと思います。例えば、’A'(U+0041)には横書き用のグリフと縦書き用のグリフを用意する。縦書きでは縦書き用のグリフを使い、横書きやあるいは、欧文の表示には横書き用のグリフを使う。このようにすれば、文字の全角半角変換(TextTransform)も不要になると思います。(但し、この2項は仮想的な話です)。

  3. 「全角形を完全に廃止して、OpenTypeのフォントを新しく…」については、すでに最近のOpenType日本語フォント(残念ながらMS明朝/ゴシックは違いますが)は ‘A’ (U+0041) に対して、プロポーショナル字形、全角字形、縦組用回転字形とグリフを切り替えられるようになっています。AH Formatter V6でも、font-variant: full-width の指定により全角字形に変えることができます。

    「日本語の中における欧文の表記、和欧混交の表示問題はTR#50のスコープ外」というのは間違いだろうと思います。

    ラテンアルファベットなどを日本語として1文字づつ使うには正立させればよいのですが、それはCSSならtext-orientation: upright の指定でできることになります。縦書きの中の欧文の部分を横倒しで表示するには、その部分にtext-orientation: sideways を指定すればできます。問題なのはデフォルトの text-orientation: upright-right (日本語は正立、ラテンアルファベットは横倒しという和欧混交モード)のときに、どうなるかです。

    レガシーな日本語ワープロなどの縦書きでは、いわゆる「半角文字」は横倒しで「全角文字」は正立で、ギリシア文字、キリル文字、ASCII範囲外の記号類は「全角文字」扱いで正立になりました。

    UTR#50は、それに代わるような標準を作ろうというものだと思います。それで、ギリシア文字、キリル文字、一部の欧文の記号(たとえば、§、†、¶、‖)、数学記号(÷、≠ など)、引用符( “ ” ‘ ’ )などがデフォルトで正立にすべきか横倒しにすべきかが問題になってます。
    レガシーな日本語ワープロと同様になるように、なるべく正立にという意見と、ラテンアルファベットが横倒しなら他も横倒しでよいとする意見とが分かれています。

  4. 「日本語の中における欧文の表記、和欧混交の表示問題はTR#50のスコープ外」というのは、ちょっと文章の表現はよくなかったですね。そこで別の言い方で説明しましょう。

    1.まずは、日本語だけ考えて正しく縦書きするにはどうするか。(つまり、英語の単語やパラグラフをまったく含めないで日本語を正しく縦書きするにどうするか?)

    2.それが完全にできるようになったら、次は英語の単語やパラグラフを入れたらどうするか?という順序で考えたらシンプルになると思います。

    日本語だけで考えたときは、ざっと:
    1)記号類 →原則として正立するが、方向性のあるものは回転(→ を↓にするなど)
    2)ラテン文字など海外の文字→すべて正立(言語ではなく記号としてみるなら回転は不要。)
    3)句読点→グリフの入れ替え
    4)括弧類→グリフの入れ替え(座標系の回転だけでメトリックスが問題ないなら、回転でも良い。)

    などとなります。つまり、直立・横倒しのグリフ選択問題は、和欧混交とは独立に発生する問題です。で言いたかったのは、TR#50は、文字直立・横倒ししか議論してないように見えるけれども、実は潜在的に和欧混交を考えているのではないかな?ということなんです。

    で、和欧混交のときの欧文系の単語やパラグラフ表記をどうするか?それは、英語の文章を縦書きに入れるのは横倒しが原則だと思います。しかし、縦組の書籍に英語の原文を沢山放り込むと読みにくくなるので、そういうときは縦組みは推奨しない横組みすべきとJLReqに書いて欲しいな。

    直接議論に参加したことはないですが、皆さんは文字の直立・横倒しと和欧混交を一緒くたにして考えているのではないでしょうか。それで問題がますます複雑化していると思います。

  5. ピンバック: 未来の縦書き文字の表示はどうなるの? | 電子書籍、電子出版のCAS-UBブログ

  6. 右横書きするスクリプトはupright-right で反時計回りに回転してくれたほうが読みやすそうな気も。でも,欧文と混じると却って読みづらいか。
    モンゴル文字がどうして Sv なのかよくわからないなー。
    デーヴァナーガリー文字やチベット文字は,right のとき,character 単位じゃなくて音節のような単位でちぎって成立してほしいなー。

  7. ピンバック: ラテンアルファベットと数字を縦にするか、横にするか?UTR#50とCSSの関係 | 電子書籍、電子出版のCAS-UBブログ

コメントは受け付けていません。