大多数可以引用的东西,例如分段命令、图形、表格、定理等,似乎都有与之关联的计数器,LaTeX 引用系统使用这些计数器来跟踪所有内容。所有可参考的事物都是如此吗?
继我的较早 问题,我正在想办法收集环境列表,以便稍后在文档中引用它们。环境定义的要求之一是 — — 这是最难的部分 — — 编号需要由包用户配置。
我正在考虑使用两个类似计数器的东西,其中一个是用于引用的“真实”计数器,另一个是用户将自定义的“显示”计数器。当引用其中一个环境的实例时,LaTeX 内部应该使用前一个计数器,但在标签中显示后一个计数器。目前这一切都有点模糊,而且我承认我还没有 MWE,但 90% 的编码都是思考和计划,我不知道我所寻求的是否可行。
答案1
标签利用的常用机制是每次使用\@currentlabel
时重新定义的“临时”宏。基本上包含计数器步进后的扩展值。\refstepcounter
\@currentlabel
\theX
X
但\@currentlabel
基本上可以在任何地方使用来包含“任何东西”,并且以下内容\label
(在同一组内)将获取该\@currentlabel
值,最终依赖标签名称真正连接到计数器并不是一个好主意。
同样的情况也适用于使用\@currentlabelname
时通常保存某个部分的名称。\nameref
\autoref
然而,和所有其他相关的宏hyperref
都依赖于超锚点,因此在这里使用\phantomsection
是合适的。
有关提取计数器信息的更多信息refcount
,您可以使用zref
Heiko Oberdiek 或我的“简短”包crossreftools
,该包将在接下来的几天内更新。
当然,下面的例子相当“学术”:
\documentclass{article}
\usepackage{blindtext}
\usepackage{hyperref}
\makeatletter
\newcommand{\fakelabel}[2]{%
\phantomsection%
\protected@edef\@currentlabel{#1}%
\protected@edef\@currentlabelname{#2}#1%
}
\makeatother
\begin{document}
\begin{tabular}{ll}
\fakelabel{This is a table cell}{But is given a different name}\label{table:cell}
\end{tabular}
\clearpage
See \ref{table:cell} or \nameref{table:cell}
\end{document}
使用 crossreftools v0.4
有一个宏\crtcrossreflabel
可以“立即”进行伪标记:
\documentclass{article}
\usepackage{blindtext}
\usepackage{hyperref}
\usepackage{crossreftools}
\begin{document}
\begin{tabular}{ll}
\crtcrossreflabel[But is given a different name]{This is a table cell}[table:cell]
\end{tabular}
\clearpage
See \ref{table:cell} or \nameref{table:cell}
\end{document}
crossreftools
CTAN、TL 和 MikTeX 提供 v0.8。