コマンドラインから latex の動作を変えたい
ほとんど自分用メモです。
例えば beamer でプレゼンテーション用の PDF と配布用 (ハンドアウトモード) の PDF をそれぞれ生成したい、など、 latex の挙動をほんの少しだけ変更して処理したい、という場合がときどきあります (ないですか?)。
最も愚直な方法はプリアンブルを変更してコンパイル、もう一度プリアンブルを変更して (元に戻して)
コンパイル、とする方法ですが、ちょっと面倒ですし、ミスも発生しそうです。
プリアンブルだけを書いたファイルをそれぞれ作成して本文は \input
等する、というのもよくある手ですが、
プリアンブル部分を変更したい場合は複数のファイルに「同じ」(←これがイヤ) 変更をしなければなりません。
そのような場合は latex に「コマンドラインオプション」を与えて動作を変えられたら幸せになれそうです。
そこで以下では、beamer においてプレゼンテーション用の PDF と配布用 (ハンドアウトモード) を作成する方法を例に、 コマンドラインから latex の挙動を変更する方法を紹介します。 特に make などを使いたい場合に便利かもしれません。
コマンドラインで \def
する
latex '\def\mybeamermode{handout}\input{file}'
のようにすれば、「コマンドラインオプション」(的な何か、ここでは mybeamermode) を渡すことができます。
tex ファイルのプリアンブルに、
% file.tex
\usepackage{ifthen}
% \mybeamermode が指定されなかった場合
\ifdefined\mybeamermode\else
\def\mybeamermode{notspecified}
\fi
\makeatletter
\ifthenelse{\equal{\mybeamermode}{handout}}{
% \typeout{Mode: handout}
\gdef\beamer@currentmode{handout}
}{
% \typeout{Mode: presentation}
}
\makeatother
などと書けば「オプション」に応じた処理をさせることができます。
ただしこのままだと「オプション」によらず同じ名前の PDF を生成することになります。 これを変更したい場合は、
latex -jobname file-handout '\def\mybeamermode{handout}\input{file}'
のように -jobname
を使用することができます。
手で入力するのには向きませんが、make などを使う場合には便利かもしれません。
latexmk を使う場合は、
latexmk -usepretex="\def\mybeamermode{handout}" -jobname=file-handout file.tex
とすれば良いようです。
\PassOptionsToClass
を使う
やりたい動作の変更がオプションの変更だけで対応できるパッケージ限定ではありますが、 \PassOptionsToClass
を使ってコマンドラインからパッケージにオプションを与えることができます。
例えば beamer で handout モードと通常モードを切り替えるには、
latex '\PassOptionsToClass{handout}{beamer}\input{file}'
とすることができます[1]。
この方法のメリットは、ソース (プリアンブル) に特に何も追加しなくて良い点です。
この場合も最初の方法と同様に、オプションの有無によらず同じ名前の PDF を生成することになるので、
必要に応じて -jobname
オプションを使うと良いでしょう。
jobname-suffix を使う
別の方法として、jobname-suffix パッケージを使う方法もあります。
file.tex
のプリアンブルに、
% file.tex
\usepackage{jobname-suffix}
\makeatletter
\IfSuffixT[handout]{
\gdef\beamer@currentmode{handout}
}
\makeatother
などと書いておいて、
ln -s file.tex file-handout.tex
のようにシンボリックリンクをはっておけば、
latex file.tex
latex file-handout.tex
のそれぞれで、通常モード版、handout 版の PDF が生成されます。
ごく普通に (最初の方法のようなオプションを書かずに) latex を起動すれば良いだけなので、 比較的おすすめしやすい方法かもしれません。
その他
上で引用した Stack Exchange での回答に興味深い (があまり実用的ではない気がする) 方法がありました。 リンクだけ書いておきます。
- 本当に引数を取る方法
latex file.tex argument のように引数を与えることができます。 - LuaLaTeX で
\directlua
を使う方法
まぁ Lua を使えばたいていのことはできますね。