如何使参考书目在子文件的子文件中发挥作用?

如何使参考书目在子文件的子文件中发挥作用?

我正在写一份很长的报告,需要 subfiles 包的帮助才能将其分成几个部分。它工作得很好,直到我进一步将其中一个子文件拆分成两个。以前,该\ifSubfilesClassLoaded命令有助于区分给定文件是从主文件还是子文件编译而来,如下所示此主题。但是当我获得两级子文件时,它就无法再分辨正在处理哪一级子文件。

考虑如下的文件层次结构:

main.tex
myBib.bib
sections/section1.tex
materials/a_complex_table.tex

以下是 MWE:

%%%%%% main.tex
\documentclass[10pt]{article}

\usepackage[numbers,sort&compress]{natbib}
\usepackage{subfiles}
\begin{document}
    \section{Section One}
    \subfile{sections/section1.tex}
    
    \bibliographystyle{ieeetr}
    \bibliography{myBib}
\end{document}

%%%%%% section1.tex
% !TeX root = section1.tex
\documentclass[../main.tex]{subfiles}
\begin{document}
    I like to cite \cite{A}
    
    \subfile{../materials/a_complex_table.tex}
    
    \ifSubfilesClassLoaded{
        \bibliographystyle{ieeetr}
        \bibliography{../myBib}
    }{}
\end{document}

%%%%%% a_complex_table.tex
% !TeX root = a_complex_table.tex
\documentclass[../main.tex]{subfiles}
\begin{document}
    \begin{table}[!htb]
        \begin{tabular}{ l r }
            Name & Reference \\
            A    & \cite{A}  \\
            B    & \cite{B}  \\
            G    & \cite{G}
        \end{tabular}
    \end{table}
    \ifSubfilesClassLoaded{
        \bibliographystyle{ieeetr}
        \bibliography{../myBib}
    }{}
\end{document}

和我的 bibfile:

@book{A,
    title={The meaning of A},
    author={A. Alpha},
    year=2020,
    publisher={Apublisher}
}
@book{B,
    title={The meaning of B},
    author={B. Beta},
    year=2021,
    publisher={Bpublisher}
}
@book{G,
    title={The meaning of G},
    author={G. Gamma},
    year=2022,
    publisher={Gpublisher}
}

排版main.texa_complex_table.tex两者都没问题,但编译我的section1.tex执行\bibliography{../myBib}两次,因为\ifSubfilesClassLoaded没有区分子文件。我该如何修复这个重复?

在此处输入图片描述

答案1

如果你的目标是打印完全的在每个子文件末尾添加参考书目,更简单的做法如下:

  1. 从当前文件中删除所有\biblio...命令。\IfSubfil...
  2. 将文件更改main.tex为读取
\documentclass[10pt]{article}

\usepackage[numbers,sort&compress]{natbib}
\usepackage{subfiles}

\bibliographystyle{ieeetr} % <===== new
\AtEndDocument{\bibliography{myBib}}  % <=== new

\begin{document}
    \section{Section One}
    \subfile{sections/section1.tex}
    
\end{document}
  1. 为了构建子文件,使用时必须做一件额外的事情bibtex。要么:
    • bibtex从主文件夹运行:sobibtex sections/section1
    • 或者在运行时将主文件夹添加到搜索路径bibtex,这样您就可以从文件夹内sections/运行BIBINPUTS=../ bibtex section1

解释

  • 通过放入\bibliographystyle{ieeetr}前导码,它会自动传播到所有子文件。
  • 当它们被编译为独立文档时,同样会\AtEndDoc...传播到每个子文件,但每次编译只会运行一次。

答案2

  • 在主文件中,添加以下行

    \usepackage{xstring}
    
  • 在子文件中,将 替换\ifSubfilesClassLoaded\IfStrEq*{\jobname}{filename},其中filename是子文件的名称(不带.tex)。

举个例子,sections/section1.tex变成

\documentclass[../main.tex]{subfiles}
\begin{document}
    I like to cite \cite{A}
    
    \subfile{../materials/a_complex_table.tex}
    
    \IfStrEq*{\jobname}{section1}{
        \bibliographystyle{ieeetr}% <<< will apply to all subfiles if moved to the preamble of the main file, no need to repeat it
        \bibliography{../myBib}
    }{}
\end{document}

相关内容