![Cleveref 格式,访问标签](https://linux22.com/image/405951/Cleveref%20%E6%A0%BC%E5%BC%8F%EF%BC%8C%E8%AE%BF%E9%97%AE%E6%A0%87%E7%AD%BE.png)
在这个问题提出了一个解决方案来修补cleveref
\crefformat
以便访问最后使用的标签。
不幸的是,该补丁似乎不足以处理将多个标签作为单个\cref{}
命令的参数的情况。特别是范围格式似乎存在问题。
我该如何处理所有情况?
这是一个 MWE(嗯,足够简单):
\documentclass{article}
\usepackage{cleveref}
\usepackage{etoolbox}
\makeatletter
\xdef\@curr@label{?}
\apptocmd{\cref@getref}
{%
\xdef\@curr@label{#1}%
}%
{}{error}
\newrobustcmd{\mytag}{%
\textsuperscript{%
\ensuremath{\to}%
\cpageref{\@curr@label}
(\@curr@label)%
}%
}
\creflabelformat{section}{#2#1#3\mytag{\@curr@label}}%
\makeatother
\begin{document}
\section{Section 1}\label{sec:1}\ldots\clearpage
\section{Section 2}\label{sec:2}\ldots\clearpage
\section{Section 3}\label{sec:3}\ldots\clearpage
\section{Section 4}\label{sec:4}\ldots\clearpage
\section{Section 5}\label{sec:5}\ldots\clearpage
\section{Section 6}\label{sec:6}\ldots\clearpage
\section{Section 7}\label{sec:7}\ldots\clearpage
\section{Test}\label{sec:test}
\begin{itemize}
\item Single cref: \cref{sec:1}
\item Already-sorted range cref: \cref{sec:1,sec:2,sec:3,sec:4}
\item To-be-sorted range cref: \cref{sec:3,sec:2,sec:1,sec:4}
\item To-be-sorted multi-range cref: \cref{sec:5,sec:1,sec:3,sec:2,sec:7,sec:6}
\end{itemize}
\end{document}
这会产生(我仅显示包含“测试”部分的页面):
可以看出,修补程序捕获的突出显示的标签\cref@getref
是错误的,因为它们对应于每个范围中最后一个部分的标签。
我目前的目标是显示指向每个页面的指针\cref
。但是,我相信,只要标签经过处理\cref
(即经过排序和压缩),就可以访问所有标签,这对于许多目的来说都非常有用。
谢谢!
答案1
我找到了一个可能的解决方案。我将其作为候选答案发布在这里,希望能帮助其他人。
显然,理想的方法是让\cref
命令拥有对每个标签的本地访问权限。我希望很快能添加此功能。
无论如何,通过查看cleveref
包的源代码,似乎只需要最后两个使用的标签来处理所有情况。
因此,我们可以简单地修补\@cref@getref
以启用最后两个看到的标签的存储(在两个不同的宏中)。
\documentclass{article}
\usepackage{cleveref}
\usepackage{etoolbox}
\makeatletter
\xdef\@curr@label@prev@last{a?}
\xdef\@curr@label@last{b?}
\apptocmd{\cref@getref}
{%
\xdef\@curr@label@prev@last{\@curr@label@last}%
\xdef\@curr@label@last{#1}%
}%
{}{error}
\newrobustcmd{\mytag}[1]{%
\textsuperscript{%
\ensuremath{\to}%
\cpageref{#1}
(#1)%
}%
}
\creflabelformat{section}{#2#1#3\mytag{\@curr@label@last}}%
\crefrangelabelformat{section}{%
#3#1#4\mytag{\@curr@label@prev@last}
to~#5#2#6\mytag{\@curr@label@last}}%
\makeatother
\begin{document}
\section{Section 1}\label{sec:1}\ldots\clearpage
\section{Section 2}\label{sec:2}\ldots\clearpage
\section{Section 3}\label{sec:3}\ldots\clearpage
\section{Section 4}\label{sec:4}\ldots\clearpage
\section{Section 5}\label{sec:5}\ldots\clearpage
\section{Section 6}\label{sec:6}\ldots\clearpage
\section{Section 7}\label{sec:7}\ldots\clearpage
\section{Test}\label{sec:test}
\begin{itemize}
\item Single cref: \cref{sec:1}
\item Already-sorted range cref: \cref{sec:1,sec:2,sec:3,sec:4}
\item To-be-sorted range cref: \cref{sec:3,sec:2,sec:1,sec:4}
\item To-be-sorted multi-range cref: \cref{sec:5,sec:1,sec:3,sec:2,sec:7,sec:6}
\end{itemize}
\end{document}
正确结果为: