奇怪的交叉引用行为

奇怪的交叉引用行为

这不是一个关于解决问题的问题,因为我已经知道如何解决它了——事实上,有几种方法。我只是想了解到底发生了什么。

这是我的代码示例,精简到了最基本的要素。

\documentclass[a4paper]{article}

\setlength{\textwidth}{150mm}
\setlength{\textheight}{225mm}

\usepackage{graphicx}

\newcommand{\includePicture}[2]{\begin{center}\includegraphics[width=#1\linewidth]{#2}\end{center}}

\begin{document}
\section{First section}
Reference page \pageref{examplePicturePage}.

\section{Second section}
\includePicture{0.9}{example-image-10x16}\label{examplePicturePage}
\end{document}

无论代码编译了多少次(pdflatex),这都会生成未定义的页面引用。如果长度\textwidth减小一毫米,或者\textheight长度增加一毫米,错误就会消失。在这种情况下,删除命令定义中的\begin{centre}\end{centre}也会使错误消失,无论和\textwidth定义如何\textheight(我为输入了 2mm \textheight,仍然没有未定义的引用。)

因此,我猜想存在溢出,当包含的图片(格式化为指定宽度)太长而无法容纳在页面上时。我认为发生的情况是,溢出发生在中心环境中处理所有内容时。然后,关闭\end{centre}该环境,处理继续到新页面。但新页面上没有内容,除了命令之外什么都没有\label。因此,这成为对不存在页面的引用。但是,当中心环境被删除时,\label在我们被推到第二页之前,会先处理。

对此问题最明显的解决办法是,不要放置对于页面来说太大的图像,但我只是想确保我对正在发生的事情的理解是正确的。是吗?

根据 Mico 的建议进行了编辑:原始示例没有计数器(实际文档有,但我将其删除);我现在添加了部分命令,以消除关于问题是 \pageref 还是 \ref 的混淆。在当前版本中,问题本质上与 \pageref 或 \ref 相同。

根据 Torbjørn T. 的建议进行编辑 - 使用示例图像使文件自包含,无需其他文件。

答案1

你运气不好,但你的命令仍然定义不明确。

实际情况是,center环境会在它之前和之后添加垂直空间。\label当页面已被弹出时,这将被评估;由于没有更多可用的垂直材料,因此\label指的是没有页面。

应该\label里面无论如何,图片旁边的环境center或页面引用可能是不正确的。

我建议做

\newcommand{\includePicture}[3][]{%
  \begin{center}
  \includegraphics[width=#2\linewidth]{#3}%
  #1% some material, possibly the \label
  \end{center}
}

并称之为

\includePicture[\label{examplePicturePage}]{0.9}{example-image-10x16}

您还可以使分数成为可选的,但在这种情况下,最好更改语法,将其\label作为尾随可选参数。

\documentclass[a4paper]{article}
\usepackage{xparse}
\usepackage{graphicx}

\setlength{\textwidth}{150mm}
\setlength{\textheight}{225mm}

\NewDocumentCommand{\includePicture}{O{0.9} m O{}}{%
  \begin{center}
  \includegraphics[width=#1\linewidth]{#2}%
  #3% some material, possibly the \label
  \end{center}
}

\begin{document}

\section{First section}
Reference page \pageref{examplePicturePage}.

\includePicture[0.2]{example-image}

\section{Second section}
\includePicture{example-image-10x16}[\label{examplePicturePage}]

\end{document}

相关内容