如何强制标签为给定的字符串?

如何强制标签为给定的字符串?

通常我会发出类似这样的命令\label{foo},这意味着 foo 会被输入到某个符号表中,表示它等于 14、xiv、aa 或其他数字。这些符号会自动生成和递增,要更改数字系统,我可以使用类似这样的软件包alphalph

假设我想强制 foo 求值为某个任意字符串,例如“Socrates”。例如,我想要类似 的内容\mynameis{Socrates}\label{foo},然后当我说 时\ref{foo},结果将不是“14”而是“Socrates”。

我想完全绕过涉及计数器的正常系统。如果苏格拉底是一章的名称,那么我不指望 LaTeX 足够聪明,能够自动将下一章命名为柏拉图。因此,例如:

\chapter{The life of Socrates}\mynameis{Socrates}\label{foo}
...
\chapter{The life of Plato}\label{bar}
...

bar这是我的错误。如果设置为垃圾,或者 LaTeX 阻塞,或者bar设置为某个任意字符串(例如),我都可以接受Socrates2

有没有什么办法可以做到这一点?

答案1

这相当简单:

在此处输入图片描述

\documentclass{article}
\makeatletter
\newcommand{\mynameis}[1]{#1\renewcommand{\@currentlabel}{#1}}
\makeatother
\begin{document}
\mynameis{Socrates}\label{foo}%

Do you know about \ref{foo}?
\end{document}

\@currentlabel是使用时存储的宏\label(除了\thepage)。因此,我们所做的就是在调用 之前根据自己的喜好更新它\label

如果你希望它兼容hyperref,您可以发布额外的信息\phantomsection,以使超链接正确(也许还可以更新\@currentlabelname

在此处输入图片描述

\documentclass{article}
\usepackage{hyperref}
\makeatletter
\newcommand{\mynameis}[1]{%
  \phantomsection#1% Mark hyperlink
  \renewcommand{\@currentlabel}{#1}%
  \renewcommand{\@currentlabelname}{#1}}
\makeatother
\begin{document}
\mynameis{Socrates}\label{foo}%

Do you know about \ref{foo} or \nameref{foo}?
\end{document}

有关交叉引用的更多信息,请参阅了解引用和标签的工作原理

相关内容