LaTeX の重複コードを減らす:コマンド・環境・外部ファイルの活用
LaTeX の重複は、書式をコマンドに、構造を環境に、共通部分を \input で読むファイルにまとめると減らせます。ただし、見た目が似ているだけの箇所まで一律にまとめず、同じ内容を一緒に変更する部分から始めます。
同じ書式にはコマンドを定義する
次の完全な例では \vect、\code、\R を1回定義して再利用します。
\documentclass[11pt]{article}
\usepackage{amsmath,amssymb}
\newcommand{\vect}[1]{\boldsymbol{#1}}
\newcommand{\code}[1]{\texttt{#1}}
\newcommand{\R}{\mathbb{R}}
\begin{document}
For $\vect{x}\in\R^d$, open \code{main.tex}.
\end{document}
プリアンブルの定義は本文全体で使えます。本文中の定義は実行された後、その有効範囲で使えます。名前が衝突すると Command \R already defined. などが出ます。改名するか、意図した再定義なら \renewcommand、未定義時の補完なら \providecommand を使います。
\newcommand の引数は最大9個ですが、4~5個でも定義を見ないと意味が分かりにくくなります。
同じ構造には環境を定義する
同じ形式の表は環境を共有できます。次の resulttable は列指定と見出し行の2引数を受け取ります。
\documentclass[11pt]{article}
\usepackage{booktabs}
\newenvironment{resulttable}[2]{%
\begin{table}[htbp]\centering
\begin{tabular}{#1}\toprule
#2\\\midrule
}{%
\bottomrule\end{tabular}
\end{table}
}
\begin{document}
\begin{resulttable}{lcc}{Model & Accuracy & F1}
Baseline & 0.812 & 0.794 \\
Ours & 0.867 & 0.851 \\
\end{resulttable}
\end{document}
各表はデータ行だけを書き、罫線・列・フロートの配置は環境が提供します。内部のエラーは展開先や呼び出し位置で報告される場合があるため、定義と最小の呼び出しだけで確認します。
共通定義を外部ファイルに分ける
同じプリアンブルをコピーせず、\input で共有します。
preamble.tex:
\usepackage{amsmath,amssymb}
\newcommand{\vect}[1]{\boldsymbol{#1}}
main.tex:
\documentclass{article}
\input{preamble}
\begin{document}
$\vect{x}$
\end{document}
この例では main.tex をプロジェクトのルートに置きます。パスの基準はコンパイル時の作業ディレクトリで、\input を書いた章の位置ではありません。ルートから処理するなら、chapters/intro.tex 内でも隣のファイルを \input{chapters/intro2} と指定します。
独立した章には \include が使え、前後の改ページと個別の補助ファイルを作ります。\includeonly は一部の確認に使えますが、省略した章の参照は補助情報に依存します。最終確認は全体で行います。\include は入れ子にできません。
まとめる価値を判断する
繰り返し登場し、内容が本当に同じで、将来も一緒に変えるかを確認します。回数は目安であり、機械的な基準ではありません。
2か所だけの抽象化は参照の手間を増やし、微妙に違う内容を統一すると切り替え引数ばかりになることがあります。
コンパイル後に確認する点
本文前に定義が読み込まれるか、パスがルート基準の構成に合うか、数式・表・参照の対象が変わっていないかを確認します。
| エラー | 原因 | 対処 |
|---|---|---|
Command \foo already defined. | 既存名と衝突 | 改名、または意図した再定義 |
Environment foo undefined. | 定義が遅い、または未読込 | プリアンブルと \input を確認 |
File 'chapters/intro2.tex' not found. | 章を基準にパスを書いた | コンパイルの基準に合わせて直す |
| ログ位置とソース位置が合わない | マクロや環境の展開時に失敗 | 定義と最小呼び出しで再現する |
まとめ
- 書式はコマンド、構造は環境にまとめる。
- 共通定義を外部ファイルに置き、章の境界は主ファイルで決める。
- 読みやすさと保守性が向上する場合に抽象化する。
全体を EasyLaTeXに取り込み、main.tex を主ファイルに選択してコンパイルできます。