Acetaminophen’s diary

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

コミュニティ版 pLaTeX / upLaTeX 2017/05/05 版の解説 (1)

先日、コミュニティ版 pLaTeX と upLaTeX を更新しました。TeX Live 2017 のリリース時に標準でインストールされるバージョンはこの 2017/05/05 版となります。本家 LaTeX も最近アップデートされましたので、platex や uplatex コマンド起動直後のバナーは以下のように表示されます。

  • pLaTeX の場合:
    pLaTeX2e <2017/05/05> (based on LaTeX2e <2017-04-15>)
  • upLaTeX の場合:
    pLaTeX2e <2017/05/05u01> (based on LaTeX2e <2017-04-15>)

今回は半年ぶりのアップデートで、かなり多くの修正・改良を加えてあります。本記事では、この修正点について解説します。

 

1. 標準クラスファイルの修正

かなり多いのですが、大きな改善点はjbook / tbook / jreport / treport クラスのページ送り (openright, openany, openleft) とは何なのか」が正式に確定したことといえます。従来のクラスファイルでは

  • openright:チャプタータイトルが奇数番号が付いたページに出現しさえすればよい実際にそのページが奇数ページ目かどうかには無頓着
  • openany:チャプタータイトルが成り行きのページに出現しさえすればよい(チャプタータイトルと次のページを並べたときの見た目が変でも構わない

という曖昧なものでした。これでは、本を印刷して綴じようとしたときに失敗してしまうケース(小口とノドの余白量が逆転して文字が綴じ白にかぶってしまうなど)が発生します。そこで、ページ送りが不自然な部分をすべて修正しました。

1-1. openleft オプションの追加

まず、メジャーな新機能の追加です! 従来は

  • openright(右起こし):チャプターを毎回右ページから始めるオプション
    • 横組では奇数起こし=片起こし、縦組では偶数起こし=見開き起こしを意味します。
  • openany(両起こし):チャプターを成り行き次第でどちらのページからも始めるオプション

しかありませんでした。今回のリリースで

  • openleft(左起こし):チャプターを毎回左ページから始めるオプション
    • 横組では偶数起こし=見開き起こし、縦組では奇数起こし=片起こしを意味します。

を追加しました。特に「縦組で片起こしができる」ということは、基本的ではありながら日本語には欠かせない非常に重要な機能です。

【従来:openright しかなかった】

f:id:acetaminophen:20170513192115p:plain

【新版:openleft が使える】

f:id:acetaminophen:20170513192240p:plain

なお、従来との互換性のため、book 系のデフォルトは縦組でも横組でも openright、report 系のデフォルトは openany になっています。

1-2. openany 指定時に \part のあとに白ページを入れないように修正

これは本家 LaTeX の book クラスに追随した変更です。openright / openany にかかわらず必ず「部」のあとに空白ページが挿入されていましたが、openany の場合に白ページを入れるのは不自然なので LaTeX 側で修正したということのようです。

1-3. タイトルページを必ず奇数ページ目に出力するように修正

新しいクラスでは、openright / openany / openleft の状態にかかわらず、必ずタイトルページを奇数ページ目に出力します。というのも、LaTeX のほぼすべてのクラスで「タイトルページでは必ず(内部的な)ページ番号を 1 にリセットする」と規定されているためです。ページ番号が 1、つまり奇数なのに、それが偶数ページ目に出現すると

  • 偶数ページ目なのに奇数番号が付いているので、余白量 (\oddsidemargin / \evensidemargin) がマチガッタものになる
  • タイトルを文書冒頭でなく途中に出そうとすると、タイトルの前後で実際のページ数の偶奇と付けられるページ番号の偶奇が逆転する

という問題が起きます。

これに伴う結果として、たとえば

\documentclass{tbook}
\title{タイトル}
\author{何某}
\begin{document}
\maketitle
\end{document}

の場合に、従来はタイトルページの前に空白ページが出現していましたが、新版ではこれが起きなくなりました。

1-4. 奇数レイアウトと偶数レイアウトのページが交互にならない可能性を排除

上でタイトルページについて説明しましたが、ほかにも \frontmatter\mainmatter を使うと、場合によってはページの偶奇が交互にならないことがありました。

\frontmatter\mainmatter はページ番号の書式をそれぞれ 1, 2, ... から i, ii, ... へ、またはその逆へと変更します。このとき、書式変更と同時に番号も 1 および i にリセットするのですが、このリセットはこれらの命令を使用した “その場” で起きますので、“その場” が偶数ページ目だった場合には即座にそのページが 1 すなわち奇数番号のページになってしまいました。この問題を解消するため

\frontmatter\mainmatter を発行すると、奇数ページに送ってからページ番号の書式変更とリセットを行う

としました。これで両面印刷も心配ありません。

1-5. 縦組の所属表示 \thanks の番号が寝てしまうのを修正

従来、以下のようなソースで「所属」につく注釈番号が寝ていました。

\documentclass{tbook}
\title{縦書きのテスト}
\author{著者\thanks{所属}}
\begin{document}
\maketitle
\end{document}

f:id:acetaminophen:20170528171429p:plain

これは見た目として変だということで、新バージョンでは立てました。

f:id:acetaminophen:20170528171445p:plain

1-6. トンボに日付を表示する tombow オプションの日付表示の改良

従来の標準クラスでは、トンボに表示する日付表示の桁数が揃っていませんでした。たとえば 2017 年 5 月 28 日 17 時 8 分に処理した場合

f:id:acetaminophen:20170528172305p:plain

なんだか奇妙です。一方、jsclasses のほうはというと…こちらは、ISO 8601 に定義された書式に従い、桁数が足りない場合は 0 を足していました。こちらのほうが見た目が自然だということで、標準クラスも書式を変更しました。

f:id:acetaminophen:20170528172332p:plain

以上が pLaTeX / upLaTeX 標準クラスに入った変更です。これらの変更は、最近人気の LuaTeX-ja の標準クラスにも引き継がれました。ページ送りについての変更は既存の出版物のページ数に影響しうる大きなものですが、長期的な視点でこの新バージョンが「新しい標準」となることを願います。

 

2. \strutbox の挙動変更

おそらく今回の修正の中で目玉はコレだと私は考えています*1。影響が多岐にわたるのは確かですが、特に縦組で頻発していた不可解な挙動を一気に解決しうる改善内容となりました。このブログでは既に、2016 年 9 月の記事で「実験用コードでテスト中」と説明していた内容ですが、今回正式に採用しましたので、改めて説明しておきます。

まずは、従来のおかしな例を見てみましょう。縦書きで amsmath パッケージの align 環境を使用した場合です。

\documentclass{tarticle}
\usepackage{amsmath}
\setlength{\parindent}{0cm}
\setlength{\textwidth}{8cm}
\begin{document}

align環境、\verb+&+が1つ %% 少し上へ
\begin{align}
a_1& =b_1+c_1\\
a_2& =b_2+c_2-d_2+e_2
\end{align}

align環境、\verb+&+が3つ %% 少し上へ
\begin{align}
a_{11}& =b_{11}&
  a_{12}& =b_{12}\\
a_{21}& =b_{21}&
  a_{22}& =b_{22}+c_{22}
\end{align}

align環境、\verb+&+が2つ %% 端に付く
\begin{align}
a_{11}& =b_{11}&
  a_{12}\\
a_{21}& =b_{21}&
  a_{22}
\end{align}

align環境、\verb+&+なし %% 端に付く
\begin{align}
a_1=b_1+c_1
\end{align}

\end{document}

従来の pLaTeX では、数式や数式番号の位置が行ごとにずれてしまい、いびつになっていました。

f:id:acetaminophen:20170423111101p:plain

もう一つの例は、empheq パッケージを使った大括弧の例です。

\documentclass{tarticle}
\usepackage{mdwmath}
\begin{document}
\begin{equation}
\Bigg( \sum_{n=0}^{\infty} \frac{1}{x^n} \Bigg)
\end{equation}
\end{document}

従来の pLaTeX では括弧が大きくなりませんでした(tarticle → jarticle/jsarticle のいずれかに変えて、横書きの場合と比べてみてください)。

f:id:acetaminophen:20170423111113p:plain

ほかにも「海外製の LaTeX パッケージが縦組でうまくいかない」という例は多く、そのほとんどが海外では縦組の認知度が低く、縦組が考慮されていないことに帰着します。こういう場合はどうしようもありません(諦めるしかない)。しかし、「うまくいかない」のうちの一部は、原因が pLaTeX の設計にありました。要するに、pLaTeX の設計があまり良くなかったために、余計な問題が生じていたわけです。

先に改良結果をみておきましょう。このように、pLaTeX を改修しただけできちんと数式番号が揃いました。

f:id:acetaminophen:20170423111124p:plain

括弧も大きくなっています。

f:id:acetaminophen:20170423111132p:plain

この改善の詳細を以下で説明します。

LaTeX の支柱生成コマンド

高さや深さだけを持つ「見えない箱」、すなわち支柱として、LaTeX には \strutbox というボックスが用意されています。

たとえばアルファベットでは「a」と「h」は高さが異なり、「a」と「g」では深さが異なります。括弧はもっと高さが高くなります。このような差を包括した「文字の形によらない一定の寸法」を与えるのが支柱で、その本体が \strutbox です*2

\sturtbox は、現在のフォントサイズに応じて

高さと深さが 7:3 で幅が 0 の箱

として用意され、字形によらずフォントサイズだけから決まる一定の寸法を持ちます。LaTeX では、表の各行の高さを決めたりスペースを空けたり、物を整列させたり括弧を巨大化したり…というあらゆる場所で、この支柱が活躍しています(使われている箇所は目に見えないので気づく機会はほとんどないと思いますが)。

従来の pLaTeX の支柱

さて、日本語には、縦組と横組という「組方向」の概念があります。pLaTeX では支柱に対しても組方向の概念を当てはめる必要がありますから

  • \strutbox = 横組用支柱ボックス
  • \tstrutbox = 縦組用支柱ボックス

と規定されました(なお、\tstrutbox

高さと深さが 5:5 で幅が 0 の箱

です)。そして、日本製 LaTeX パッケージが支柱を使う際には「横組では \strutbox を呼び出し、縦組では \tstrutbox を呼び出す」という運用がなされました。

pLaTeX 付属物や日本人ユーザは、ほとんどのケースで実際にこのアスキーが考案した運用方法に則っていました。ところが、pLaTeX の縦組を考慮していない海外のパッケージはそうはいきません。海外の人にとっては「支柱=\sturtboxですから、支柱が必要なら無条件に \strutbox を使ってしまうわけです。7:3 と 5:5 は大きな違いですから、これは困ったことになります。モノの高さが揃わない、括弧が想定より小さくなるといったさまざまな問題が、この pLaTeX の設計によって引き起こされる結末になりました。

新しい pLaTeX の支柱

新しい pLaTeX ではこの支柱ボックスを一新しました。

  • \ystrutbox = 横組用支柱ボックス
  • \tstrutbox = 縦組用支柱ボックス
  • \strutbox = 横組なら \ystrutbox、縦組なら \tstrutbox とみなされるボックス

このような仕様を策定しました。これで、海外の人が無条件に \strutbox を使っていても、致命的な不具合は起きないようになっています。支柱は目に見えませんが、あらゆる場所で活躍しています。「いままで縦組でスペースやサイズが変だったのに pLaTeX を更新したら揃うようになった」というケースがあれば、そこにはもしかしたら \strutbox が活躍しているのかもしれません。

 

その他の変更は次回に続きます。

*1:私自身が提案した修正であり、個人的には “\strutbox パッチ” と呼んでいます。

*2:支柱が有用な事例として、「\sqrt{g} と \sqrt{h} で根号の高さがいびつになるのを防ぐ」というのがあります → 吉永さんの LaTeX 入門