読者です 読者をやめる 読者になる 読者になる

自己顕示欲の開放治療所

erg, programming and something.

別名:Laughing and Grief 雑記

Latin and Greekは習ったこともない

真面目な記事の他、特定の方には不快と思われる事柄に関して言及を行うことがあります。ちょっと頑張りますが、Blog内で解決できなかった場合要望があれば別ページに技術記事は書き直します

latexで複数のスタイルファイルを読み込んだ際にRequirePackageされたPackageが競合したのを解決した話

 どこのラノベタイトルかMi○lかse○lのゲームタイトルかという感じのタイトル長となりましたが、そんな話.

problem

 Sphinxで独自の(というかデフォルトのhowto, manual以外のクラスファイル)を使おうとした際にErrormake latexpdfja が止まる. どうやら"\iiint"とかが定義済みだ、とかが出る.

で、その原因なんですが, Sphinx.styでRequireしてるamsmathパッケージ, timesパッケージと使おうとしているクラスでtxfontsをRequireしているときに発生するんですね. 通常の \usepackage で使おうとしているときにコレにぶちあたったら, その順番をamsmath, txfontsのようにすれば解決するんですが *1, 今回は別の.styや.cls内で呼ばれてるんですよね.

当然, .styなり.clsなりの中身で直接該当部分をコメントアウトすれば避けられる話なんですが, Sphinxは「 make latex コマンドを行った際にsphinx.styをbuild/latexに置く」という動作を行うので, 一度 make clean でディレクトリ真っ白にされるとまた設定しなおさなければならないんですよ. じゃあもう片方を書きなおせばという話なんですが, 今回使用するのは自分で用意したクラスファイルではなく, 手を入れるのが躊躇われるという状況にあるわけです.

I did it!

 上記のようなコーナーケースにぶち当たったわけです. 解決としては「tex内部で呼ばれる順序をどうにかする」「.tex内でtxfontsかamsmathのRequireをやめさせる」などがあるわけですが, 正直前者は僕の知識ではキツイ. 後者にしたって具体的にはどんなコマンドを叩けばいいんだというところだったのですが, @_yyu_ 氏の助言により, \RequirePackage コマンドを \renewcommand で定義しなおせば良いのでは, という話になりました. 今回その試みが成功したので書き残しておきます.

.texファイルの先頭で( \documentclass とかが読み込まれた後だと具合が悪い)

\RequirePackage{letltxmacro}
\RequirePackage{xstring}
\LetLtxMacro\latexRequirePackage\RequirePackage
\renewcommand\RequirePackage[2][]{\IfStrEq{#2}{txfonts}{}{\latexRequirePackage[#1]{#2}}}

とすれば今回は通りました. 内容的には

  1. マクロを書くために2つ呼んでいます. CTAN収録パッケージなのでlatex環境を普通どおりに構築していれば概ね問題ないはず. \usepackage でない理由は, \usepackage\documentclass\begin{document} の間で使うというような話をどこかで聞いたので.

  2. letltxmacro の作法についてはあまり詳しくないのでCTANのページなどをご参照ください. 置き換えるマクロと新しいマクロの宣言, \renewcommand でその中身の記述といったようなことをしています. \RequirePackage[2][] となっているのは前半は引数2つということです. 後半はわかってないです.

  3. \IfStrEq はxstringから呼んできます. 文字列の比較, 成功時失敗時処理が簡単に行なえました. 便利!

\IfStrEq{str1}{str2}{true}{false}

といった感じです. 今回はRequirePackageされた中身がtxfontsだった場合何もしてほしくないので成功時がemptyです. 失敗時, つまりそれ以外のパッケージだった場合は通常通りRequirePackage をしてもらっています.

終わりに

 このコーナーケースを踏んだ理由の一つに, 現在Sphinxの拡張でbuilderの置き換えを利用したものを作っている途中だからというのがあります. 「正直ドキュメント色が薄いからリリース番号とかつけなくていい」「紙を多く使うから目次出力しなくていい」というような要望にプリアンブルあれこれしなくてもいいようにしたいという要望から拡張として作ることになったのです. この問題が解決したことによって大分完成に近づいたのでできたら記事にする予定です.

今回は@linerlock氏にも助けてもらいました.