Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2016-06-24

例の \selectfont のアレ

アレ。

どういう方針になるかはわからないが、取りあえずソレっぽいコードを書いてみた。

2016-06-23

もっともっと数式フォントできない話(1)

例の「チョット数式フォントしてみる話」の途中で、「数式フォントの個数の上限」についてチョット触れた。次の制限のことである。

数式フォントは 16 個しか登録できない。

つい最近、某フォーラムでもこの制限に関する議論があったところである。

ところで、この「16 個」という制限は、実際はもう少し話が複雑である。例の一連の記事で数式フォントの設定の基礎を習得したところなので、もう少し精密な説明をしてみようと思う。*1

TeX が数式フォントする話

LaTeX の数式フォントの上限は 16 個」であるそもそもの理由は「“TeX の数式フォント”の上限は 16 個」であることである。そこでまずは“TeX の数式フォント”について概説する。

TeXフォントの話(復習)

まずは TeXフォントの扱い方について復習しようj。LaTeX が NFSS というやや複雑なフォント管理の機構を備えているのに対し、TeX 自体のフォント管理は非常に単純なものである。すなわち、「CM Funny Italic の 20pt」というように具体的なシェープとサイズが決まったものが「TeXフォント」であり、\font プリミティブを用いて「フォントを表すトークン(fontdef トークン)」を定義するのであった。

%"CM Funny Italic の 20pt"を \ahofont として定義
%※"CM Funny Italic" の TFM 名が cmfi10
\font\ahofont=cmfi10 at 20pt

つまり、TeX にとっては、同じシェープであってもサイズが異なるものは“全く異なるフォント”と扱われることに注意しておこう。

TeX の数式ファミリの話

ところがこの扱い方では数式を組むのには都合が悪い。数式中では添字として「同じシェープの小さいサイズ」のものを使う必要があるからである。

f:id:zrbabbler:20160621021339p:image

そこで、TeX の数式モードでは「同じシェープのサイズの異なる 3 種類のフォント(標準、添字用、二重添字用)」を一まとめにして扱っている。これを「数式ファミリ(math family)」と呼ぶ。TeX では 16 個の数式ファミリのレジスタを持っていて、これには 0〜15 の番号がついている。そして、数式中で“フォントを指定する”必要がある場合は、個々のフォント(fontdef トークン)ではなく「数式ファミリのレジスタ番号」により指定する、という方式を採っているのである。

ここから解るように、数式中の文字として使えるフォントは、数式ファミリのレジスタに設定したものに限られる。そしてこの制限こそが、「“TeX の数式フォント”の上限は 16 個」の意味するところなのである。

TeX で実際に数式ファミリする話

もう少し具体的な例として、plain TeX において「アホな数式」を出す話をする。

plain TeX の既定では、数式フォントレジスタには次のようにフォントが割り当てられている。

ファミリ標準
\textfont
添字
\scriptfont
二重添字
\scriptscriptfont
備考
0cmr10cmr7cmr5“operators”/\rm
1cmmi10cmmi7cmmi5“letters”/\mit
2cmsy10cmsy7cmsy5“symbols”/\cal
3cmex10cmex10cmex10“largesymbols”
4cmti10\it
5cmsl10\sl
6cmbx10cmbx7cmbx5\bf
7cmtt10\tt
8〜15(未使用)

例えばこの中でファミリ 6 は「CM Bold Extended Roman」が入っている。数式中で \fam6 という命令を実行することで(数式英字が)当該のフォントに切り替わる。*2

$a^2 + {\fam6 a^2}$
f:id:zrbabbler:20160623015108p:image

それでは、今は空いているファミリ 8 に“アホなフォント”(CM Funny Italic; TFM 名は cmfi10)のファミリを割り当ててみよう。まずは所望のサイズの cmfi10 の fontdef トークン\font 命令で定義する。*3

% フォントの定義
\font\tenaho=cmfi10           % 標準(10pt)
\font\sevenaho=cmfi10 at 7pt  % 添字用(7pt)
\font\fiveaho=cmfi10 at 5pt   % 二重添字用(5pt)

次にこれらの fontdef トークンをファミリ 8 のレジスタに代入する。これには次のような代入文を用いる。

% 数式ファミリ8の設定
\textfont8=\tenaho            % 標準
\scriptfont8=\sevenaho        % 添字用
\scriptscriptfont8=\fiveaho   % 二重添字用

これらの準備を行った後に数式中で \fam8 を実行すると、無事にフォントが「CM Funny Italic」に切り替わる。

$N = {\fam8 3^{3^3} = 3^{27} < 3^{33}}$
% '=' や '<' はアホになっていないことに注意
f:id:zrbabbler:20160623015537p:image

ただし、先の出力を見て判るように、フォントが変わるのは“数式英字”に限られる。これは LaTeX で数式フォント命令を用いた場合と同じである。

チョット補足
  • 数式ファミリレジスタに現在割り当てられているフォントが何かを知りたい場合は、\fontname プリミティブを利用できる。例えば \fontname\textfont6 を展開すると、ファミリ 6 の標準のフォントの名前である「cmbx10」という \the-文字列になる。
  • 一つの数式の途中で数式ファミリへの割当内容を変更することはできない。*4これに対して、数式モードの外でレジスタの値を変更することで、異なる数式が異なるフォントのセットを使う、ということは可能である。(つまり“文書全体”では 16 個より多くのフォントを用いることができる。)例えば、先述の plain TeX の設定は、明らかに「本文のフォントサイズが 10pt である」ことを前提としている。もし文書の脚注フォントサイズ 8pt で組んでいてその中でも数式を出力したい、という場合は、数式ファミリの設定を「フォントサイズが 8pt」に適したもの*5に変更する必要がある。LaTeX においては、テキストのフォントサイズを変更した場合に数式ファミリレジスタの値を自動的に追随させて“適切なサイズの fontdef”に変えている。*6
  • 「数式ファミリ」について、Knuth 自身は単に「ファミリ(family)」という用語を用いている。しかしこれは NFSS の「フォントファミリ(font family)」という用語と紛らわしい。*7このため本記事では「数式ファミリ」という用語を採用した。
(つづけ)

*1:従って、「チョット数式フォントしてみる話」の一連の記事を読んでいることを前提とする。もちろん、“無慈悲な大前提”はここでも課される。

*2:ちなみに、ファミリ 4 のように添字のフォントが未割当の場合、${\fam4 a^2}$ のような添字を含む数式を出力しようとするとエラーになる。

*3:10pt 用の cmfi10 だけがあって cmfi7 等はないので、cmfi10 を縮小して用いることになる。

*4:正確にいうと、数式の途中で数式ファミリレジスタへの代入はできるが、当該の数式モードを終了した時点でのレジスタの内容が数式全体に適用される。

*5:例えば \textfont0 = cmr8、\scriptfont0 = cmr6、など。

*6:実際には数式モードの開始時に(\everymath フックを利用して)この“追随”の作業を行っているようである。(先の脚注に書いたように、数式モードの開始時に変更すればその数式には変更が適用される。)

*7:もちろん「数式ファミリ」は TeX 言語の概念であり LaTeX とは無関係である。ちなみに LaTeX では、用語の混乱を避ける為か、TeX の「(数式)ファミリ」のことを「数式グループ(math group)」という別の用語で呼んでいる。しかし「グループ(group)」も (La)TeX で別の意味がある用語なので、自分はあまり適切でないと思う。

2016-06-18

とある LuaTeX クイズの正解

\documentclass{article}
\begin{document}
{\pi} = \directlua{tex.write(math.pi)}
\end{document}

正解を発表しよう

もちろん、\directlua 云々のところはヒッカケであって、正解は……。

\pi のところで「! Missing $ inserted.」エラーが出る。

……のはず。

念のため確認しよう

当該のソースファイル quiz.tex を lualatex でコンパイルしてみよう。

This is LuaTeX, Version 0.95.0 (TeX Live 2016/W32TeX)
 restricted system commands enabled.
(./quiz.tex
LaTeX2e <2016/03/31> patch level 1
Babel <3.9r> and hyphenation patterns for 1 language(s) loaded.
……(中略)……
(see the transcript file for additional information)
 346 words of node memory still in use:
   2 hlist, 1 vlist, 1 rule, 7 glue, 39 glue_spec, 1 write nodes
   avail lists: 2:12,3:2,4:1,5:10,6:19,7:24,8:1,9:6
<c:/texlive/2016/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on quiz.pdf (1 page, 11794 bytes).
Transcript written on quiz.log.

……あれれ、通った?

f:id:zrbabbler:20160618233157p:image

でも〈π〉の文字は出力されてないようだ。

さらに補足

さらに、quiz.tex を次のように書き換える。

\documentclass{article}
\begin{document}
$a = 42$\par
{\pi} = \directlua{tex.write(math.pi)}
\end{document}

コンパイルする。

This is LuaTeX, Version 0.95.0 (TeX Live 2016/W32TeX)
 restricted system commands enabled.
(./quiz.tex
LaTeX2e <2016/03/31> patch level 1
Babel <3.9r> and hyphenation patterns for 1 language(s) loaded.
……(中略)……
(see the transcript file for additional information)
 346 words of node memory still in use:
   2 hlist, 1 vlist, 1 rule, 7 glue, 39 glue_spec, 1 write nodes
   avail lists: 2:12,3:2,4:1,5:10,6:19,7:24,8:1,9:6
<c:/texlive/2016/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb><c:/texli
ve/2016/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on quiz.pdf (1 page, 19283 bytes).
Transcript written on quiz.log.
f:id:zrbabbler:20160618233841p:image

あれれ、今度は〈π〉もしっかりと出力された。

世の中なかなか思う通りにならないですね。


*「何でなんでナンデ!?」
ZR「まあ、LuaTeX のことだから仕方がないね」*1

*1:気になる人は LuaTeX マニュアルの 6 節の「Allowed math commands in non-math modes」を読んでみよう。

2016-06-16

チョット数式フォントしてみる話(補足)

前回の続き)

もっともっと知りたい人は

以上で、数式フォントの設定を行うための必要最低限となる、チョットの解説を終えることにする。

数式フォントについてもっともっと知りたいアレな人は、LaTeX の配布物に含まれる公式のマニュアルを読もう。

  • LaTeX2e font selection (CTAN)
    TeX Live 環境であれば「texdoc fntguide」で同じ文書が開く。
    この中の 3 節「Math fonts」が数式フォントの解説である。

ん? でも NFSS についてよく理解している(“無慈悲な大前提”を満たす)人なら、この文書は当然読んでいるような気がするぞ? あれっ、だったらこの一連の記事はそもそも要らなかったのでは……。

LaTeX の既定の設定を知りたい人は

LaTeX における既定の数式フォントの設定を知るには、LaTeX の実装ソース(これは source2e.pdf という PDF 文書として配布されていて、「texdoc source2e」で開ける)を見るのが手っ取り早い。source2e.pdf においては「The fontmath.ltx file」の節(第 40 節あたり)が相当する。

ちなみに、節タイトルを見て判るように、数式フォント設定の部分の(“strip した”)ソースは、latex.ltx の中に含まれるのではなく、fontmath.ltx という別のファイルになっている。

おわりに

皆さん、幸せになりましょう。

演習問題⑦

LaTeX の標準の数式フォントではラテン文字ギリシャ文字が使えるが、非常に残念なことに、キリル文字には対応していない。そこで、キリル文字の数式フォントを定義して、以下のような数式を出力しよう。

(細部の仕様については各自の設計に任せる。)

f:id:zrbabbler:20160608100031p:image

演習問題⑧

LaTeX の標準の設定では、ギリシャ文字の小文字はイタリックしか使えない。newtxmath などの数式フォントパッケージではギリシャ小文字の直立体をサポートしていて、例えば \alphaup で直立体の〈α〉を出力できる。しかしラテン文字\mathrm\mathit で書体を変更するのと比べると、別の命令で対応するのは一貫性に欠ける。

この点を是正して、\mathrm\mathit といった数式英字フォント命令により数字・ラテン文字ギリシャ文字の全ての書体を指定できるような命令の体系を実現するための方法論について考察してみよう。

f:id:zrbabbler:20160616021940p:image

2016-06-15

BXjscls の新しいやつ(v1.1e)

CTAN に上がったのが先月(2016年5月)末なので大分時間が経ってしまったが……。

\subtitle の定義の衝突の回避

(1.1e 版での改修。)

コレへの対策。

すなわち、プレアンブルで \newcommand{\subtitle} があっても重複定義のエラーにならないようにした。

ただしこの“代償”として、「\subtitle\title より後に実行する必要がある」という制限が加わった。*1どうしても先にサブタイトルを設定したい場合は、\subtitle の代わりに \jsSubtitle 命令を用いるとよい。

※ちなみに、LaTeX を Pandoc から呼び出される場合は、Pandoc モードを利用したほうがよいだろう。

PDF 文字列中の BMP 外の文字の取扱

(1.1d 版での改修。)

BXJS クラスでは、hyperref が読み込まれた場合に、PDF 文字列文字コードについて自動的に適切な設定が行われるようになっている。ところが、以前の版では、エンジンが upLaTeX の場合に BMP 外の文字が化けてしまう。

% upLaTeX 文書; 文字コードUTF-8
\documentclass[uplatex,dvipdfmx,a4paper,
  ja=standard,jafont=moga-mobo]{bxjsarticle}
\usepackage[colorlinks]{hyperref}
\begin{document}
\section{限りなく透明に近い𠮷野家}
\end{document}
f:id:zrbabbler:20160615021536p:image

新しい版では、比較的新しい TeX 環境であれば、特に何も設定しなくても BMP 外の文字が正しく扱えるようになっている。

f:id:zrbabbler:20160615021535p:image
bigcode オプション

upLaTeX において PDF 文字列中の BMP 外文字を扱うには、「UTF8-UTF16」という名前のファイルが TeX 環境にインストールされている必要がある。次のコマンドを実行して何らかのパス名が出力されればインストールされていることが判る。

kpsewhich -format=cmap UTF8-UTF16

そして、BXJS クラスでは、「UTF8-UTF16」ファイルが存在する場合にそれを利用して BMP 外文字を扱えるようにするため、次のオプションを用意している。*2

  • bigcode: 「UTF8-UTF16」を利用する。BMP 外の文字を扱えるようになるが、「UTF8-UTF16」が存在しない場合は失敗する(dvipdfmx の実行でエラーが発生する)。「UTF8-UTF16」がインストールされている場合はこちらの指定が望ましい。
  • nobigcode: 「UTF8-UTF16」を利用しない。ゆえに BMP 外の文字は扱えない。「UTF8-UTF16」がインストールされていない場合はこちらを指定する必要がある。

無論、「UTF8-UTF16」がインストールされているかを自動的に判断するのが理想的であるが、その判定は非常に困難なので*3、ユーザが自分で判断して設定できるようにオプションを設けているのである。その上で、デフォルトの値を次のようにしている。

TeX エンジンのバージョンが(2014 年 1 月リリースの)3.14159265 以上であるならば、(「TeX 環境が新しいので UTF8-UTF16 がきっとあるだろう」という推定の上で、)bigcode を既定にする。それ以外は nobigcode を既定にする。

もちろん、TeX のバージョンと UTF8-UTF16 の存在には本来は何の関係もなく、“新しさ”を判定するアドホックな手段に過ぎない。TeX Live の場合、2014 以降で bigcode が既定となるが、実際は、upTeX が使える(2012 以降)ならば UTF8-UTF16 も存在するはずである。既定の値が不都合な場合は明示的に (no)bigcode のオプションを指定してほしい。

hyperref の unicode オプションの自動有効化

(1.1d 版での改修。)

これも hyperref 使用下の PDF 文字列に関する話であるが、BXJS クラスでは、hyperref が読み込まれた場合の unicode オプションについて、前もって次のような設定を行っている。(hyperref が読み込まれない場合は影響しない。)

  • (u)pLaTeX では unicode を無効に“固定”する。*4
  • pdfLaTeX では unicode を既定で有効にする。
  • LuaLaTeX では unicode を有効に“固定”する。

残るは XeLaTeX であるが、1.1d 版での改修においてこの場合の挙動が変更される。

  • 旧来の版では何も設定しなかった。つまり unicode は既定で無効になる。
  • 新しい版では、XeTeX のバージョンが 0.99992 版以降の場合に限り unicode を既定で有効にする。そうでない場合は何も設定しない。
詳細

実は XeTeX の場合、unicode が有効と無効のどちらの場合にも(内部動作は大きく異なるが)PDF 文字列を(仕様上は)正しく扱うことができる。だから、この改修についてはユーザはあまり気にする必要はない。「本来は unicode を有効にする方が好ましい」ので、“新しい環境”については有効にした、と考えればよいだろう。実際には、unicode が無効の場合には以前に紹介したバグの影響で BMP 外の文字を正しく扱えないという問題があるので、その対策としても、unicode を有効化したほうが得である。

*1:要するに、「\title が実行された」時点で \subtitle 命令を(未定義ならば)定義している。

*2:なお、「bigcode」の名前は pxjahyper パッケージの同名のオプションに由来する。

*3:「UTF8-UTF16」は dvipdfmx が利用するファイルなので、TeX からは元々“見えない”のである。

*4:つまり、hyperref のオプション\hypersetupunicode(=true) が指定されてもその指定は無視される。unicode を無条件に有効化しているテンプレートに対する対策。