我正在尝试使用独立包将我的大文档分解成较小的文档。
我的文档的结构目前是:
主文本
\documentclass{article}
\usepackage{packages} %custom .sty file
\begin{document} % start the body of the text
..<content>..
\input{overview}
\newpage
\printbibliography
\end{document}
概述.tex
\documentclass[crop=false]{standalone}
\usepackage{packages}
\begin{document}
\onlyifstandalone{\section{Overview}}
..<content>..\cite{citation1}
\input{OverviewSubsection}
\label{label:Overview}
\onlyifstandalone{\printbibliography} %print references if compiled from here
\end{document}
OverviewSubsection.tex
\documentclass[crop=false]{standalone}
\usepackage{packages}
\begin{document}
\subsection{ubsection To Overview}=
..<content>.. \cite{citation2}
\label{sub:OverviewSubsection}
\onlyifstandalone{\printbibliography}%print references if compiled from here
\end{document}
packages.sty 包含我需要的主文件和所有子文件包,如下所示:
\usepackage{standalone}
\usepackage[letterpaper,margin=1in]{geometry} % adjust page dimensions and orientation
..<other package>..
%biblatex, must use backend=bibtex in order to compile under sublime correctly - raises a warning
\usepackage[style=ieee]{biblatex}
%bibliography files
\addbibresource{reference1.bib}
\addbibresource{references2.bib}
\addbibresource{references3.bib}
问题
当我编译时,main.tex there
只有一个参考部分,这很好,因为它格式正确并包含所有参考,我认为这是因为该文档具有类article
。但是当我编译时,Overview.tex
有两个参考部分一个接一个,它们完全相同,包含citation1
和citation2
。
当我编译时,OverviewSubsection.tex
只有一个参考部分,这显然是因为它没有调用其中的任何内容。
我该如何做才能编译Overview.tex
并正确输入OverviewSubsection.tex
,以免OverviewSubsection.tex
评估该\onlyIfStandalone{}
块?
我曾尝试使用
\ifstandalone
\printbibliography
\fi
而不是\onlyIfStandalone{}
并且它具有完全相同的行为。
此外,当我尝试使用而\includeStandalone[]{}
不是它会引发许多错误,\input{}
包括Something's wrong--perhaps a missing \item
,,,以及更多错误,即使它可以很好地编译(尽管有两个参考部分)Missing } inserted. [\end{document}]
Missing } inserted. [\end{document}]
Extra }, or forgotten \endgroup
\input{}
packages.sty
我还认为这个错误可能与所有文件都在使用其本身使用的事实有关,standalone
但这不应该是问题所在。
答案1
这个问题和讨论反映了对工作所提供的条件的根本误解standalone
。
正如手册所解释的那样,
该类设置
\ifstandalone
为\iftrue
;该包设置
\ifstandalone
为\iffalse
。
它是真还是假并不因包含一个文件与包含另一个文件而变化。它始终要么是真,要么是假。
这是一个演示。
\begin{filecontents}{level1.tex}
\documentclass{standalone}
\usepackage{standalone}
\begin{document}
\ifstandalone True at level 1.
\else False at level 1.
\fi
\input{level2}
\end{document}
\end{filecontents}
\begin{filecontents}{level2.tex}
\documentclass{standalone}
\begin{document}
\ifstandalone True at level 2.
\else False at level 2.
\fi
\end{document}
\end{filecontents}
\documentclass{article}
\usepackage{standalone}
\begin{document}
\ifstandalone True at level 0.
\else False at level 0.
\fi
\input{level1}
\end{document}
首先编译此文件会产生
这里,条件永远不会满足。无论我们是在主文档中,还是在第一个包含文件中,还是在第一个包含文件中的第二个包含文件中,条件\ifstandalone
始终是\iffalse
。
如果我们现在编译level1.tex
,我们得到
此处条件始终满足。无论我们是在顶层还是在包含的文件中,条件\ifstandalone
始终是满足的\iftrue
。
最后,编译level2.tex
产生
这里条件满足。\ifstandalone
是\iftrue
。
您希望根据当前正在读取的文件\ifstandalone
从 更改为\iftrue
。\iffalse
但这不是它的工作设计方式。处于独立模式或不处于独立模式是从到 的整个document
环境的属性。它不应该在 之间改变。\begin{document}
\end{document}
这只是standalone
设计方式的一个特点。按照罐头\ifstandalone
上说的做standalone
。你似乎选错了罐头。要么接受烤豆而不是糖浆,要么把它带回商店要求换成糖浆。但如果你选择后者,你无疑需要支付差价,因为糖浆通常比烤豆更贵。
编辑
我真的不认为这有什么大不了的。你只需要一个条件来做你想做的事。standalone
已经完成了忽略前言等困难的部分。事实上,它没有提供一个现成的条件来满足你的特定需求,这并不是一个明显的缺陷。只需定义一个即可。
\begin{filecontents}{iflevel.tex}
\newif\iftoplevel
\topleveltrue
\newcommand*\inputlevel[1]{%
\begingroup
\toplevelfalse
\input{#1}%
\endgroup
}
\end{filecontents}
\begin{filecontents}{level1.tex}
\documentclass{article}
\usepackage{standalone}
\input{iflevel}
\begin{document}
\iftoplevel True at level 1.
\else False at level 1.
\fi
\inputlevel{level2}
\end{document}
\end{filecontents}
\begin{filecontents}{level2.tex}
\documentclass{article}
\input{iflevel}
\begin{document}
\iftoplevel True at level 2.
\else False at level 2.
\fi
\end{document}
\end{filecontents}
\documentclass{article}
\usepackage{standalone}
\input{iflevel}
\begin{document}
\iftoplevel True at level 0.
\else False at level 0.
\fi
\inputlevel{level1}
\end{document}
按原样编译:
level1.tex
编译为:
level2.tex
编译为:
当然还有更优雅的方法来实现这一点。如果你获取了当前文件名,你就可以进行测试\jobname
,从而避免使用不同的输入宏。
请注意,软件包是人们为了满足需求而创建的。如果您有别人没有解决的问题,请自己动手,并将其放在 CTAN 上。如果您自己不愿意做的事情,而别人没有做,那您就别失望了。
答案2
已编辑 2017 年 3 月 2 日,从overview.tex 加载overviewsubsection.tex
这个答案是从这个答案发展而来的(https://tex.stackexchange.com/a/30000) 考虑使用带有条件的独立文件作为子文件中的标题页。
以下 MWE 生成以下文件:
main.tex
\input
- 这是用于加载包含章节和子章节内容的文件的主文件overview.tex
- 包含该部分内容和两个引文overviewsubsection.tex
- 包含一个引用的子部分内容,由以下人员加载overview.tex
refs1.bib
-bibresource
使用的文件overview.tex
refs2.bib
-bibresource
使用的文件overviewsubsection.tex
pdflatex
在 MWE 上运行以生成每个文件。然后,您可以运行 pdflatex > biber > pdflatex main.tex
(以及 和overview.tex
,overviewsubsection.tex
如果需要,在这种情况下Overview.tex
和overviewsubsection.tex
都有自己的参考书目。MWE 和编译输出main.tex
如下。
\begin{filecontents*}{overview.tex}
\documentclass[a4paper,10pt,preview=false]{article}
\usepackage{standalone}
\usepackage[backend=biber,style=ieee]{biblatex}
\usepackage{lipsum}
\addbibresource{refs1.bib}
\begin{document}
\section{Overview}
Some text here \cite{citation1} and another citation \cite{citation2}
\label{label:Overview}
\input{overviewsubsection}
\ifstandalone
\printbibliography %print references if compiled from here
\fi
\end{document}
\end{filecontents*}
\begin{filecontents*}{overviewsubsection.tex}
\documentclass[a4paper,10pt,preview=false]{article}
\usepackage{standalone}
\usepackage[backend=biber,style=ieee]{biblatex}
\usepackage{lipsum}
\addbibresource{refs2.bib}
\begin{document}
\subsection{subsection To Overview}
Some text here \cite{citation3}
\label{sub:OverviewSubsection}
\ifstandalone
\printbibliography %print references if compiled from here
\fi
\end{document}
\end{filecontents*}
\begin{filecontents*}{refs1.bib}
@article{citation1,
author={Jane Doe},
year={2010},
title={Title 1}
}
@article{citation2,
author={Mike Smith},
year={2010},
title={Title 2}
}
\end{filecontents*}
\begin{filecontents*}{refs2.bib}
@article{citation3,
author={Mark Bart},
year={2004},
title={Title 3}
}
\end{filecontents*}
\begin{filecontents*}{main.tex}
\documentclass[preview=false]{article} %main.tex
\usepackage{standalone}
\usepackage[backend=biber,style=ieee]{biblatex}
\usepackage{lipsum}
\addbibresource{refs1.bib}
\addbibresource{refs2.bib}
\begin{document} % start the body of the text
\input{overview}
\printbibliography
\end{document}
\end{filecontents*}
\documentclass{article}
\begin{document}
\end{document}