Cleveref 格式,访问标签

Cleveref 格式,访问标签

这个问题提出了一个解决方案来修补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}

这会产生(我仅显示包含“测试”部分的页面):

摘自第 8 页

可以看出,修补程序捕获的突出显示的标签\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}

正确结果为:

摘自第 8 页

相关内容