我正在使用几个\include
d 文件,其中包含几个 KOMAs\ifthispageodd
机制实例,如以下 MWE 所示:
\documentclass{scrbook}
\begin{filecontents}{fileA.tex}
\ifthispageodd{odd Page}{even Page}
\end{filecontents}
\begin{filecontents}{fileB.tex}
\ifthispageodd{odd Page}{even Page}
\end{filecontents}
% Uncomment the following line to get
% LaTeX Warning: Label `1' multiply defined.
%\includeonly{fileB}
\begin{document}
\include{fileA}
\include{fileB}
\end{document}
一旦我使用\includeonly
其中一个\ifthispageodd
实例不是包括,pdfLaTeX 将发布
LaTeX 警告:标签“1”被多次定义。
而且可能还会有更多,并且数量还在不断增加。
这些警告并不有害,而且据我观察,其\ifthispageodd
工作符合预期,可能是因为scrguien.pdf
(第 72 页)中提到的启发式方法:
由于该
\ifthispageodd
命令使用与标签及其引用非常相似的机制,因此每次修改文本后至少需要运行两次 LaTeX。只有这样,决策才是正确的。在第一次运行中,使用启发式方法做出第一次选择。
答案1
scrbook
尝试使用宏存储递增值来保存计数器,但这意味着\include
即使未包含该文件,它也不会被用于保存计数器以供后面章节使用的机制所看到。
可以修改恢复机制来保存宏,但我认为更简单、更安全的方法是使用乳胶计数器:
如果您删除现有的辅助文件,运行包含两个文件的程序,然后再次包含第二个文件,这样就可以避免出现警告。
\documentclass{scrbook}
\begin{filecontents}{fileA.tex}
\ifthispageodd{odd Page}{even Page}
\end{filecontents}
\begin{filecontents}{fileB.tex}
\ifthispageodd{odd Page}{even Page}
\end{filecontents}
% Uncomment the following line to get
% LaTeX Warning: Label `1' multiply defined.
\includeonly{fileB}
\newcounter{scbookpg}
\makeatletter
\renewcommand*{\is@thispageodd}{%
\@bsphack
\begingroup
%\@tempcnta=\scr@tpo
%\advance\@tempcnta by\@ne
\stepcounter{scbookpg}%
\xdef\scr@tpo{\thescbookpg}%
\protected@write\@auxout{\let\arabic\relax}{%
\string\new@tpo@label{\scr@tpo}{\arabic{page}}}%
\expandafter\ifx\csname tpo@\scr@tpo\endcsname\relax
\protect\G@refundefinedtrue
\ClassWarning{\KOMAClassName}{%
odd/even page label number \scr@tpo\space undefined}%
\edef\@tempa{\the\value{page}}%
\else
\edef\@tempa{\csname tpo@\scr@tpo\endcsname}%
\fi
\ifodd\number\@tempa
\aftergroup\thispagewasoddtrue
\else
\aftergroup\thispagewasoddfalse
\fi
\endgroup
\@esphack
}
\makeatletter
\begin{document}
\include{fileA}
\include{fileB}
\end{document}