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

Acetaminophen’s diary

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

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

TeX

前回の続きです(新しい pLaTeX の概要や全体の目次は前回の記事を参照)。

【追記:2016-06-11】コミュニティ版 2016/05/07 には、本稿の 5. で解説している「ベースライン補正(縦組)で「Å」が乱れる問題を解消」という修正のやりかたがマズかったことにより、「すべてのアクセント文字」について多くの critical な副作用が生じてしまいました。

コミュニティ版 2016/06/10 では修正されています(参考:Issue #5)。TeX Live や W32TeX にも一両日中に反映されると思いますので、pLaTeX 2016/05/07 または 2016/04/17 をお持ちの方は 2016/06/10 に更新してください。

【追記:2016-06-20】コミュニティ版 2016/06/10 には、同じ「アクセント付き文字」でまた別の副作用(特別扱いされる i のアクセントに関係)が入っていました。

これはコミュニティ版 2016/06/10 patch level 1 (2016-06-19) で修正されましたTeX Live や W32TeX にも一両日中に反映されると思いますので、再度更新してください。

【追記:2016-07-01】トラブルが相次いだことから、この「アクセント付き文字」のパッチだけを一旦リセットしアスキー版の頃の挙動に戻しました。

コミュニティ版 2016/07/01 のほかの変更点も含め、こちらの記事を参照してください。

 

4. 縦組クラスでの overfull 警告の解消(バグ修正)

現象としては 2014 年に報告されていたものです(縦組をあまり使わない、あるいは警告に無頓着な方には関係ありません)。タイトルどおり、縦組で垂直ボックスが溢れてもいないのに

Overfull \vbox (4.58221pt too high) has occurred while \output is active

などという警告を吐いていました。これは縦組時に必要な深さ補正が正しく効いていなかったためで、これを修正しました。出力が特段変わるというわけではないはずです。

 

5. ベースライン補正(縦組)で「Å」が乱れる問題を解消(バグ修正)

欧文のみの TeX にはない pTeX の拡張である「ベースライン補正」が関わる問題です。ベースライン補正量のパラメータ \ybaselineshift\tbaselineshift がゼロでない場合に、いくつかのマクロが不自然な挙動を示します。

具体的には「LaTeX のロゴ(\LaTeX)」「合成文字 Å(\AA)」「\sqrt[3]{...}」などで、これらはいずれも LaTeX で定義されたマクロの性質上、pLaTeX のベースライン補正によって結果が乱れることがあります*1。今回はそのすべてに対処することはせず、特に深刻な「縦組で Å が必ず乱れてしまう」という問題に対処しました。

\documentclass{tarticle}
\begin{document}
テスト\AA テスト。
\end{document}

f:id:acetaminophen:20160602205417p:plain

【注意】旧実装では「Å の前には \xkanjiskip が入らず、後には入る」でしたが、新実装では「Å の前にも後にも \xkanjiskip入らない」となりました(→ 2016-06-11:下の追記参照)。これは、新実装では「いったんベースライン補正量をゼロにして合成文字を組んだ後、その合成文字を“箱”とみなして補正量分だけずらす」という処理になったためです。本来は前後が和文文字なら \xkanjiskip が両方に入るべきではありますが、マクロ実装の都合上このような挙動になっています。

追記 (2016-06-11):コミュニティ版 2016/05/07 では、この修正の実装法がマズかったせいで、Å のみならず「すべてのアクセント付き文字」に対して多くの悪い副作用が生じてしまいました。コミュニティ版 2016/06/10 ではそのバグを修正すると同時に、注意点として上に掲げた「\xkanjiskip を正しく入れられない」という問題も解消することができました。これで、アスキー版と比べてかなり改善したといえるのではないでしょうか。

追記 (2016-07-01):コミュニティ版 2016/07/01 では一旦この修正を取りやめました。代わりに、この修正パッチの改善版を「将来の pLaTeX に導入する候補」として実験用パッケージに入れてあります。詳細は新しい記事も参照してください。

【もっと詳しく】pTeX には \ybaselineshift\tbaselineshift というプリミティブがあり、それぞれ横組・縦組で「和文ベースラインを基準に欧文ベースラインをシフトする量」を格納します。通常、pTeX 横組みではベースラインシフトはゼロになっていますが、縦組では \tbaselineshift を正の値に設定することで、和文ベースライン(中央)と欧文ベースライン(“足”のないアルファベットの下端)をずらして自然な組版を実現しています。

f:id:acetaminophen:20160316013010p:plain

この「縦組では \tbaselineshift が正」というデフォルト状態で変な組版結果になるのは良くないと考え、Åなどの合成文字を定義する命令を pLaTeX で再定義するようにしました。なお、ユーザが \ybaselineshift をゼロ以外の値に設定した場合や、\tbaselineshift をもっと大きくずらした場合には、先述のロゴなどいろいろな命令が変な結果になることに注意してください。

 

6. トンボが縮む問題への対処(対症療法あるいは予防策)

LaTeX tools バンドルに付属する multicol パッケージ(2015/03/07 v1.8j ~ 2016/02/08 v1.8o)には、multicols 環境内で pLaTeX のトンボが縮むという問題がありました。

\documentclass[a5paper,tombow]{jsarticle}
\usepackage{multicol}
\begin{document}
\begin{multicols}{2}
(適当な文章)
\end{multicols}
\end{document}

f:id:acetaminophen:20160601011130p:plain

これは直接的には multicol 側のバグによるもので、\boxmaxdepth というパラメータの縮小が不必要なところに効いてしまっていたのが原因でした。これ自体は既に 2016/04/07 v1.8p で修正されていますが、依然として何らかの理由でユーザの書くコードや読み込まれたパッケージによって不用意に \boxmaxdepth が小さく設定される可能性がないとは言い切れません。そこで、安全を期すために「トンボでは必ず \boxmaxdepth を大きくする」という対処を入れました。

f:id:acetaminophen:20160601011144p:plain

 

7. \eminnershape の採用(LaTeX への追随)

2015 年以降、LaTeX カーネルに大量の変更が加えられたことは既に ZR さんが解説してくださっているとおりです。

この中で唯一、「LaTeX がわざわざ変更を加えて機能追加したのに pLaTeX がそれを活用していないもの」がありました。\eminnershape という命令です。

これは、強調を表す {\em ...} という命令を二重に使った場合の内側の書体をユーザが自由に定義できるというものです。使い方は例を見ていただくことにします。

\documentclass{jsarticle}
\usepackage[deluxe]{otf}
\def\eminnershape{\gtfamily\bfseries}
\begin{document}
あああ{\em いいい{\em ううう}いいい}あああ\par
aaa{\em bbb{\em ccc}bbb}aaa
\end{document}

f:id:acetaminophen:20160602214157p:plain

このように好きな定義を \eminnershape に与えれば、強調書体をカスタマイズすることができます。デフォルトは従来の pLaTeX との互換性のために \mcfamily \upshape と定義しておくことにしました。

 

8. platexrelease パッケージの追加(LaTeX への追随)

2015/01/01 以降の LaTeX ではメンテナンスポリシーが一新され、従来の「バグ修正用のパッチをまとめた fixltx2e パッケージ」を廃止し、代わりにカーネルのコードを直接修正することになりました。このときに、LaTeX後方互換性を提供するための新たな枠組みとして「latexrelease パッケージ」が新設されました。使いかたは

\RequirePackage[2015/01/01]{latexrelease}
\documentclass{article}

のように、ソース冒頭(クラスファイルより前)に \RequirePackage[日付]{latexrelease} と書くのが標準的です。latexrelease パッケージの仕様については LaTeX に添付されているドキュメントを参照してほしいのですが、pLaTeX でこれを使うと「pLaTeX がせっかく再定義したコマンドが latexrelease でキャンセルされてしまう」という状況が生じることがありました。

この問題を解決し、さらに過去の pLaTeX との後方互換性をサポートするために、pLaTeX で新たに作成したのが platexrelease パッケージです。

\RequirePackage[2015/01/01]{platexrelease}
\documentclass{jsarticle}

のように使用すると、「過去の日付の pLaTeX」の挙動を再現することができます。

 

9. ascmac パッケージの更新(バグ修正、仕様変更)

pLaTeX に古くから付属していた ascmac パッケージ (ascmac.sty, tascmac.sty) をバグ修正し、若干仕様が変わりました。

9. (1) pict2e パッケージとの衝突を解消

LaTeX 標準の picture 環境の制約を(PDF 出力ドライバに依存するコードを利用して)とりはらう pict2e パッケージを ascmac パッケージと同時に読み込むとエラーが発生するという問題がありました*2。これは ascmac パッケージが不用意に LaTeX の内部マクロ (\@oval) を呼んでいて、それが pict2e による再定義と矛盾したためでした。新しいコミュニティ版 ascmac ではこの問題は生じません。

9. (2) itembox 環境、screen 環境、\keytop の角のずれを解消

角が丸い四角形を描くマクロで、直線と角の四分円が理想値からずれていて汚いという指摘がありました。新バージョンでは同様の修正を、該当するすべてのマクロに適用してありますので、拡大してもずれはほとんど出なくなります。

注意:「ascmac + pict2e」ではなく「ascmac + epic + eepic」というパッケージの組み合わせは、依然として角がずれます(qa:2554)。これはむしろ epic や eepic 側の問題ですし、最近は epic + eepic 拡張より pict2e 拡張のほうが汎用性の面でも品質でも優れていますので、ascmac 側では対処していません。

9. (3) \maskbox\Maskbox が段落の先頭行頭で正しく働くように

\maskbox\Maskbox が作る「箱」が段落冒頭に使われた場合に、段落が始まっていないためインデントや中央揃えなどが効かない問題がありました。

なお、以上 9-1 から 9-3 については ZR さんの bxascmac の中で修正されていましたので、これを ascmac に取り込んだかたちとなっています(このため本記事での解説も最低限としました)。

9. (4) shadebox 環境、boxnote 環境直前の改段落(仕様変更含む)

ascmac パッケージには boxnote / screen / itembox / shadebox という 4 種類の箱をつくる環境がありますが、このうち shadebox 環境だけが「改段落せずに環境を始めると箱が版面をはみ出す」という問題がありました。統一を図るため、新バージョンではこれら全ての環境を「\par\vspace{.3\baselineskip} で始める」としました。screen / itembox は従来どおりですが、boxnote 環境はこれまでの \par\vspace{\baselineskip} と比べると、箱直前の垂直方向のスペースが若干狭くなります。

9. (5) ベースライン補正の退避と復帰を正確に

既に 5. で説明したベースライン補正量について、ascmac パッケージは文字や線を組み合わせて枠を作る処理の都合上、従来から「いったん退避してゼロにし、必要な場所で復帰」とされていました。しかしその処理が不完全で、ベースライン補正が効いていない箇所が生じることがありました。特に気になるのが、縦組で \keytop を使うと以降の全ての文章でベースライン補正がゼロになっていまうことと、itembox 環境のタイトルでベースライン補正が無効になることでした。新バージョンではこの処理を改善するとともに、縦組ベースライン補正量だけでなく横組ベースライン補正量にも同じ退避・復帰を導入しました。

9. (6) \keytop[c]{...} 前後のアキを削除

これは 3. (3) と同様です。キートップのオプションが上下中央揃えのときだけ不自然な \xkanjiskip アキが入る現象を回避しました。

f:id:acetaminophen:20160605122246p:plain

 

終わりに

最近は LuaTeX の動向が気になるところではありますが、pLaTeX / upLaTeX も決して完全に枯れているわけではありません。日本語の組版全般を考えるうえで無視できない pLaTeX を再考し、“その先へ”進むきっかけを作ることが出来たらいいなというのが、いまの私の願いです。

*1:どのマクロも文字配置すべき高さを算出するために「いったん文字を箱に入れて、その箱の高さを取得する」という処理を含みます。しかし、pTeX のベースラインシフトにより欧文文字が下方向にシフトしている場合、高さが減り深さが増えた影響でこの配置に不整合が生じているのです。

*2:割と有名な衝突だったため、以前にこのブログでも取り上げました:LaTeX でパッケージが衝突したときは(1) - 2. 内部コマンドが衝突する例