概括:

概括:

我遇到了一个相当奇怪的错误,显然是由于分页符后的 和引用标签的组合而引起\include\let\clearpage\relax

mylabel在这个特定的例子中,当引用和标签足够接近分页符时,列表中定义的标签就不能再被引用了。

MWE 由两个文件组成,即主文件和包含文件。我使用命令\let\clearpage\relax避免在每\include. 如果文件不是\inputd \include,则不会发生该错误。

\documentclass[11pt,twoside]{book} % 
\usepackage[utf8]{inputenc} % Enoding
\usepackage[english]{babel} % Language
\usepackage{listings}
\usepackage{forloop}

\begin{document}
\begingroup
\let\clearpage\relax

\include{includedfile} % changing include for input would work

\endgroup
\end{document}

包含的文件:

\newcounter{ct}
\forloop{ct}{1}{\value{ct} < 40}%
{%
    .\\
}

Listing \ref{mylabel}.

\begin{lstlisting}[caption=somecaption, label=mylabel]
some code;
\end{lstlisting}

运行此示例将会出现无法引用标签的输出(即使经过多次运行):

输出示例

现在,一种解决方案是使用\input前面提到的,但我对为什么会发生这种情况很感兴趣。该命令是否对引用的工作起着重要作用?在使用时\clearpage不删除是否可以避免错误?\let\clearpage\relax\include

编辑:我刚刚发现这个问题有同样的问题(尽管没有明确的答案)。

答案1

\include使用单独的.aux文件。如果不包含该文件,.aux仍会读取该文件,并且该文件的引用.aux可用。

.aux可以\immediate在页面输出时将条目写入文件。因此开始\include新的一页。因此,上一页的标签进入上一个.aux文件。然后.aux立即切换文件(\immediate\openout)。标签进入.aux包含文件的文件中。处理完包含的文件后,\include调用\clearpage输出包含文件的任何内容,包括标签,这些内容进入文件.aux\include然后再次.aux切换文件,立即关闭包含.aux文件,下一次写入.aux文件将进入主.aux文件。

您将\let\clearpage\relax破坏 的功能\include。在问题的情况下,包含文件的最后一页包含标签。已发送的页面包含将标签写入文件的命令includedfile.aux。但页面在 结束之前尚未发送,\include并且 的文件句柄includedfile.aux关闭. TeX 随后将写入请求重定向到下一个 shipout 页面中已关闭的文件句柄.log,您将在其中找到:

\newlabel{mylabel}{{1}{2}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}somecaption}{2}}

并且列表列表中的条目将会丢失。

概括:

闪光大胆红色


按照 kan 的要求,附录为“闪光的东西”的代码:

\documentclass{article}
\pagestyle{empty}
\usepackage{xcolor}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\begin{document}
\newcommand*{\doit}[2][]{%
  \ifx\\#1\\%
    \color{#2}%
  \else
    \color[{#1}]{#2}%
  \fi
  \noindent
  \Large
  \sffamily
  \bfseries
  Never disable page breaks with %
  \texttt{\textbackslash include}!\\
  Use \texttt{\textbackslash input} instead.
  \newpage
}
\newcommand*{\x}[1]{%
  \doit[Hsb]{0,1,1}%
  \doit[Hsb]{#1,1,1}%
}
\x{30}
\x{60}
\x{90}
\x{120}
\x{150}
\x{180}
\x{210}
\x{240}
\x{270}
\x{300}
\x{330}
\end{document}

然后

pdflatex test
pdfcrop test.pdf
gs -sDEVICE=png256 -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 -dPDFSETTINGS=/prepress -dUseFastColor=true -r216x216 -sOutputFile=test%d.png -ftest-crop.pdf
convert -delay 30 -loop 0 test1.png test2.png test3.png test4.png test5.png test6.png test7.png test8.png test9.png test10.png test11.png test12.png test13.png test14.png test15.png test16.png test17.png test18.png test19.png test20.png test21.png test22.png test.gif

相关内容