読者です 読者をやめる 読者になる 読者になる

Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

新しい pLaTeX の話:非公式リリースノート 2016 年版 (1)

TeX Live 2016 には「日本語 TeX 開発コミュニティ」によってカスタマイズされた新しい pLaTeX がインストールされます。W32TeX では 2016/05/02 以降は新しい pLaTeX が配布されていますし、TeX Live 2016 pretest をインストールした方も 2016/05/10 以降は新しい pLaTeX を持っていることになります。従来のものと何が変わったのか、ここで実際の画像を見ていただきながら説明していこうと思います。

あくまでこのブログは「日本語 TeX 開発コミュニティによる公式見解」ではなく、その中の一個人が独断と偏見を交えつつ(?)説明しようという試みであり、それ以上の意味を持たないことをことわっておきます。公式な告知は TeX Forum に出してあります。

 

変更点の超ダイジェスト(兼・目次)

詳しく説明する前に、ダイジェストで画像と一文解説だけ示しておきます。

それでは、実際にみていくことにします。各項目についている番号は、pLaTeX News Community Edition, Issue 1 (plnewsc01.tex) のセクションに対応しています。

 

コミュニティ版 pLaTeX とは?

これは plnewsc01.pdf (plnewsc01.tex) に詳しく書きましたので省略します。超大雑把にいえば「pTeX / upTeX や e-pTeX / e-upTeX も新しくなったし、LaTeX も新しくなったので、pLaTeX や upLaTeX も新しくしよう」ということです。従来はアスキー・メディアワークスが配布していましたが、今後は少なくとも TeX Live / W32TeX での配布物については「日本語 TeX 開発コミュニティ」による pLaTeX / upLaTeX が採用される見込みです。

 

「私の pLaTeX は新しい?」

TeX Live 2016 最初のリリース時点では 2016/05/07 という日付の (u)pLaTeX フォーマットが入っているはずですので、pLaTeX を実行すると

This is e-pTeX, Version 3.14159265-p3.7-160201-2.6 (sjis) (TeX Live 2016)
 (preloaded format=platex)
 restricted \write18 enabled.
(./test.tex
pLaTeX2e <2016/05/07> (based on LaTeX2e <2016/03/31>)
Babel <3.9r> and hyphenation patterns for 81 language(s) loaded.

また upLaTeX を実行すると

This is e-upTeX, Version 3.14159265-p3.7-u1.21-160201-2.6 (utf8.uptex) (TeX Live 2016)
 (preloaded format=uplatex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
pLaTeX2e <2016/05/07u00> (based on LaTeX2e <2016/03/31>)
Babel <3.9r> and hyphenation patterns for 81 language(s) loaded.

のように表示されるはずです。なお、W32TeX では 2016/05/02 から一週間にわたり「テスト版」として 2016/04/17 という日付の pLaTeX を配信していました。これもやはりコミュニティ版で、2016/05/07 と完全に同じ組版結果をもたらします。

追記 (2016-06-11):コミュニティ版 2016/05/07 および 2016/04/17 には「アクセント付き文字」に対して critical なバグが入っていました(Thanks:forum:1941ZR さん)。このバージョンをお持ちの方は、バグを修正した 2016/06/10 への更新をお願いいたします。

追記 (2016-06-20):コミュニティ版 2016/06/10 には、また別の「i のアクセント文字」の特別扱いを考慮していないことに起因するエラーが起きていました(forum:1951)。これを修正した 2016/06/19 版(フォーマット日付は 2016/06/10 patch level 1)に更新してください。

 

3. (1) 脚注番号前後の不自然なアキの削除(pTeX 仕様変更への追随)

2013 年の (e-)pTeX の仕様変更で、画像上の例のように pLaTeX\footnote で「脚注番号前後の和文文字との間に不自然なアキが入る」という不都合が生じてしまいました。jsclasses の横組だけはこの不都合が判明した直後に対処を施してありますので目立たなかったのですが、それ以外(jarticle とか ipsj とか)を使うと露呈します。そこで、一昔前(2012 年まで)の挙動を取り戻すため、pLaTeX のマクロ \@makefnmark を変更してアキが入らないようにしました(画像下の例)。

ここに脚注\footnote{いい}があります。\par
There is a footnote\footnote{footnote} here.

f:id:acetaminophen:20160531221742p:plain

【もっと詳しく】pTeX には、もともと欧文組版用に作られた TeX にはないいくつかの機能が追加されていて、そのなかのひとつが「和欧文間空白(いわゆる四部アキ)の挿入」です。これは大雑把にいえば「和文文字と欧文文字が連続する場合に \xkanjiskip というパラメータに指定された分量のアキを挿入する」というものです*1

あいうabcあいう

と入力した場合、「う」と「a」の間・「c」と「あ」の間にアキが入るのがわかります*2。数式も欧文と同様に扱われるのが普通なので、数式前後に和文文字がきた場合にも pTeX はアキを入れます…が、ある特定の場合にこのアキが入らないことが問題視されました。

これに対処するために pTeX の規則を変えたのが 2013 年で、しばらくは副作用が見つかりませんでした。ところが、これが脚注番号前後に不自然なアキを作ってしまうことが判明しました。

直後に jsclasses 横組だけ対症療法としてコードを導入したのですが、他の文書クラスの問題も解消するより良い手段として pLaTeX 本体のコードを修正したのが、今回の変更点です。

実際に jsclasses のような対症療法が導入されなかった BXjscls(bxjsarticle など)での処理結果を例示しておきます*3

f:id:acetaminophen:20160531223521p:plain

【注意点】\footnote については、今回の対処で「脚注番号の不自然なアキ」がなくなりました。しかし、依然として endnotes パッケージのような後注を作成するパッケージでは不都合が残ります。具体的には、以下のように \endnote を使うと後注番号前後に不自然なアキが入ります。

\documentclass{jsarticle}
\usepackage{endnotes}
\begin{document}

ここに後注\endnote{ほげほげ}があります。

\theendnotes

\end{document}

これは endnotes パッケージ内で定義されている \@makeenmark が従来の \@makefnmark とほぼ同じ仕組みだからです。endnotes パッケージについては pLaTeX 本体では対処しようのない問題で、これが気になる場合は endnotes パッケージを読み込んだ後に以下のコードを書くなどして回避してください(以下は横組・縦組に両対応の pLaTeX カーネル\footnote 内部コードを \endnote 用に書き変えたものです)。

\makeatletter
\renewcommand\@makeenmark{%
  \ifydir \hbox{}\hbox{\@textsuperscript{\normalfont\@theenmark}}\hbox{}%
  \else\hbox{\yoko\@textsuperscript{\normalfont\@theenmark}}\fi}
\renewcommand\@endnotemark{\leavevmode
  \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi
  \ifydir\@makeenmark
  \else\hbox to\z@{\hskip-.25zw\raise.9zh\@makeenmark\hss}\fi
  \ifhmode\spacefactor\@x@sf\fi\relax}
\makeatother

追記 (2016-09-04):脚注番号に関しては、もうひとつ古くからある問題がありました。これは 2016/09/03 版で修正しました。詳細はその解説記事をお読みください。

 

3. (2) tabular 環境前後のアキの削除(pTeX 仕様変更への追随)

tabular 環境前後も上述の 2013 年の pTeX 仕様変更の影響を受けていました。こんな組版が必要なのかということはさておき、簡単な例を挙げます。表組前後のアキによるズレがおわかりいただけるでしょうか(画像上の例。中央揃え [c] のみならず [t] や [b] でも同様です)。これも新しい pLaTeX では修正版マクロを導入し、2012 年以前の組版結果を取り戻しました(画像下の例)。

{\TeX}\begin{tabular}[c]{l}\hline ほげ\\なんとか\\\hline\end{tabular}アレ。

f:id:acetaminophen:20160531231742p:plain

 

3. (3) \parbox[c](minipage 環境)、\underline 前後のアキの削除

上記 2 点とは少し違いますが、類似した現象として従来から不自然なアキが存在したものがあります。それが \parbox[c]{5cm}{...} やその「環境」版である \begin{minipage}[c]{5cm}...\end{minipage}、そして \underline{...} です。

\parbox[c]{...} は揃え位置を変えた以下の 3 行を比較すると状況がわかります。従来の pLaTeX では上下中央揃えのときだけアキが入ることがわかります(画像左の例:minipage 環境も同様の現象が起きます)。新しい pLaTeX では次のように [c] でも前後にアキが入りません(画像右の例)。

{\TeX}\parbox[t]{3zw}{なんとかかんとか}アレ。
{\TeX}\parbox[c]{3zw}{なんとかかんとか}アレ。
{\TeX}\parbox[b]{3zw}{なんとかかんとか}アレ。

f:id:acetaminophen:20160605111755p:plain

また、下線を引く \underline も「和欧文間空白」ルールとは反するかたちでアキが挿入されていました。問題なのが、下線部が和文で前後も和文の場合に不自然な四分アキが入ることで、これは奥村晴彦・黒木裕介著「改訂第6版 LaTeX2e 美文書作成入門」にも問題として次のように指摘されていました。

アンダーラインはタイプライター時代の遺物であり推奨しないというのが TeX での立場です。そのためもあって,TeX\underline はごく単純な作りになっていて(中略)さらに両側には \xkanjiskip が入ってしまいます。

確かにこれは不自然でした(画像左の例:下線なしの場合と比較してみてください)。新しい pLaTeX ではこのアキを削除してあります(画像右の例)。みてわかるとおり、副作用として「下線前後が欧文・下線部が和文の場合」にアキが入らなくなってしまいます…が、こんな文章を書くことはおそらく稀でしょう(というよりそもそも下線を使うこと自体が不自然ですね)。

下線なし:あいう漢字かきく\par
下線あり:あいう\underline{漢字}かきく

下線なし:あいうAlphabetかきく\par
下線あり:あいう\underline{Alphabet}かきく

下線なし:ABC漢字abc\par
下線あり:ABC\underline{漢字}abc

下線なし:ABCAlphabetabc\par
下線あり:ABC\underline{Alphabet}abc

f:id:acetaminophen:20160601000759p:plain

【注意点】和文の下線前後に不自然なアキがなくなったからといって、下線 \underline の使用を推奨するものではありません。新しい pLaTeX のマクロでは、下線前後に \xkanjiskip\kanjiskip も入らない*4ため、通常適用されるべき挿入規則に反していることに変わりはありません。ここでは \xkanjiskip という目立つ不都合だけは解消するという選択をした、という程度にお考えください。

 

残りは次回に続きます。

*1:アスキーによる公式解説はこちら、より詳しい挿入規則は LuaTeX-ja の資料を参照。

*2:なお、ソースを書く人の流儀によって、ソース自体にも半角スペースを入れている場合もあります。この場合は \xkanjiskip が挿入されず、代わりに半角スペースに対応するアキが入ります。このアキは一部のフォント(Times 系など)を除いて、自動挿入される \xkanjiskip とは幅が異なります。したがって、一つの文書内では「常に \xkanjiskip に頼る」か「常に自分で半角スペースを入れる」のどちらかの流儀をあらかじめ決めて統一すべきです。

*3:蛇足ですが、このブログ本文にも、和欧文間空白を入れるために “これは TeX です” のように半角スペースを使っています。もし半角スペースを入力しなければ “これはTeXです” のように密着してしまい、見栄えが悪い気がしているためです。

*4:和欧文間に \xkanjiskip というグル―が入るのと類似の、和文文字どうしの間に挿入される見えないグル―のようなものが \kanjiskip です。これは均等割りのようなことを実現する場合に活用されることが多いと思います。