更新: 我已经更新了这个问题和相应的代码。在收到以下一些宝贵的建议后,对最小工作示例代码进行了彻底修改@Johannes_B关于如何使其更简洁。所以,非常感谢他!:)
在我的论文中,我使用\pagenumbering{arabic}
(默认页码方案)主要事项以及\pagenumbering{Roman}
补充材料。这两个部分都包括表格/图形/列表/方程式等。此外,我还使用cleveref
排版交叉引用并hyperref
链接它们。
有不超过 4-5 次,我不得不集体参考主要事项也补充材料,在正文中。当然,我像往常一样使用了\cref{}
和\cpageref{}
中的命令组合cleveref
。
的输出\cref{}
很好,完全符合预期。但是,如果它包含论文的两个部分( &编号)\cpageref{}
的标签,则会失败。arabic
Roman
例如,从下面给出的 MWE 来看,由于\cpageref{}
仅line 47
包含主要事项标签,它起作用了!但是,只需从补充材料并且它将会失败!(开启line 52
)..所以,
\hspace*{\fill}THIS IS FINE! \textendash\ Pages: \cpageref{main,mainA}\hspace*{\fill}\\[4pt]
%......... ~on line 47~
... 作品,因为main, mainA
只属于主要内容。但是,
%\hspace*{-1pt}\hspace*{\fill}Now comes the Troublemaker \textendash\ Pages:
%\cpageref{main,mainA,supp}\hspace*{\fill}\\[4pt] %......... ~on line 52~
...失败,因为main, mainA
属于主要事项(arabic
)&supp
属于补充材料(Roman
)。 然而,
\hspace*{\fill}\cpageref{main,mainA} and \cpageref{supp}\hspace*{\fill} % see below!
%......... ~on line 32~
... 有效,因为\cpageref{}
对arabic
&部分的标签发出了单独的命令。它表明,如果 每次接收一个参数,Roman
就不会出现任何问题。\cpageref{}
*.log
给定 MWE 的对应文件显示以下错误消息:
! Missing number, treated as zero.
<to be read again>
I
l.56 }
% % end fbox
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
请注意,删除多个页码对我来说不是一个可接受的选择。此外,此问题的解决方案是否hyperref
也可以兼容?
以下是最小的工作示例,只需取消注释 line 52
产生错误!
梅威瑟:
\documentclass{report}
\usepackage[%
dvipsnames,
svgnames,
x11names,
table
]{xcolor}
\usepackage{blindtext}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{cleveref}
\definecolor{dodgerblue3}{RGB}{24,116,205} % 'hyperref' linkcolour
\hbadness=10000
\setlength{\fboxrule}{0.005pt}
\hypersetup{%
plainpages=false,
hypertexnames=true,
colorlinks=true,
linkcolor=dodgerblue3
}%
%%%%% %%%%%
% This code generates: Main matter (2 pages) + Supplementary matter (2 pages) %
%%%%% %%%%%
\begin{document}
\setcounter{chapter}{1}
\chapter{Main Test Chapter}
{ % begin group
\Large%
\hspace*{\fill}%
\fbox{% % begin fbox
\parbox[c][2cm][c]{0.95\textwidth}{% % begin parbox
\noindent
\hspace*{\fill}\Cref{main,mainA,supp} given on following pages %
\textendash\hspace*{\fill}\\[8pt]
\hspace*{\fill}\cpageref{main,mainA} and \cpageref{supp}\hspace*{\fill} % see below!
}% % end parbox
}% % end fbox
\hspace*{\fill}% % required empty line!
\vspace*{3ex}%
\hspace*{-12pt}\hspace*{\fill}\rule{1.5in}{0.01pt}\hspace*{\fill}%
\vspace*{3ex}% % required empty line!
\noindent
\hspace*{4pt}
\hspace*{\fill}%
\fbox{% % begin fbox
\parbox[c][2.4cm][c]{0.94\textwidth}{% % begin parbox
%
\hspace*{\fill}THIS IS FINE! \textendash\ Pages: \cpageref{main,mainA}%
\hspace*{\fill}\\[4pt]
%
%%%%% %%%%%
%%%%%%%%% Uncomment following line to generate ERROR! %%%%%%%%%
%%%%% %%%%%
%\hspace*{-1pt}\hspace*{\fill}Now comes the Troublemaker \textendash\ Pages: %
%\cpageref{main,mainA,supp}\hspace*{\fill}\\[4pt]%,supp}
%
\hspace*{\fill}And now comes a Good Child \textendash\ Pages: \pageref{main}, %
\pageref{mainA}, \& \pageref{supp}.\hspace*{\fill}%
%
% Note: Above, \pageref{} was used, only to compare!
%
}% % end parbox
}% % end fbox
\hspace*{\fill}%
} % end group
{ % begin group
\renewcommand{\figurename}{\Large Figure}
\vspace*{0.2in}
\captionof{figure}{\Large First SUB-FLOAT}
\label{mainA}
\vspace*{0.2in}
\blindtext[1]
\cleardoublepage
\vspace*{0.3in}
\captionof{figure}{\Large First SUB-FLOAT}
\label{main}
\vspace*{2in}
\blindtext[2]
} % end group
\cleardoublepage
{ % begin group
\pagenumbering{Roman}
\setcounter{chapter}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\renewcommand{\thechapter}{\Roman{chapter}}
\renewcommand{\figurename}{\Large Supplemental Figure}
\chapter{Supplementary Test Chapter}
\vspace*{1in}
\captionof{figure}{\Large First SUB-FLOAT}
\label{supp}
\vspace*{1in}
\blindtext[5]
} % end group
\cleardoublepage
\end{document}
这是第一页的快照(处于“非错误模式”!):
请帮忙!提前致谢!
答案1
TLDR;使用多种页码方案的文档中的页面引用应该在cleveref
我的网站提供的最新预发布版本 (0.21) 中得到修复:http://dr-qubit.org/latex.html
如果您对详细信息感兴趣...
“缺失数字,视为零”错误是由于cleveref
排序和压缩代码隐式假设所有页码都是数字而导致的。(至少任何使用\cpageref
等进行交叉引用的数字都是如此。我猜之前没有人报告过这个明显的错误,这从经验上证明了很少有人在其文档的前言中交叉引用页面。)
这个编译错误相对容易修复,通过将页面计数器的数值与\thepage
生成的内容一起存储在辅助文件中,并将其用于排序和压缩。(就像cleveref
对标签所做的那样。)
但是,在具有多种页码方案的文档中,正确地对页面引用进行排序和压缩会更加困难。尽管它们具有相同的页码计数器值,但我们不希望将“第 i 页”和“第 1 页”压缩为单个引用。而且,在排序时,“第 i-iii 页和第 1-3 页”优于“第 i、1、ii、2、iii 和 3 页”。弄清楚如何正确地对页面引用进行分组很棘手,因为\thepage
可以重新定义以产生任意输出。例如,如果一种页码方案将页面标记为“第一、第二、第三……”,而同一文档中其他地方的另一种编号方案将页面标记为“primus、secundus、tertius……”,cleveref 如何确定将“quintus”分配给哪个组?TeX 是图灵完备的,因此在最坏的情况下,解决这个问题通常需要解决停机问题!
我采用的解决方案是根据\thepage
页码计数器值为 1 的格式对页面引用进行分组,根据定义的\thepage
宏进行操作\label
。这可能会将文档不同部分的页面分组或压缩,而这些页面的页码编号方案恰好与第 1 页的格式相同。但这会使页码编号方案非常混乱!除了解决 TeX 中的停机问题外,这似乎是一种很好的启发式方法。
为了实现这一点,cleveref 的最新预发布版本 (0.21) 彻底改造了页面引用逻辑,在内部使用与标签引用相同的代码路径。页面引用的“类型”会自动设置为\thepage
页面计数器值为 1 时产生的任何值,如上所述。目前无法手动覆盖页面引用“类型”(对于标签类型,可以通过将可选参数传递给 来覆盖\label
)。但如果有这方面的需求,现在添加起来并不困难。
最后一个附带好处是,页面引用压缩和排序现在应该可以在具有每章(或每节)页码的文档中正常工作,只要它们将章节号添加到排版页码的前面(或节号,无论使用什么唯一的前缀*chappg
来区分第 1 章中的第 1 页和第 2 章中的第 1 页)。特别是,cleveref 现在应该与该包兼容。
* 如果不添加这样的前缀,那么第 1 章中的“第 1 页”与第 2 章中的“第 1 页”无论如何都无法区分,因此 cleveref 无法在这种情况下合理地对页码引用进行排序。如果您想这样做,您只能靠自己了!