如何避免 \ifsomething \end{document} \fi 上的警告

如何避免 \ifsomething \end{document} \fi 上的警告

这确实是一个不重要的好奇/痒问题。我在一本书中有一些章节可以编入整本书中,也可以单独编入。最后,文件有如下语句:

\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}

您也可以使用expl3expl3条件总是\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

相关内容