![\ref 带有计数器值](https://linux22.com/image/388295/%5Cref%20%E5%B8%A6%E6%9C%89%E8%AE%A1%E6%95%B0%E5%99%A8%E5%80%BC.png)
是否有一些包提供了一个简单的用户界面来返回\ref
标签的计数器值(数字,而不是格式化的交叉引用)? 似乎zref
、 not refcount
、 norcleveref
等都没有提供它。cleveref
将计数器值保存到aux
文件中,但我在文档中找不到用于检索它的宏(例如,\numbercref
),即使内部有一个\cref@getcounter
用于它的宏。
请注意,我不是在问怎么做,只是问是否有一个简单的包用户界面。
答案1
crossreftools
我大约在一年前写过,这个包cleveref
用从标签中提取信息\crtcrefnumber
,它保存了计数器的数字,使用特殊的方式cleveref
将信息存储在标签中。
传统标签不支持这一点,因为这些标签适用于\thefoo
,这意味着像 这样的内容\renewcommand{\thefoo}{\arabic{chapter}.\Roman{section}.\Alph{foo}}
将存储4.II.C
。这种方式将报告通常的参考值,但不报告上例中的的\crtrefnumber
计数器值。foo
3
大多数\crt...
宏都是可扩展的。
该zref
包非常复杂,但它没有提供存储计数器值的方法——计数器名称很容易捕获,通过加载 counter
zref 模块,在zref
最后看到一个可能的解决方案。
为了实现这一点,必须定义一个新属性,\zref@newprop
然后使用 将其添加到主属性列表中\zref@addprop
。
总的来说,crossreftools
它并不具有侵入性,因为它只是重新评估已存储的标签宏,而第二种解决方案会有所改变\refstepcounter
(不过改变幅度很小)。如果要在标签中存储更多信息,这zref
很可能是更好的方法。
\documentclass{book}
\usepackage{cleveref}
\usepackage{crossreftools}
\begin{document}
See \crtrefnumber{foosec} or \crtcrefnumber{foosec}
\chapter{Foo}
\setcounter{section}{99}
\section{A foo section} \label{foosec}
\end{document}
更新
这是带有的版本zref
,它存储了最后使用的计数器的名称\refstepcounter
,然后使用提取值\zlabels
。
\documentclass{book}
\usepackage[user,counter]{zref}
\setcounter{secnumdepth}{4}
\makeatletter
\AtBeginDocument{%
\let\originalrefstepcounter\refstepcounter%
\renewcommand{\refstepcounter}[1]{%
\xdef\@@lastrefsteppedcounter{#1}%
\originalrefstepcounter{#1}%
}
}
\zref@newprop{value}[-100000]{\number\value{\@@lastrefsteppedcounter}}
\zref@addprop{main}{value}
\newcommand{\counterref}[1]{%
\zref@extract{#1}{value}%
}
\makeatother
\usepackage{cleveref}
\usepackage{crossreftools}
\counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
\newcommand{\foosectionnumber}{100}
\newcommand{\foosubsectionnumber}{20}
\newcommand{\foosubsubsectionnumber}{44}
\newcommand{\einsteinnumber}{1905}
\newcommand{\foofigurenumber}{2018}
\begin{document}
\newcommand{\tableentryline}[2]{%
\tabularnewline
#1 & #2 & \crtrefnumber{#1} & \crtcrefnumber{#1} & \counterref{#1} \tabularnewline
\tabularnewline
\hline
}
\begin{tabular}{lllll}
label & Expected value & \verb!\crtrefnumber! & \verb!\crtcrefnumber! & \verb!\counterref! \tabularnewline
\hline
\tableentryline{foosec}{\foosectionnumber}
\tableentryline{foosubsec}{\foosubsectionnumber}
\tableentryline{foosubsubsec}{\foosubsubsectionnumber}
\tableentryline{einstein}{\einsteinnumber}
\tableentryline{foofigure}{\foofigurenumber}
\end{tabular}
\chapter{Foo}
\setcounter{equation}{\numexpr\einsteinnumber-1}
\setcounter{section}{\numexpr\foosectionnumber-1}
\setcounter{figure}{\numexpr\foofigurenumber-1}
\section{A foo section} \label{foosec}\zlabel{foosec}
\setcounter{subsection}{\numexpr\foosubsectionnumber-1}
\subsection{A foo subsection} \label{foosubsec} \zlabel{foosubsec}
\setcounter{subsubsection}{\numexpr\foosubsubsectionnumber-1}
\subsubsection{A foo subsubsection} \label{foosubsubsec} \zlabel{foosubsubsec}
\begin{equation}
E= mc^{2} \label{einstein} \zlabel{einstein}
\end{equation}
\begin{figure}
\caption{foofigure} \label{foofigure} \zlabel{foofigure}
\end{figure}
\end{document}
再次更新
类似于(参见下面 Javier Bezos 的评论)
\setcounter{foo}{\crtcrefnumber{foostuff}}
会因为一开始的\crtcrefnumber
报告而失败,即第一次运行。这当然会中断[UNDEFINED]
\setcounter
因此,我添加了一个为“安全”计数器值设计的新宏,即 报告1977 年(TeX 发明的年份 ;-))\crtcrefcountervalue
的内容。\crtcrefundefinedcountervalue
我将此代码添加到包中(\makeatletter...\makeatother
当然没有这对),并将新版本上传crossreftools
到 CTAN。
\makeatletter
\newcommand{\crt@crefundefinedcountervalue}{1977}
\newcommand{\crtrefundefinedcountervalue}[1]{\renewcommand{\crt@refundefinedcountervalue}{#1}}
\newcommand{\crtcrefcountervalue}[1]{%
\crtcrefifundefinedlabel{#1}{%
\crt@crefundefinedcountervalue%
}{%
\crtcrefnumber{#1}%
}%
}
\makeatother
更新时间 2019/01/06 21:04 (CET)
crossreftools v0.9
可以在 TeXLive 上使用(并且很可能也可以在 MikTeX 上使用...)