
Я пишу свою докторскую диссертацию в XeLaTeX с Biblatex, и бывают моменты, когда мне нужно скомпилировать отдельные главы, а бывают моменты, когда мне нужно скомпилировать весь документ, поэтому я использую подфайлы, что работает замечательно. Однако в каждой из этих глав у меня есть команда \printbibliography
, которую я хотел бы отключить при компиляции окончательного документа, чтобы \printbibliography
в основном файле запускалась только эта команда.
Структура файла примерно такая:
Main.tex
:
\usepackage{subfiles, biblatex}
\begin{document}
\subfile{Chapter1.tex}
\printbibliography
\end{document}
Chapter1.tex
:
\documentclass[Main.tex]{subfiles}
\begin{document}
\cite{Someguy1981}
\printbibliography
\end{document}
решение1
Из subfiles.sty
команды \subfile
определяется как:
\newcommand\subfile[1]{\begingroup\skip@preamble\input{#1}\endgroup}
Так что просто подключить некоторый код, чтобы локально переопределить, \printbibliography
чтобы ничего не делать. Например, добавьте следующее в преамбулу основного файла:
\makeatletter
\newrobustcmd*{\nobibliography}{%
\@ifnextchar[%]
{\blx@nobibliography}
{\blx@nobibliography[]}}
\def\blx@nobibliography[#1]{}
\appto{\skip@preamble}{\let\printbibliography\nobibliography}
\makeatother
Обратите внимание, что biblatex
делает библиографические данные доступными через команды цитирования. Так что если вы не хотите просматривать библиографические записи вне основного файла, подфайлы не должны вызывать \printbibliography
.
решение2
Я также использовал подход Одри (https://tex.stackexchange.com/a/107111/85983) некоторое время, но мне надоело писать \printbibliography
в конце каждого подфайла. Теперь я использую следующие Latex Hooks в преамбуле моего основного файла:
%%% Default start and end for each subfile
\AtBeginDocument{%
}
\AtEndDocument{%
\printbibliography
\listoffigures
\listoftables
\newpage
\printacronyms[include-classes=abbrev,name=Acronyms]
}
решение3
Начиная с версии 2.0 подфайлов, можно также использовать макрос условия, \ifSubfilesClassLoaded{}{}
чтобы сделать что-то похожее на подход Одри (https://tex.stackexchange.com/a/107111/85983).
При моей настройке MWE выглядит следующим образом:
основной.текс
\documentclass{book}
\usepackage{biblatex}
\usepackage{subfiles} % must be last usepackage
\providecommand{\topdir}{.}
\addglobalbib{\topdir/references.bib} % topdir is needed here so that
% we can resolve the path in the subfile
% correctly. There we re-define the
% topdir macro to the location of the
% bib file.
\begin{document}
\subfile{dir/sub}
\printbibliography[heading=bibintoc]{}
\end{document}
суб.текс
\providecommand{\topdir}{..} % reset all paths to location of main.tex
\documentclass[../main.tex]{subfiles}
\begin{document}
% some content with citations
\ifSubfilesClassLoaded{%
\printbibliography{}
}{} % we have no 'else' action
\end{document}
решение4
Другой подход может заключаться в различении подфайлов и основного файла по имени задания. Допустим, ваш основной файл называется Thesis.tex
, тогда имя задания обычно Thesis
и вы можете проверить
\IfEq{\jobname}{\detokenize{Thesis}}{}{%
\AtEndDocument{%
\printbibliography%
}
}
это вставит библиографию в конец подфайлов и не сделает ничего в вашем основном файле.
(если возможно, используйте это раньше \usepackage{biblatex}
, в противном случае это может вызвать предупреждение, см.предупреждение о неопределенных ссылках для \AtEndDocument{\printbibliography})