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
コマンドが使えます。
以上です。