我正在写一份很长的报告,需要 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.tex
和a_complex_table.tex
两者都没问题,但编译我的section1.tex
执行\bibliography{../myBib}
两次,因为\ifSubfilesClassLoaded
没有区分子文件。我该如何修复这个重复?
答案1
如果你的目标是打印完全的在每个子文件末尾添加参考书目,更简单的做法如下:
- 从当前文件中删除所有
\biblio...
命令。\IfSubfil...
- 将文件更改
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}
- 为了构建子文件,使用时必须做一件额外的事情
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}