修补 \cref 和 \Cref,将附加信息写入 .aux 文件

修补 \cref 和 \Cref,将附加信息写入 .aux 文件

我需要修补宏\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)来解决我的问题。然而,在这篇文章中,我寻求更具体的帮助,使用我过去已经处理过的方法来解决该问题。从我的角度来看,这两个问题是相关的,但仍然是不同的和独立的。如果我让任何人感到不安,我很抱歉。

相关内容