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

Re: Re: SphinxのLaTeXのフォーマットをいじる

先日、Re: SphinxのLaTeXのフォーマットをいじる の記事を書いた直後に、
sphinx-users ML に独自のclsファイルを使用する方法がポストされました。

前回の記事では conf.py でプリアンブル部にゴリゴリ定義を突っ込んでいましたが、

  • Python の文字列として記述するため、エスケープを気にする必要がある
  • ファイル内にPython のコードと LaTeX マクロがミックスされるため、読み書きしづらい
  • エディタのサポートが得られない

などの問題があるので、今回はこの「独自の cls ファイルを使用する」方法を使ってみることにします。

自分だけの最強の cls を作る

とは言え、いちからドキュメントクラスを書き下すことは難しいので、
既存のドキュメントクラスをベースにカスタマイズしていくことにします。

まずは jsarticle をベースにすることにします。
これまでは conf.py の latex_docclass と latex_documents を使ってクラスを選択していましたが、
独自に cls ファイルを定義する場合は \LoadClass マクロを使います。

\LoadClass{jsarticle}

例えば、行間を広げるようなドキュメントクラスを作ってみます。
次の内容のファイルを myjsarticle.cls というファイル名で保存します。

\LoadClass{jsarticle}

\renewcommand{\baselinestretch}{2.0}


そして、conf.py に次のように記述します。

latex_additional_files = ['myjsarticle.cls']

latex_documents = [
  ('index', 'test.tex', u'test Documentation',
   u'test', 'myjsarticle'),
]

sphinxhowto, sphinxmanual をベースにする

前回の記事では sphinxhowto と jsarticle を組み合わせて、必要な箇所だけ書き換えるようにしていたので
今度は sphinxhowto をベースにしてみましょう。
sphinxhowto (sphinxmanual) はちょっと変わった形をしたドキュメントクラスです。

  • ベースになるのは article や manual などの基本のドキュメントクラス
  • ベースのドキュメントクラスの定義を一部差し替えている
  • ベースのドキュメントクラスは差し替えしやすいよう、\sphinxdocclass という変数名経由で指定

そのため、sphinxhowto (sphinxmanual) を \LoadClass する前に \sphinxdocclass という変数を定義します*1
今回は jsarticle を指定します。

\def\sphinxdocclass{jsarticle}
\LoadClass{sphinxhowto}

\renewcommand{\baselinestretch}{2.0}

そして、次に conf.py を書き換えます。

latex_additional_files = ['myjsarticle.cls']

latex_documents = [
  ('index', 'test.tex', u'test Documentation',
   u'test', 'myjsarticle'),
]

まとめ

  • latex_additional_files と latex_documents の設定によって、独自のドキュメントクラスを定義することができた
  • \LoadClass を使うことで既存のドキュメントクラスを読み込むことができ、必要な部分だけ差し替えられるようになった
  • sphinxhowto の部分差し替えもできるようになった

*1:独自のドキュメントクラスを利用する場合、Sphinx は \sphinxdocclass の初期値に conf.py の latex_docclass['manual'] を設定するので conf.py 側でコントロールすることもできます