我需要修补宏\cref
,\Cref
以便像这样使用:
\cref{label1,label2,label3}
除了在文档中生成正常布局外,他们还会将类似这样的内容写入 .aux (或 .log)文件:
"label1" referred on page N
"label2" referred on page N
"label3" referred on page N
\cref
其中“N”对应于使用该宏的页码。
结合文件\label
中有关宏的信息.aux
,需要测试文档中的图表是否出现在文本中引用之前的页面上。(目前,我可以\ref
使用此处描述的技术对宏执行此操作:https://tex.stackexchange.com/a/365954/33634)。
不幸的是,我对 LaTeX 的了解不足以实现这个想法。
您能否至少给我一些建议:
- 使用什么来修补(可能
\patchcmd
?)\cref
宏(假设可能) - 如何拆分参数,
\cref
因为它接受用逗号分隔的多个标签 - 如何获取使用宏的页码
我知道我的问题可能有点太复杂,但我希望你能帮助我。
编辑。我尝试采用这里提出的解决方案:https://tex.stackexchange.com/a/365937/33634
\documentclass{article}
\usepackage{etoolbox}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{subcaption}
\newcounter{crefusage}
\AtBeginDocument{\hypersetup{pageanchor=false}
\let\oldcref\cref
\renewcommand{\cref}[1]{{\refstepcounter{crefusage}\label{crefusage:\thecrefusage}\oldcref{#1}\typeout{::#1:: referred on page \getpagerefnumber{crefusage:\thecrefusage}}}}
\robustify\cref
\let\oldCref\Cref
\renewcommand{\Cref}[1]{{\refstepcounter{crefusage}\label{crefusage:\thecrefusage}\oldCref{#1}\typeout{::#1:: referred on page \getpagerefnumber{crefusage:\thecrefusage}}}}
\robustify\Cref
}
\usepackage{blindtext}
\begin{document}
\blindtext[10]
\clearpage
\ref{somefigure}
\cref{somefigure}
\section{First section}\label{firstsec}
\blindtext[5]
\Cref{somefigure}
\blindtext[45]
\cref{somefigure,someotherfigure}
\begin{figure}
\caption{Some figure\cref{someotherfigure}}\label{somefigure}
\end{figure}
\begin{figure}
\caption{Some other figure\cref{somefigure}}\label{someotherfigure}
\end{figure}
\blindtext[50]
\cref{somefigure}
\section{Second section}\label{secondsec}
\end{document}
在日志文件中我得到:
::somefigure:: referred on page 4
::somefigure:: referred on page 5
[4]
::somefigure,someotherfigure:: referred on page 15
[5] [6] [7] [8] [9] [10] [11] [12] [13]
::someotherfigure:: referred on page 0
::someotherfigure:: referred on page 15
[14]
::somefigure:: referred on page 0
::somefigure:: referred on page 15
[15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25]
::somefigure:: referred on page 26
[26] (./test.aux) )
生成::somefigure,someotherfigure:: referred on page 15
的\cref{somefigure,someotherfigure}
不是问题,但我想避免::somefigure:: referred on page 0
由包生成subcaption
。
由于我的目的只是进行检查,因此我使用这个复杂的latexmk
命令来专门生成辅助文件,而不修改原始文件,也就是说,实际上不在序言中写任何内容:
latexmk -pdf -usepretex='\RequirePackage{etoolbox}\newcounter{crefusage}\makeatletter\AtBeginDocument{\hypersetup{pageanchor=false}\let\oldcref\cref\renewcommand{\cref}[1]{{\refstepcounter{crefusage}\label{crefusage:\thecrefusage}\oldcref{#1}\typeout{::#1:: 在第 \getpagerefnumber{crefusage:\thecrefusage}}}}\robustify\cref\let\oldCref\Cref\renewcommand{\Cref}[1]{{\refstepcounter{crefusage}\label{crefusage:\thecrefusage}\oldCref{#1}\typeout{::#1:: 在第\getpagerefnumber{crefusage:\thecrefusage}}}\robustify\Cref}\makeatother' -pdflatex='export max_print_line=1000; touch %D; pdflatex -draftmode %O %P' -output-directory=/tmp -jobname=floatsCrefPosCheck test.tex
我不知道这个解决方案是否强大且可靠。我希望你能帮助我理解并找到最佳解决方案。
已添加注释。在之前的文章中 (检查浮动元素是否出现在它们被首次引用的页面之前),我认为我在问是否存在特定的软件包,甚至是不同的方法(例如,通过分析 .pdf)来解决我的问题。然而,在这篇文章中,我寻求更具体的帮助,使用我过去已经处理过的方法来解决该问题。从我的角度来看,这两个问题是相关的,但仍然是不同的和独立的。如果我让任何人感到不安,我很抱歉。