マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

アレだった XeTeX の縦書きがアレになった

最近に W32TeX を最新版に更新したのだが、そうすると、XeTeX の縦書き(の横転出力)の動作が変わっていることに気が付いた。例えば、次の単純な plain TeX 文書で試してみる。

% plain XeTeX 文書; 文字コードは UTF-8
\font\fLatn="LMRoman10-Regular"
\font\fHorz="IPAMincho:script=hani"
\font\fVert="IPAMincho:script=hani,vertical,+vert,+vrt2"
\fLatn Latin\quad \fHorz 横書ーき\quad \fVert 縦書ーき
\bye

結果は以下のようになる。ここで「(新)」が 2013/02/09 版の W32TeX のもの、「(旧)」が TeX Live 2012 のものである。*1(なお、以下の説明では上下左右について「横転したまま」の状態を基準にする。)

これを見ると、縦書き和文の基準線の配置が変わっていることが判る:(旧)は基準線*2を欧文ベースラインと合わせているのに対し、(新)では仮想ボディ下端の線を欧文ベースラインと合わせている。((pTeX 系の \tbaselineshift の値でいうと、(新)は 0.5zw、(旧)は 0zw に相当する。))ただ、縦書きで和欧文混植を行うときの状況を考えると、何れにしても欧文と和文の垂直位置は合っていない。(それから、(新)では〈縦〉と〈書〉の間が妙に詰まってしまっている。)

ところで、現実に日本語(の文)を出力する場合には、和文文字の間で行分割できるように、間にグルーを入れる必要がある。XeTeX ではエンジンにそれを自動で行う機能があるので、それを有効にしてみる。

% plain XeTeX 文書; 文字コードは UTF-8
\XeTeXlinebreaklocale "ja" % 行分割を可能にする
\font\fLatn="LMRoman10-Regular"
\font\fHorz="IPAMincho:script=hani"
\font\fVert="IPAMincho:script=hani,vertical,+vert,+vrt2"
\fLatn Latin\quad \fHorz 横書ーき\quad \fVert 縦書ーき
\bye

(新)の方は組版が完全に崩壊してしまった。どうやら、一文字ずつ出力する場合には、*3グリフの横幅の情報が異常になっているようにみえる。

そこで、グリフのメトリック(内部処理上の寸法)を調べるために、タイトな枠で字を囲って出力させてみる。(\fbox を使うので今度は LaTeX 文書にする。)

% XeLaTeX 文書; 文字コードは UTF-8
\documentclass[a4paper]{article}
\XeTeXlinebreaklocale "ja"
\font\fLatn="LMRoman10-Regular"
\font\fHorz="IPAMincho:script=hani"
\font\fVert="IPAMincho:script=hani,vertical,+vert,+vrt2" at 50pt
\setlength{\fboxsep}{0pt}
\begin{document}
\fbox{\fLatn A}\quad\fbox{\fVert}\quad
% 漢数字「一」・音引き・全角数字「1」
\fbox{\fVert}\quad\fbox{\fVert}\quad\fbox{\fVert}
\end{document}

はっきりいって、どちらもデタラメであるが、次のような感じである。(フォントサイズは 10pt である。)

  • (旧)では、「回転する前の縦書き用グリフのメトリック」をそのまま保持している。つまり幅は 10pt で、高さは〈あ〉が 8.11035pt、漢数字の〈一〉が 4.78027pt。音引きの高さをみると、「縦書きのグリフ」を規準であることが判る。
  • (新)はもっと訳がわからない。高さは「(旧)の値 + 5pt」、深さは常にゼロ、そして幅は全てのグリフについて 1.0pt か 2.0pt の何れかの値になっている。どちらの値になるかの規則はよく解らない。

これを見ると、果たして「本当に XeTeX で縦書きができるのか」と疑問に思えてくる。実際には、xeCJK の使用を前提にして少し補正のコードを書くことで縦書きが実現できるのだが、その話はまた後日。

[追記]念のため、「本来あるべき姿」を表した図を載せておく。(ベースラインシフトは 3.8pt。)

*1:TeX Live では実行ファイルについては初期リリースから原則的に更新されないので、「少し古い版」ということになる。なお、バージョン番号は(旧)が 0.9998 であるのに対し、(新)は 0.9999 である。ただし、この縦書きの挙動の変更とバージョン番号の変更が連動しているかは不明である。

*2:日本語フォントでは縦書きの場合の基準線の垂直位置は仮想ボディの中心を通る。

*3:XeTeX では単語単位で「文字列を内部にもつグリフレンダリングエンジンで処理してグリフの配置情報に変換する」という処理を行っている。最初の例だと「縦書ーき」が全体が「単語」であったのに対し、今の例で、文字間に(行分割のための)グルーを入れると、各文字が「単語」として扱われるので、組版結果が変わる可能性がある。