编辑

编辑

我正在尝试使用独立包将我的大文档分解成较小的文档。

我的文档的结构目前是:

主文本

\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有两个参考部分一个接一个,它们完全相同,包含citation1citation2
当我编译时,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 生成以下文件:

  1. main.tex\input- 这是用于加载包含章节和子章节内容的文件的主文件
  2. overview.tex- 包含该部分内容和两个引文
  3. overviewsubsection.tex- 包含一个引用的子部分内容,由以下人员加载overview.tex
  4. refs1.bib-bibresource使用的文件overview.tex
  5. refs2.bib-bibresource使用的文件overviewsubsection.tex

pdflatex在 MWE 上运行以生成每个文件。然后,您可以运行 pdflatex > biber > pdflatex main.tex(以及 和overview.texoverviewsubsection.tex如果需要,在这种情况下Overview.texoverviewsubsection.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}

在此处输入图片描述

相关内容