LaTeX
TeX

分割した LaTeX ファイルを subfiles を使ってコンパイルする

More than 1 year has passed since last update.

\input, \include によるファイル分割の問題点

学位論文など大規模な LaTeX 文書では,次のようにファイルを分割するのが一般的だと思います.

main.tex
\documentclass{jsarticle}

\usepackage[dvipdfmx]{graphicx}
\graphicspath{{images/}}

\title{分割した{\LaTeX}ファイルを\texttt{subfiles}を使ってコンパイルする}
\author{sankichi92}
\date{2016年12月30日}

\begin{document}

\maketitle

\input{introduction}

\end{document}
introduction.tex
\section{\texttt{input}, \texttt{include} によるファイル分割の問題点}

分割した{\LaTeX}ファイルを個別にコンパイルできない.

しかし,この方法では introduction.tex を単体でコンパイルすることができません.
私の場合,LaTeX ファイルを保存するたびに chktexlatexmk が走るようエディタで設定しているので,introduction.tex を編集するたびにエラーが返されてしまいます.
また,introduction.tex の変更を確認するために,main.tex を毎回コンパイルするのは非効率的です.

そこで,パッケージ等を利用することで1,分割した LaTeX ファイルを個別にコンパイルできるようにすることを考えます.

subfiles を用いたファイル分割

ここでは,subfiles を紹介します.
subfiles はパッケージファイルとクラスファイルがセットになったもので,TeX Live に含まれています.

subfiles を用いると,ファイルの分割は次のようになります.
sections というサブディレクトリに分割したファイルをまとめることにします.)

main.tex
\documentclass{jsarticle}

\usepackage{subfiles}
\usepackage[dvipdfmx]{graphicx}
\graphicspath{{images/}{../images/}}

\title{分割した{\LaTeX}ファイルを\texttt{subfiles}を使ってコンパイルする}
\author{sankichi92}
\date{2016年12月30日}

\begin{document}

\maketitle

\input{introduction}

\subfile{sections/body}

\end{document}
sections/body.tex
\documentclass[../main]{subfiles}

\setcounter{section}{1}
\begin{document}

\section{\texttt{subfiles}を用いたファイル分割}

\texttt{subfiles}を用いると,プリアンブルを共有したうえで,分割した{\LaTeX}ファイルを個別にコンパイルすることができる.

\end{document}

親になる main.texsubfiles.sty を読み込み,\include\input ではなく,\subfile を用いて分割した LaTeX ファイルを指定します.
\subfile を用いることで,子の \begin{document}...\end{document} の外側を無視することができます.

そして,子の body.tex では,ドキュメントクラスに subfiles.cls を読み込み,そのオプションとして親を指定します.
これにより,子を個別にコンパイルできるうえ,親のプリアンブルを子に共有することができます

より詳しい使い方はドキュメントを確認してください.

$ texdoc subfiles

ただし,subfiles を用いても,ファイル間でラベルや文献を共有できないという問題が残ります.
たとえば,子で \ref\cite を用いると,??[?] のように出力されてしまいます.
よい解決策をご存知の方がいらっしゃいましたら,教えていただけると助かります.

ファイル分割のためのその他のパッケージ

CTAN の subdocs というトピックにまとめられています.
以下,LaTeX ファイルの分割について調べる中でよく見かけたものを簡単に紹介します.

docmute

docmute は,\input, \include を拡張して,読み込むファイルに \begin{document}...\end{document} があればその内側のみを読み込むようにするシンプルなパッケージです.

分割した LaTeX ファイルのコンパイルについて日本語で調べると,docmute を紹介している記事を多く見かけます.
しかし,docmute ではプリアンブルの共有はサポートされていません.
個々の独立した LaTeX ファイルを include するのであれば docmute は良いかもしれませんが,大規模な1つの LaTeX 文書を分割するのであれば,subfiles の方が便利です.

standalone

子のプリアンブルを親で読み込んだり,一つの LaTeX ファイルを複数箇所で利用したりといった,より複雑な LaTeX ファイル分割を行うのであれば,standalone を使うと良さそうです.

Multi-file LaTeX projects というタイトルの ShareLaTeX のドキュメントで,subfiles とともに簡単な使い方が紹介されています.
この記事では,import パッケージと組み合わせて,ネストした LaTeX ファイルの読み込みを行っています.



  1. パッケージ等を利用せずに,分割した LaTeX ファイルを個別にコンパイルする方法は,効率的な LaTeX ファイル分割術 という記事で紹介されています.