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

Acetaminophen’s diary

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

新しい pLaTeX / upLaTeX 2016/11/29 版の解説

昨日リリースした最新のコミュニティ版 pLaTeX / upLaTeX (2016/11/29) について解説します。

フォーラムにおける告知は forum:2081 です。

今回はめずらしく機能拡張にあたる変更が入っている点が魅力です。数式アルファベットを多種類(ローマン、イタリック、タイプライタ、ボールド、ボールドイタリック、カリグラフィ、黒板、…)使用したい場合にありがたい変更なのではないでしょうか。

f:id:acetaminophen:20161130073817p:plain

目次

なお、前回の記事 (2016/09/03, 2016/09/08) はこちら。

 

1. 数式ファミリの上限を 16 から 256 に増加

LaTeX では、長らく「利用可能な数式ファミリは16種類まで」という制約がありました。しかし、2015/01/01 の「LaTeX の大規模改修」に伴い、XeLaTeX と LuaLaTeX においては「数式ファミリは256種類まで使える」という拡張が施されました。これは、XeTeX と LuaTeX にそれぞれ数式ファミリをたくさん扱えるようにする拡張が施されていることに着目し、「使えるなら LaTeX でも是非使おう!」という意図のようです。

実は、この「数式ファミリをたくさん扱える拡張」は e-pTeX や e-upTeX にも実装されています。これは通称「FAM256 パッチ」とよばれるもので、詳細は eptexdoc.pdf という文書(texdoc eptexdoc で読むことができますし、Web で検索しても同じ文書が見つかります)に説明されています。日本で使われている pLaTeX と upLaTeX は、5年ほど前から(アスキーがもともと開発した pTeX ではなく)それぞれ e-pTeX や e-upTeX をエンジンとして動作するマクロパッケージになっていますから、pLaTeX や upLaTeX の側でちょっとコードを書き足すだけで「pLaTeX や upLaTeX でも簡単に数式ファミリを256種類使える」という恩恵が得られるようになっていました。そういうわけで今回、2016/11/29 版にこのコードを導入しました。

例を見てみましょう。もともと LaTeX 本体では数式ファミリが7種類定義されていて、そこに数式フォントを変えるパッケージを読みこんだり自分で新たに宣言したりしようとすると、16種類を超えてしまう場合があります。この場合、従来の pLaTeX / upLaTeX ではエラーが出ます。

\documentclass{article}
\usepackage{amsfonts,amssymb}
\usepackage[mathscr]{euscript}
\DeclareSymbolFont{bsymbols}{OMS}{cmsy}{b}{n}
\DeclareMathAlphabet{\mathrs}{U}{rsfso}{m}{n}
\DeclareMathAlphabet{\mathbbx}{U}{bbold}{m}{n}
\DeclareMathAlphabet{\mathbit}{OT1}{cmr}{bx}{it}
\DeclareMathAlphabet{\mathbsf}{OT1}{cmss}{bx}{n}
\DeclareMathAlphabet{\mathtm}{OT1}{ptm}{m}{n}
\DeclareMathAlphabet{\mathbtm}{OT1}{ptm}{bx}{n}
\DeclareMathAlphabet{\mathdh}{OT1}{cmdh}{m}{n}
\begin{document}

$
1+2\left(\sum\limits_0^nx_i\right\}
A
\mathit{A}
\mathbit{A}
\mathtt{A}
\mathsf{A}
\mathbsf{A}
\mathrm{A}
\mathbf{A}
\mathscr{A}
\mathbb{A}
\mathbbx{A}
\mathcal{A}
\mathfrak{A}
\mathrs{A}
\mathtm{A}
\mathbtm{A}
\mathdh{A}
$

\end{document}
! LaTeX Error: Too many math alphabets used in version normal.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H   for immediate help.
 ...

l.29 \mathrs{A}

? 

しかし、最新の pLaTeX や upLaTeX の 2016/11/29 なら大丈夫です。

f:id:acetaminophen:20161130073817p:plain

2015/01/01 以降の LaTeX がインストールされた環境(=TeX Live 2015 以降)であれば、XeLaTeX や LuaLaTeX でも大丈夫なわけですが、これに pLaTeX / upLaTeX も追いついたと言えるでしょう(なお、pdfTeX には数式ファミリ拡張が存在しないため、pdfLaTeX で同じソースを処理するとエラーが出ることに変わりはありません)。

なお、より詳細な解説を下のほうに付けておきますので、興味のある方はどうぞ。

 

2. 標準クラス jclasses / ujclasses の本家 classes への追随

jarticle や jbook、tarticle といった「pLaTeX2e 標準クラス」は、もともとアスキーによって作られましたが、そのベースとされたのはもちろん本家 LaTeX の classes(article、book、report)です。1996年頃に jclasses の大枠は完成していたため、その頃に本家 classes に潜んでいたバグや不都合な挙動のいくつかが、現在まで残存してしまっていました。

わかりやすいバグの例をひとつあげます。

\documentclass{jarticle}

\setcounter{tocdepth}{99}
\setcounter{secnumdepth}{99}

\begin{document}

\tableofcontents

\part{Part}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\paragraph{Paragraph}
\paragraph{Paragraph}                % BAD
\part{Part}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\paragraph{Paragraph}
\paragraph{Paragraph} Text.          % OK
\part{Part}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\paragraph{Paragraph}
\subparagraph{Subparagraph}
\subparagraph{Subparagraph}          % BAD
\part{Part}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\paragraph{Paragraph}
\subparagraph{Subparagraph}
\subparagraph{Subparagraph} Text.    % OK
\part{Part}
\section{Section}
\subsection{Subsection}
\subsubsection{Subsubsection}
\paragraph{Paragraph}
\subparagraph{Subparagraph}
\end{document}

最初のページ(目次)や次のページを見てみると、Part のところで目次の順番の入れ替わりや改段落が起こらない問題に気づきます。

f:id:acetaminophen:20161130080802p:plain

f:id:acetaminophen:20161130081017p:plain

これらは、本家 classes では1999年に修正されていたバグです。なんと17年間もひどいバグが温存されていたことに…というわけで、このようなバグをいくつも修正しました。

f:id:acetaminophen:20161130081110p:plain

f:id:acetaminophen:20161130081120p:plain

なお、jarticle などは(奥村さんの jsclasses に比べて)有名な「ちょっとチェックしちゃった」のような連続する小さな仮名文字が詰まるという問題(min10 メトリックの問題)がありますが、このような挙動については修正対象としませんでした。あくまで「本家 LaTeX のバグに由来する温存されてきたバグ」だけを直したということに注意してください。

 

3. plext のバグ修正と本家 LaTeX への追随

plext パッケージについても先ほどの jclasses の件と同様で、LaTeX の修正に追随しました。とりわけ目立ったバグではなく、少し変わった使い方をした場合に露呈するバグがほとんどですが、念のためすべて洗い出しを行いました。

また、plext パッケージ独自の \rensuji 命令にもバグがありました。縦組で連数字を出力するときに効果を発揮する \rensuji 命令ですが、一応横組でも用いることができます(数字は横並びなので、実質「何もしない」に等しいですが)。…と思ったら、横組で段落頭に \rensuji 命令を置くとおかしな挙動になっていました。

f:id:acetaminophen:20161130081911p:plain

これはバグでしょうから、今回修正しました。

 

まとめと今後の pLaTeX / upLaTeX について

今後の pLaTeX / upLaTeX がどうなっていくのかは、はっきりしたことはまだ決まっていません。少なくとも私の考えとしては以下にまとめたとおりです。

大雑把には、LaTeX への追随と古くからある pLaTeX の不都合な挙動を再検討する必要があるでしょう。特に、縦組関連で既に exppl2e パッケージに「アクセント文字パッチ」と「\strutbox パッチ」が導入されていますし、plext パッケージは改修が必要であると考えられます。TeX Live 2017 の頃までには検討を進める必要があると思います。すべての開発活動は GitHub:texjporg/platex で行われていますので、興味のある方は覗いてみてください。また、exppl2e パッケージを使用した「テスト版 pLaTeX / upLaTeX」へのご協力も、引き続きお願いします。

 

参考:数式ファミリの上限についての詳細分析

には簡単のためパッケージを読み込んだ例を示しましたが、もう少し「上限」がわかりやすいようにすると以下のようなソースが考えられます。LaTeX でもともと定義されている7種類の数式ファミリ(シンボルフォントが4種類、アルファベットフォントが3種類)も、説明のためコメントアウトして載せてあります。

\documentclass{article}
% 以下は fontmath.ltx でフォーマットに組込済み
% *** \DeclareSymbolFont は宣言した時点で既にファミリを一つ消費 ***
%\DeclareSymbolFont{operators}{OT1}{cmr}{m}{n}     % => 1
%\DeclareSymbolFont{letters}{OML}{cmm}{m}{it}      % => 2
%\DeclareSymbolFont{symbols}{OMS}{cmsy}{m}{n}      % => 3
%\DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n} % => 4
%\SetSymbolFont{operators}{bold}{OT1}{cmr}{bx}{n}
%\SetSymbolFont{letters}{bold}{OML}{cmm}{b}{it}
%\SetSymbolFont{symbols}{bold}{OMS}{cmsy}{b}{n}
%\DeclareSymbolFontAlphabet{\mathrm}{operators}
%\DeclareSymbolFontAlphabet{\mathnormal}{letters}
%\DeclareSymbolFontAlphabet{\mathcal}{symbols}
% *** \DeclareMathAlphabet は使用時に初めてファミリを一つ消費 ***
%\DeclareMathAlphabet{\mathbf}{OT1}{cmr}{bx}{n}
%\DeclareMathAlphabet{\mathsf}{OT1}{cmss}{m}{n}
%\DeclareMathAlphabet{\mathit}{OT1}{cmr}{m}{it}
%\DeclareMathAlphabet{\mathtt}{OT1}{cmtt}{m}{n}
\DeclareMathAlphabet{\mA}{OT1}{pcr}{m}{n}
\DeclareMathAlphabet{\mB}{OT1}{pcr}{m}{it}
\DeclareMathAlphabet{\mC}{OT1}{pcr}{b}{n}
\DeclareMathAlphabet{\mD}{OT1}{pcr}{b}{it}
\DeclareMathAlphabet{\mE}{OT1}{ptm}{m}{n}
\DeclareMathAlphabet{\mF}{OT1}{ptm}{m}{it}
\DeclareMathAlphabet{\mG}{OT1}{ptm}{b}{n}
\DeclareMathAlphabet{\mH}{OT1}{ptm}{b}{it}
\DeclareMathAlphabet{\mI}{OT1}{pag}{m}{n}
\DeclareMathAlphabet{\mJ}{OT1}{pag}{m}{it}
\DeclareMathAlphabet{\mK}{OT1}{pag}{b}{n}
\DeclareMathAlphabet{\mL}{OT1}{pag}{b}{it}
\DeclareMathAlphabet{\mM}{OT1}{pbk}{m}{n}
\DeclareMathAlphabet{\mN}{OT1}{pbk}{m}{it}
\DeclareMathAlphabet{\mO}{OT1}{pbk}{b}{n}
\DeclareMathAlphabet{\mP}{OT1}{pbk}{b}{it}

\begin{document}
$
\mathrm{X}
\mathnormal{X}
\mathcal{X}
\mathbf{X}                                         % => 5
\mathsf{X}                                         % => 6
\mathit{X}                                         % => 7
\mathtt{X}                                         % => 8
\mA{X}                                             % => 9
\mB{X}                                             % => 10
\mC{X}                                             % => 11
\mD{X}                                             % => 12
\mE{X}                                             % => 13
\mF{X}                                             % => 14
\mG{X}                                             % => 15
\mH{X}                                             % => 16
\mI{X}                                             % => 17
\mJ{X}                                             % => 18
\mK{X}                                             % => 19
\mL{X}                                             % => 20
\mM{X}                                             % => 21
\mN{X}                                             % => 22
\mO{X}                                             % => 23
\mP{X}                                             % => 24
$
\end{document}

従来の pLaTeX / upLaTeX(や現行の pdfLaTeX)で処理してみると17番目のフォントを使おうとしたときにエラーが出ます。

! LaTeX Error: Too many math alphabets used in version normal.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H   for immediate help.
 ...

l.53 \mI{X}
                                                        % => 17
? 

このことから、通常の上限が16であることが裏付けられます。新しい pLaTeX / upLaTeX では、上のソース(24ファミリ使用)を難なく処理できます*1

f:id:acetaminophen:20161130080751p:plain

なお、今回の拡張で可能となったのは \DeclareMathAlphabet の多用のみとなっています。\DeclareSymbolFont は依然として16個までしか利用できませんが、これは現在の LuaLaTeX などでも同じで、「LaTeX の方針として標準でシンボルフォントをたくさん使える状態にするのは、変更が大規模になるし、やりすぎである」という判断がなされているようです。したがって、pLaTeX / upLaTeX としても標準では拡張を行いませんでした。

*1:シンボルフォントとして定義されている largesymbols 由来のアルファベットを印字していないので、図にはこれを除いた「X」が23個現れています。