通常我会发出类似这样的命令\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}
有关交叉引用的更多信息,请参阅了解引用和标签的工作原理。