我遇到了一个相当奇怪的错误,显然是由于分页符后的 和引用标签的组合而引起\include
的\let\clearpage\relax
。
mylabel
在这个特定的例子中,当引用和标签足够接近分页符时,列表中定义的标签就不能再被引用了。
MWE 由两个文件组成,即主文件和包含文件。我使用命令\let\clearpage\relax
来避免在每\include
. 如果文件不是\input
d \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