AH Formatter / XSL Formatter
Q&A



操作方法

多言語

トップ
基本・一般
AH Formatter について
XSL Formatter について
操作方法
プログラミング
XSLT/XSL-FO/SVG/MathML 仕様について
XSLT/XSL-FO/MathML テクニック
索引
Q.  英語(書き順が左から右)とアラビア語(書き順が右から左)を混在させたドキュメントの組版を行ったのですが、英語単語に付けた括弧が違う場所に表示されてしまいます。これは不具合ではないでしょうか。 [No.2002102508]
A. 

これは不具合ではありません。Unicodeの仕様によるものです。

Unicodeテキストの方向性は、Unicodeの仕様の中のbidiアルゴリズム(双方向アルゴリズム)によって決まっています。ラテンアルファベットはleft-to-right(書き順が左から右)、アラビア文字やヘブライ文字はright-to-left(書き順が右から左)です。

括弧はUnicodeではleft-to-rightでもright-to-leftでも使用できる「ニュートラル(neutral)」な文字とされています。
そして括弧のような対の文字は、right-to-leftの状況では、グリフもleft-to-rightと向きが逆になります。これをミラーリング(Mirroring)と言います。

つまり、括弧の文字はニュートラルな文字で、なおかつミラーリング対象文字となっていますので、左括弧'('が右括弧')'になり、右括弧')'が左括弧'('になります。

例を出して解説します。

FOには次のように書かれていたとします。 'Arabic' が アラビア語、'English1'、'English2' が英語です。 'English2' が括弧で囲まれています。

<fo:block-container writing-mode="rl-tb" language="ar">
<fo:block>
Arabic English1 (English2)
</fo:block>
</fo:block-container>

この出現順で right-to-left の場合、次のようになります。

(English1 (English2 cibarA

Unicodeの仕様では、「一般的に、ニュートラル(の文字)は周辺のテキストの影響を受ける。」とありますので、left-to-rightとleft-to-rightにはさまれたnuetralはleft-to-rightになりEnglish1とEnglish2の間の左括弧'('はleft-to-rightとなります。
しかし、English2の後ろの右括弧')'は、Unicodeの仕様で「対立(混在)した場合は、上で指定された方向で埋め込む。」とありますので、fo:block-containerで指定されたwriting-mode="rl-tb"により、right-to-leftとなります。
よって、右括弧はミラーリングによって左括弧になり、writing-mode="rl-tb"によって行末(right-to-leftなので一番左側)に配置されます。

これを解決する方法はふたつあります。
ひとつは、Unicode 制御文字の U+200E (LRM, Left-to-Right MARK) を使用します。LRMは方向性のあるゼロ幅のマークです。English2の後ろの右括弧')'の後ろにleft-to-rightの方向性の文字を追加すれば、右括弧')'も、left-to-rightとなります。

<fo:block-container writing-mode="rl-tb" language="ar">
<fo:block>
Arabic English1 (English2) &#x200E;
</fo:block>
</fo:block-container>

ふたつ目は「fo:bidi-override」を使用します。
'(English2)'の部分を <fo:bidi-override unicode-bidi="embed" direction="ltr"> で囲みます。

<fo:block-container writing-mode="rl-tb" language="ar">
<fo:block>
Arabic English1
<fo:bidi-override unicode-bidi="embed" direction="ltr">
(English2)
</fo:bidi-override>
</fo:block>
</fo:block-container>

なお、半角スペースもニュートラル文字ですので配置がかわります。上記のふたつの方法の適切な方法を使用してください。

Unicodeの仕様はUnicode Standard Annex #9 The Bidirectional Algorithmをご覧ください。


Copyright © 1999-2011 Antenna House, Inc. All rights reserved.
Antenna House is a trademark of Antenna House, Inc.