マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

LaTeX に新しいフォントを持ち込む練習

「マルベリでないフォントの話」で、CM Sans Serif Quotation Style の話をして、それが既定では NFSS でサポートされていないということを述べた。「LaTeX へのフォントの持ち込み」の練習として、これをファミリ cmssq で使えるようにしてみよう。要件は以下の通り。

  • 次の 2 つのフォント(TFM)が存在する。エンコーディングは OT1。
    • cmssq8 : CM Sans Serif Quotation Style
    • cmssqi8 : CM Sans Serif Quotation Style Slanted
  • これらのデザインサイズは 8pt であるが、他のデザインサイズのものは存在しないので、「オプティカルサイズ」でない(全てのサイズで相似の字形を用いる)フォントとして扱う。
  • \upshape(直立体)を cmssq8、\slshape(斜体)を cmssqi8 に対応させる。
  • さらに、\itshape(イタリック)が指定された場合は斜体で代用する。

\upshape に対応する NFSS のシェープの値は n、\slshape は sl、\itshape は it である。((これはマクロ \updefault の値を調べれば解る。つまり、このマクロの定義を変えればこれらの総称命令の意味を変えることが可能であるが、実際にはそういうことはまず行われない。))

「持ち込む話」の教えに従えば次のようなファイル ot1cmssq.fd を作るところまではできる。*1

[ot1cmssq.fd]
\DeclareFontFamily{OT1}{cmssq}{}
\DeclareFontShape{OT1}{cmssq}{m}{n}{<->cmssq8}{}
\DeclareFontShape{OT1}{cmssq}{m}{sl}{<->cmssqi8}{}

あと必要なのはイタリック(OT1/cmssq/m/it)を斜体(OT1/cmssq/m/sl)で「代替する」という設定だけである。OT1/cmssq/m/sl と同じにするので

\DeclareFontShape{OT1}{cmssq}{m}{it}{<->cmssqi8}{}

でいいと思うかもしれない。実際のところはこれで何の問題もなく動作するのであるが、「代替する」ということを明確に表すための書き方がありそれを使うのが通例である。TFM 名の代わりに ssub*<代替先> のように書く。*2これを用いると次のように書ける。

\DeclareFontShape{OT1}{cmssq}{m}{it}{<->ssub*cmssq/m/sl}{}

もしこれを書かないと、現在のフォント指定が OT1/cmssq/m/it になった場合には警告が表示されて OT1/cmssq/m/n で代替される。((この暗黙の代替先の指定は \DeclareFontSubstitution{OT1}{cmr}{m}{n} という指定が為されているからである。つまり、OT1 で無効な指定(OT1/cmssq/m/it)があった場合は、シェープを n に変える(OT1/cmssq/m/n)。今はここで有効な指定が得られたが、仮にこれも無効だったら今度はシリーズを m に変えて、それも無効ならファミリを cmr に変える。それでもダメなら…「存在しないものを暗黙の代替にしている」ことになってしまうので「NFSS が変だ!」というエラーが出る。))他の設定値についても、警告が出るのが嫌なら明示的な代替設定を加えておけばよい。といっても有りとあらゆる値に対して代替設定することは無理なので適当な落とし所をとることになる。例えば、シリーズが bx(太字;\bfseries)になることは頻出するので、これは明示設定(同じシェープの m シリーズで代替)した方がいいかも知れない。

\DeclareFontShape{OT1}{cmssq}{bx}{n}{<->ssub*cmssq/m/n}{}
\DeclareFontShape{OT1}{cmssq}{bx}{sl}{<->ssub*cmssq/m/sl}{}
\DeclareFontShape{OT1}{cmssq}{bx}{it}{<->ssub*cmssq/m/it}{}

それでは、完成した ot1cmssq.fd を配置(カレントでよい)した上で CM Sans Serif Quotation の例として挙げた「The TeXbook」の引用句の組版LaTeX で再現してみよう。*3

\documentclass[a4paper]{article}
\begin{document}
\begin{flushright}
% OT1/cmssq/m/it の 8pt(行送り 10pt)を指定
\fontfamily{cmssq}\slshape\fontsize{8}{10}\selectfont
They do certainly give\\
very strange and new-fangled names to diseases.
\par\smallskip
\upshape  % 次行の「書名」部はわざと \textsl でなく \textit にしてみる
--- PLATO, \textit{The Republic}, Book 3\enskip (c.\ 375 B.C.)
\end{flushright}
\end{document}

無事に件の記事の画像と同じものが出力されれば成功である。

\DeclareFontShape の「TFM 名」の箇所には色々な指定があるが、本当に TFM 名を書く形式と「ssub*」形式が実際の使用の大多数を占めると思う。*4これ以外で時々使われるのがスケール指定を伴う TFM 指定である。例えば、cmssq8 を「実際に指定されたサイズの 95 %で出力される」ようにしたい場合は次のような書き方をする。

\DeclareFontShape{OT1}{cmssq}{m}{n}{<->s*[0.95]cmssq8}{}

この場合、OT1/cmssq/m/n の 10pt を指定した場合、cmssq8 at 9.5pt が使われることになる。

*1:シリーズは 1 つしかないので m でいいだろう。デザインサイズの値は関係しない。

*2:代替先はシェープから書き始める。エンコーディングが異なるものは代替できるはずがないからである。

*3:勿論 Knuth が使っているのは plain TeX である。

*4:全容に関心のある人は「texdoc fntguide」を実行してみよう。