コマンドラインから latex の動作を変えたい

2025-05-10

ほとんど自分用メモです。

例えば 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 での回答に興味深い (があまり実用的ではない気がする) 方法がありました。 リンクだけ書いておきます。