Acetaminophen’s diary

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

LaTeX でパッケージが衝突したときは(1)

LaTeX を使う際には必ずといっていいほど何らかのパッケージを利用するでしょう。例えば、数式を含む文書ならほとんどの場合 amsmath パッケージを利用するでしょうし、図を挿入する際には graphicx パッケージを読み込むでしょう。しかし、中には同じ名前のマクロが定義されているなどの理由で、パッケージどうしが衝突して同時に利用できないという事態が発生することがあります。

このようなことが発生しないようにするには、パッケージを設計する段階で作者がコマンド名としてユニークな名前を用いる必要がある*1わけですが、それでも一般ユーザがパッケージを利用していて衝突が起こることは往々にしてあります。今回は、こうした場合の対処法をいくつかご紹介します。

サンプルソースGitHub に置いてありますので、ご利用ください。

 

1. フォント変更などでありがちな例

まずはよく見かける報告例です。欧文と数式のフォントを Times 系に変更したい場合によく用いられていた、txfonts パッケージの例です。

\documentclass{jsarticle}
\usepackage{txfonts}
\usepackage{amsmath}
\begin{document}
数式の例:$\iint dx dy, \iiint dx dy dz$
\end{document}
! LaTeX Error: Command \iint already defined.
               Or name \end... illegal, see p.192 of the manual.

エラーを見ると \iint が既に定義されていることがわかります。同じ現象は、欧文と数式のフォントを Palatino 系のフォントに変更する pxfonts パッケージを使用した場合も見られます。

\documentclass{jsarticle}
\usepackage{pxfonts}
\usepackage{amsmath}
\begin{document}
数式の例:$\iint dx dy, \iiint dx dy dz$
\end{document}
! LaTeX Error: Command \iint already defined.
               Or name \end... illegal, see p.192 of the manual.

対処法:パッケージを読み込む順番を変える

この場合は、txfonts パッケージ(または pxfonts パッケージ)を amsmath パッケージよりも後に読み込めば OK です*2。ただし、TX フォントおよび PX フォントはバランスの悪い部分を残したまま開発終了していますので、より新しい newtx フォントおよび newpx フォントを利用するのが賢明です(以下は newtx フォントの例)。

\documentclass{jsarticle}
\usepackage{amsmath,newtxtext,newtxmath}
\begin{document}
数式の例:$\iint dx dy, \iiint dx dy dz$
\end{document}

参考として、3種類のフォントで同じ数式を表示した例を示します。

f:id:acetaminophen:20150509234414p:plain

f:id:acetaminophen:20150509234614p:plain

f:id:acetaminophen:20150509234637p:plain

 

2. 内部コマンドが衝突する例

次の例は一見して原因が分かりにくいのですが、以下のソースは ascmac と pict2e の順序が前後してもエラーになります。

\documentclass{jsarticle}
\usepackage{ascmac}
\usepackage[dvipdfmx]{pict2e}
\begin{document}
\begin{screen}
囲み内の文章。
\end{screen}
\end{document}
! Missing number, treated as zero.
 
                   <
l.7 \end{screen}
                
? 

原因としては「\oval というコマンドが衝突しているため」だそうです。ascmac や okumacro については、epic/eepic や pict2e との間でトラブルが起こる例がいくつも報告されています。以下は okumacro と eepic の共存で線がずれる例です。

\documentclass{jsarticle}
\usepackage{okumacro}
\usepackage{epic,eepic} % ここを付けると(エラーではないが)ずれる
\begin{document}
\keytop{A}
\end{document}

対処法:改善版パッケージを用いる

まず、pict2e 使用時に ascmac を使いたい場合は、ascmac ではなく bxascmac パッケージを読み込めば対処できます。

\documentclass{jsarticle}
\usepackage{bxascmac}
\usepackage[dvipdfmx]{pict2e}
\begin{document}
\begin{screen}
囲み内の文章。
\end{screen}
\end{document}

次に、epic/eepic は LaTeX 標準の picture 環境の拡張を DVI ウェアの拡張機能を用いて実現したものですが、これは DVI を経由しない pdfTeX などのエンジンでサポートされておらず、現在では pict2e が主流になりつつあります。しかも eepic は pict2e との同時読み込みが許可されていませんので、今後は epic/eepic ではなく pict2e をベースとして利用する方がよいでしょう。

とはいえ、pict2e ではなく eepic にしか実現できない破線や楕円の描画を使いたい場合と理由で、ascmac や okumacro と共存させざるを得ない場合もあるでしょう。そうした場合は epic/eepic の代わりに bxpict2e (bxeepic) を用いるという選択肢があります*3

\documentclass{jsarticle}
\usepackage{okumacro}
\usepackage[dvipdfmx]{bxeepic}
\begin{document}
\keytop{A}
\end{document}

関連する TeX Q&A にリンクしておきます。

 

次回は、さらに別の対処パターンを取り上げます。

*1:そうはいっても、例えばフォントを変更するパッケージの場合は既存のコマンドを再定義するために敢えて同じコマンドを定義することがあります。

*2:txfonts および pxfonts は積分記号のフォントを変更するために、4つの記号を出力するコマンドを再定義します。amsmath パッケージはこれらのコマンドが元々定義されていないものとして新たに定義しようとするため、衝突してしまうわけです。

*3:bxeepic パッケージを読み込むと、本物の epic/eepic 両パッケージを実際に読み込むことなく「読み込み済み」として扱います。その一方で pict2e を内部で読み込み、pict2e の描画機能を利用して epic/eepic の機能を最大限補います。したがって、ascmac や okumacro と本物の eepic との共存を避けることができます。