かすみん日記

暇なときに何か喋ります

ファイル分割でdcumute.styのinputコマンドを使うときの目次出力について【LaTeX】

dcumute.styで再定義された\inputコマンドを使うときの目次出力コマンド\tableofcontentsについての備忘録です。

以下のサンプルのtexファイルはuplatex + dvipdfmxでタイプセットすることを想定しています。

普通のinputコマンド

LaTeXで規模の大きい文書を作るとき、セクションごとにファイルを分割したくなります。

標準搭載されている\inputコマンドを使えば、別のtexファイルの中身を呼び出すことができます。

例えば親ファイル(parent.tex)として以下のような内容のtexファイルを作ります:

%% parent.tex
\documentclass[uplatex]{jsarticle}
\begin{document}
親ファイル
\input{child.tex}
\end{document}

同じディレクトリに以下の内容の子ファイル(child.tex)を作ります:

%% child.tex
\section{子ファイル}
ほげほげ

そうすると、親ファイルparent.texをタイプセットすれば\input{...}と書いた部分が子ファイルchild.texの内容で置き換わります。

しかしこれでは、子ファイル単体でのタイプセットはできず、子ファイルの更新を確認するには毎回親ファイルのタイプセットを行わないといけず、面倒です。

子ファイル中に\documentclassコマンドやdocument環境があると、それがそのまま親ファイル中に挿入されるのでエラーが出ます。

そこでdocumute.styで再定義された\inputコマンドを使います。

docmute.styのinputコマンド

docmute.styを使うと、親ファイルから\inputコマンドで子ファイルを呼び出すとき、子ファイルの\begin{document}から\end{document}の中身だけを抽出するようになります。

つまり、次のように書き直すことができます。

親ファイル:

%% parent.tex
\documentclass[uplatex]{jsarticle}
\usepackage{docmute} % これを使う
\begin{document}
親ファイル
\input{child.tex}
\end{document}

子ファイル:

%% child.tex
\documentclass[uplatex]{jsarticle}
\begin{document}
\section{子ファイル}
ほげほげ
\end{document}

子ファイルを上のように書けば、texファイルとして完結しているので、これ単体でもタイプセットできます。

子ファイルの目次

目次は\tableofcontentsコマンドで出力できます。

\inputコマンドで挿入した子ファイルの内容の見出しもちゃんと目次に出力してくれます。

しかし、\tableofcontentsが使えるのはtex文書全体を通じて一度のみです。

つまり、親ファイル冒頭で\tableofcontentsを使っていて、単体でタイプセット可能になった子ファイル中でも\tableofcontentsを使っていた場合、親ファイルをタイプセットした際にエラーとなります。

せっかくファイル分割したので、子ファイルの内容分だけの目次も作業中は確認できるようにしたいですが、親ファイルのタイプセット時に毎回それをコメントアウトするのは面倒です。

ということで、二度目以降に現れる\tableofcontentsコマンドは無視するように再定義します。

親ファイルのプリアンブルに以下のコマンドを書きます:

%% 最初に現れた\tableofcontents以外は無視
\let\oldTableofcontents\tableofcontents
\renewcommand\tableofcontents{
  \oldTableofcontents
  \renewcommand\tableofcontents\relax
}

これで、子ファイルの中でも通しでタイプセットするときを気にせずに\tableofcontentsコマンドが使えます。

以上です。