\ref 带有计数器值

\ref 带有计数器值

是否有一些包提供了一个简单的用户界面来返回\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计数器值。foo3

大多数\crt...宏都是可扩展的。

zref包非常复杂,但它没有提供存储计数器值的方法——计数器名称很容易捕获,通过加载 counterzref 模块,在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 上使用...)

相关内容