ミケガモのブログ

Texのsubfilesの個別コンパイル時にbibtexを使う

subfilesとBibTeXを併用したときに発生する問題

TeXで章立てされた文章を作成するときには、subfilesを使って章ごとの.texファイル(サブファイル)を作ったのち、マスターファイルでそれらを取り込むとよい。 一つのファイルあたりの文章量を小さく抑えられるほか、いちいち全体をコンパイルしているとかなり時間を食う所を章単体でコンパイルができるようになるので、作業効率が上がる。 qiita.com

また、引用文献の管理には、BibTeXを使うのが主流となっている。 .bibファイルに所定の書式で論文データをまとめておき、本文中で\cite{}コマンドによって引用すると、自動的に通し番号を振ってくれる。 qiita.com

さて、この2つを使っているときには、引用文献のページを表示する\bibliography{}コマンドを置く場所が問題となる。 BibTeXは、\bibliography{}コマンドを書くことで初めて.bibファイルが参照される仕組みである。 したがって、\cite{}を含んでいるのに\bibliography{}を含まないサブファイル単体をコンパイルした場合にはエラーが出てしまう。 かといって各サブファイルに\bibliography{}コマンドを書くと、今度は全体コンパイルのときにそれらが競合してエラーが出てしまう。

対処方法

マスターファイルにのみ「マスターファイルである」というフラグを設定する。そしてサブファイル上に、そのフラグを参照して\bibliography{}を書くか否かをコントロールするif文を書く。

master.tex

\documentclass[12pt,a4paper]{jreport}
%%%% preamble %%%%%
\usepackage{subfiles}
\usepackage{ifthen}

\begin{document}
\setcounter{masterflag}{1} %master.texをコンパイルするときのみ masterflag=1となる

%% 本文 %%
\subfile{sub}
% etc...

\bibliographystyle{amsplain}
\bibliography{ref} %.bibファイル(ここではref.bib)を参照&引用文献のページ挿入
\end{document}

sub.tex

\documentclass[./master]{subfiles}
\begin{document}

\ifthenelse{\value{masterflag} = 0}
{
%then: masterflag=0 (初期値。sub.texの単体コンパイル)のときは.bibファイル(ここではref.bib)を参照&引用文献のページ挿入
   \bibliographystyle{amsplain}
   \bibliography{bib} %
 }
{  %else: masterflag=1のときはなにもなし
}

\end{document}

参考

以下のページなどを参考にした。と言っても、\ifthenelseTeXで使えるということを学んだくらいだけど…。 tex.stackexchange.com