在 includeonly 中使用 ifthispageodd 时出现“标签多次定义”

在 includeonly 中使用 ifthispageodd 时出现“标签多次定义”

我正在使用几个\included 文件,其中包含几个 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}

相关内容