Cleveref 的 \cpageref{} 命令在使用(至少)两种页码方案的文档中使用时,会导致“缺少数字,视为零”错误

Cleveref 的 \cpageref{} 命令在使用(至少)两种页码方案的文档中使用时,会导致“缺少数字,视为零”错误

更新: 我已经更新了这个问题和相应的代码。在收到以下一些宝贵的建议后,对最小工作示例代码进行了彻底修改@Johannes_B关于如何使其更简洁。所以,非常感谢他!:)


在我的论文中,我使用\pagenumbering{arabic}(默认页码方案)主要事项以及\pagenumbering{Roman}补充材料。这两个部分都包括表格/图形/列表/方程式等。此外,我还使用cleveref排版交叉引用并hyperref链接它们。

有不超过 4-5 次,我不得不集体参考主要事项补充材料,在正文中。当然,我像往常一样使用了\cref{}\cpageref{}中的命令组合cleveref

的输出\cref{}很好,完全符合预期。但是,如果它包含论文的两个部分( &编号)\cpageref{}的标签,则会失败。arabicRoman

例如,从下面给出的 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 无法在这种情况下合理地对页码引用进行排序。如果您想这样做,您只能靠自己了!

相关内容