Библиографии при использовании подфайлов

Библиографии при использовании подфайлов

Я пишу свою докторскую диссертацию в 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})

Связанный контент