这确实是一个不重要的好奇/痒问题。我在一本书中有一些章节可以编入整本书中,也可以单独编入。最后,文件有如下语句:
\ifchapteronly\end{document}\fi
这工作正常,但给出了关于嵌套的警告\if
。我推测没有办法避免它,但如果有的话,我很想知道。
答案1
该文件的结构是怎样的?
你可能遇到类似的事情
%% file main.tex
\def\thisisthewholebook{}
\documentclass{book}
\input{commonsetup}
\begin{document}
\input{chapter1}
\input{chapter2}
\input{chapter3}
%...
\end{document}
那么你有
%% file commonsetup.tex
% define the conditional end
\newcommand{\maybeendhere}{%
\ifdefined\thisisthewholebook\else\expandafter\yesendhere\fi
}
\newcommand{\yesendhere}{\end{document}}
%%%
%<packages and settings>
章节文件将有
% file chapter1.tex
\ifdefined\thisisthewholebook\else
\documentclass{book}
\input{commonsetup}
\begin{document}
\fi
Text for the first chapter
\maybeendhere
答案2
重点是在\fi
之前执行\end{document}
。有很多方法可以做到这一点。我会在序言中定义:
\makeatletter
\def\endifchapteronly{%
\ifchapteronly
\expandafter\@secondoftwo
\fi
\@gobble{\end{document}}}
\makeatother
\endifchapteronly
然后在需要时使用。\expandafter
扩展\fi
,然后\@secondoftwo
使用\end{document}
。
您也可以使用expl3
。 expl3
条件总是\fi
在运行真或假分支之前展开:
\ExplSyntaxOn
\NewDocumentCommand \endifchapteronly { }
{
\legacy_if:nT { chapteronly }
{ \end{document} }
}
\ExplSyntaxOff
或者,如果你更喜欢特别指定单行:
\expanded{\ifchapteronly \noexpand\end{document} \fi}
PS:这个答案假设你没有使用\include
。包含在其中的文件\include
本身在两个条件内读取,因此你需要终止三个\fi
。但\include
它有自己的\includeonly
机制,所以你无论如何都不需要这个装置
答案3
之间的切换\fi
可以通过宏来完成\afterfi
:
\def\afterfi#1#2\fi{\fi#1}
\ifchapteronly\afterfi{\end{document}}\fi