这不是一个关于解决问题的问题,因为我已经知道如何解决它了——事实上,有几种方法。我只是想了解到底发生了什么。
这是我的代码示例,精简到了最基本的要素。
\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}