マクロツイーター

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

エンコーディング定義の改変はやっぱりアレな感じ (1)

先日、kerkis パッケージの中身を調べていたら、次のように、OT1 エンコーディングの定義を改変するコードを見つけた。

\DeclareTextSymbol{\textperthousand}{OT1}{137}
\DeclareTextSymbol{\textsterling}{OT1}{163}
\DeclareTextSymbol{\L}{OT1}{6}
\DeclareTextSymbol{\i}{OT1}{17}
\DeclareTextSymbol{\j}{OT1}{18}
\DeclareTextSymbol{\l}{OT1}{7}
\DeclareTextSymbol{\textexclamdown}{OT1}{161}
\DeclareTextSymbol{\textgreater}{OT1}{`\>}
\DeclareTextSymbol{\textless}{OT1}{`\<}
\DeclareTextSymbol{\textquestiondown}{OT1}{191}

さらに、txfonts パッケージの中身を調べていたら、そこでも同様のコードが見つかった。

\re@DeclareTextSymbol{\L}{OT1}{138}
\re@DeclareTextSymbol{\l}{OT1}{170}
\re@DeclareTextSymbol{\textdollar}{OT1}{36}
\re@DeclareTextSymbol{\textsterling}{OT1}{163}
\re@DeclareMathSymbol{\mathsterling}{\mathord}{operators}{163}
%\def\mathsterling{\mathit{\mathchar"70A3}}

\DeclareTextComposite{\r}{OT1}{A}{197}
\DeclareTextComposite{\r}{OT1}{a}{229}

\re@DeclareTextSymbol{\textcent}{OT1}{162}
\re@DeclareMathSymbol{\mathcent}{\mathord}{operators}{162}

LaTeX の機能を拡張する目的で、その内部コードを改変することは広く行われている(そしてそれによる悪影響である「パッケージの衝突」も多くの人が経験しているだろう)。しかしそれでも、この類のエンコーディングの定義の改変については、私は強い違和感を感じている。「XXX フォントを使うためのパッケージ xxx」がこのように OT1 への改変を行う動機は、XXX フォントで用いられる「OT1 エンコーディング」が真の OT1 とは異なる部分があり、それに適応させるためだと考えられる。しかし、テキストフォントの場合、xxx パッケージを読み込んだ場合でも、「本来の OT1 エンコーディング」のフォントが用いられる可能性は存在している。従って、OT1 の定義に非互換な改変を加えた場合、「本来の OT1 のフォント」の処理に本質的な矛盾を抱えてしまうことになるのである。

例えば、上記の txfonts の定義の場合、ファミリを txfonts 以外のもの(例えば cmr)に切り替えたときに明らかな悪影響が出る。

\documentclass[a4paper]{article}
\usepackage{txfonts}
\begin{document}
\newcommand\SampleText{{\L}ukasiewicz \r{a}ngstrom\quad
\$1 = \pounds0.6\quad \textit{\$1 = \pounds0.6}}
OT1/txr: {\usefont{OT1}{txr}{m}{n} \SampleText}\par
OT1/cmr: {\usefont{OT1}{cmr}{m}{n} \SampleText}\par
\end{document}