88
82

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

効率的な LaTeX ファイル分割術

Last updated at Posted at 2015-08-20

背景

長大な LaTeX 文書を作成する際,1つの tex ファイルでこれを行うと様々な不都合が生じます.

  • 1回のタイプセットに時間がかかる
  • エディタの動作もぎこちなくなる
  • 多人数での編集に向かない

したがって,ある程度以上大きな文書を作成するときは tex ファイルを分割するのが一般的です.

一般的な手法

おそらく,最もよく行われている tex ファイルの分割は,大まかに次のような手順で実施されています(参考:LaTeX ドリル - LaTeX ファイルの分割).

  1. 専用ディレクトリを用意する.
  2. セクション毎の内容を収録した tex ファイル(コンテンツファイル)を作成する.
  3. すべてのコンテンツファイルを \include するためのマスターファイルを用意する.
  4. マスターファイルをタイプセットする.

この手順4において,不要な箇所を適宜コメントアウトすることにより,文書全体をいちいちタイプセットする煩わしさから解放されることができます.

問題点

前節で紹介した「一般的な手法」でも,最初に提示した不都合を解消することができています.しかしながら,個々のコンテンツファイルは,それ単体ではタイプセットすることができません.

普通のテキストエディタで tex ソースを作成し,コマンドラインでタイプセットを行う人にとっては,これでもさほど問題にならないかもしれませんが,現在は TeX 用の統合環境を用いて LaTeX 文書作成を行っている人も少なくないことでしょう.こうした人にとっては,現在編集中のファイルをタイプセットするのに,いちいちマスターファイルを表示してタイプセットを行うのはメンドウ以外のなにものでもありません.
そこで,次のようなことが実現できれば理想的です.

  • 文書全体をタイプセットするときにはマスターファイルを用いる.
  • 各コンテンツファイルもそれぞれ単体でタイプセットすることができる.

解決策1(2015-09-06 追記)

この目的のために docmute パッケージなるものが存在します.特に理由がない限りは,この方法を利用するのが手っ取り早く,確実でしょう.詳しい説明はこちらの記事を参照してください.

解決策2

新たなパッケージを導入したくない場合などは,次の方法でも目的は達成できます.

その方法の具体的な手順を,例を用いて説明していきます.以下では

  • マスターファイル:master.tex
  • コンテンツファイル:content-X.tex(ここで X は任意の自然数)

と名付けることにします.

まず,マスターファイルにちょっとした仕掛けを行ないます.

master.tex
\documentclass{jsarticle}

% ----- 仕掛け 開始 -----
\newcommand{\ifdraft}{false}
% ----- 仕掛け 終了 -----

\begin{document}

\include{content-1}

\include{content-2}

\include{content-3}

\end{document}

ご覧の通り,上の master.tex では,マクロ \ifdraft を定義しています.このマクロの名前と内容は,基本的になんでも結構です1.master.tex で既にマクロを定義している場合には,それを流用することもできます.

次に,各コンテンツファイルの冒頭と末尾に以下のようなコードを仕込みます.

content-X.tex
\expandafter\ifx\csname ifdraft\endcsname\relax
 \documentclass{jsarticle}
 \begin{document}
\fi

% ここに文書の内容を書く

\expandafter\ifx\csname ifdraft\endcsname\relax
  \end{document}
\fi

原理は TeX 言語の話になってしまうので割愛しますが,1行目の\expandafter\ifx\csname ifdraft\endcsname\relaxは「 \ifdraft という制御綴が定義されているか否か」で条件分岐を行い,未定義の場合に続く2行を"実行"するというものです2.したがって,冒頭のコード全体では次のようなことが行われることになります.

  • \ifdraft が定義済みの場合
    master.tex で \include されている場合なので,\documentclass の宣言等は行わない.
  • \ifdraft が未定義の場合
    content-X.tex が単体でタイプセットされている場合なので,\documentclass の宣言等を行う.

末尾のコードについてもほぼ同様です.

これで,content-X.tex は master.tex から \include されることも,単体でタイプセットすることも可能なファイルとなりました.

おわりに

今回紹介した Tips は,本当に〈ちょっとしたこと〉でしたが,長大な文書を作成する際には,その〈ちょっとしたこと〉が積み重なって結果的に多くの時間や労力を無駄にすることにつながります.〈ちょっとしたこと〉に対しては〈ちょっとした工夫〉で対処して,快適な LaTeX ライフを送りましょう.

  1. 厳密には \relax に展開されるものは不可です.

  2. 使用している TeX エンジンが e-TeX 拡張の適用されたものである場合には,プリミティブ \ifdefined を用いても同様のことが実現できます.

88
82
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
88
82

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?