使用子文件时的参考书目

使用子文件时的参考书目

我正在用 Biblatex 在 XeLaTeX 中撰写我的博士论文,有时我需要编译单个章节,有时我需要编译整个文档,所以我使用子文件,效果很好。但是,在每个章节中我都有一个\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

我也使用了 Audrey 的方法(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{}{}来执行与 Audrey 的方法类似的操作(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} 未定义引用警告

相关内容