情報系の手考ノート

数学とか情報系の技術とか調べたり勉強したりしてメモしていきます.

TeX のパッケージ読み込み順序

TeX でパッケージの読み込みにおいて互換性や依存の関係で読み込む順序に制限がある場合が多々存在します. 例えば hyperref パッケージの後に読み込まれるべき cleveref パッケージ等があります. この順序に従ってパッケージを読み込もうとすると,同じようなパッケージを一箇所で読み込むといったことが困難になります. そこで,パッケージの読み込みを遅延させるマクロを作成しました. 実際は TeX 言語の部分で何か作ってみたいという思いが半分くらいありますが.

定義

パッケージ A の後にパッケージ B をオプション C で読み込むという状況を考えます. この場合に以下のようにするとして設計します.

\RequirePackageAfter<A>[C]{B}

RequirePackage を別のマクロで置き換え,パッケージ A を読み込もうとした時に,B も読み込むことで実現するという方針をとります. 最終的に定義は以下のようになりました. 基本的な実装は [2] で使われているものを元にしています.

\RequirePackage{letltxmacro}
\RequirePackage{xstring}
\def\grenewRequirePackage{\grenewcommand\RequirePackage[2][]}
\def\RequirePackageAfter<#1>[#2]#3{%
  \expandafter\LetLtxMacro\csname RequirePackage@#3@After@#1\endcsname\RequirePackage%
  {%
    \edef\overrideRequirePackage##1##2{%
      \noexpand\IfStrEq{##2}{#1}{%
        \noexpand\LetLtxMacro\noexpand\RequirePackage\expandafter\noexpand\csname RequirePackage@#3@After@#1\endcsname%
        \noexpand\RequirePackage[##1]{#1}%
        \noexpand\RequirePackage[#2]{#3}%
      }%
    }%
  }%
}

参考文献

[1] macros - \global\renewcommand equivalent of \global\def - TeX - LaTeX Stack Exchange

[2] LaTeX でパッケージが衝突したときは(2) - Acetaminophen’s diary