我正在尝试实现类似于 autoref 的功能,但更具可定制性。具体来说,我正在制作一个命令,该命令接受标签的名称以及引用该标签时应输出的文本。然后使用包 hyperref,可以轻松创建一个输出所需文本的命令:
\newcommand{\hlink}[1]{\hyperref[label text #1]{\csname label text #1\endcsname}}
所有这些背景都不是真正的问题。问题是,有时像字体选择这样的事情会搞砸这一切。真正的问题是如何扩展和保存临时信息而不扩展字体选择之类的东西。特别是,我目前可以按如下方式将链接文本分配给标签文本:假设\tempinfo
是我想要存储的一些临时信息。
\def\tempinfo{AAA}
\expandafter\label{label text \tempinfo}
\expandafter\xdef\csname label text \tempinfo\endcsname{blah link text \tempinfo}
现在\tempinfo
已保存在命令中。如果我更改\tempinfo
,我仍然会得到相同的输出:
\csname label text AAA\endcsname\\
\def\tempinfo{BBB}
\csname label text AAA\endcsname
输出
blah 链接文本 AAA
blah 链接文本 AAA
到目前为止一切顺利,但如果blah link text
我想要$\mathrm{blah}$
或,该怎么办\textit{italics}
?我不能再使用\xdef
(或\edef
) ,否则会出错。但如果我只是使用\def
,\tempinfo
则不会保存。运行与之前相同的操作,但将“ \xdef
”替换为“ \def
”会产生
等等 链接文本 AAA
等等 链接文本 BBB
所以我不确定是否有办法解决这个问题,或者是否有我尚未找到的更好的解决方案。
编辑:这是一个例子。目前,\hlink
返回的The Example Theorem (0.1)
“示例”没有任何格式,我希望能够将其(例如)斜体化,或以 \mathrm 格式显示,或类似格式。
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\newtheorem{theorem}{Theorem}[section]
\newcommand{\labeldef}[2]{%
\def\templabelname{#1}%
\label{label text \templabelname}%
\expandafter\xdef\csname label text \templabelname\endcsname{#2}%
}
\newcommand{\hlink}[1]{%
\ifcsname label text #1\endcsname%
\hyperref[label text #1]{\csname label text #1\endcsname}%
\else%
[MISSING LINK FOR “#1”]%
\fi%
}
\begin{document}
\begin{theorem}[The \textit{Example} Theorem]
theorem text theorem text...
\end{theorem}
\labeldef{examplethm}{The Example Theorem (\arabic{section}.\arabic{theorem})}
\begin{theorem}
theorem text theorem text...
\end{theorem}
The ideal reference: \hyperref[label text examplethm]{The \textit{Example} Theorem (0.1)}
Referencing the above with the new command: \hlink{examplethm}
\end{document}
答案1
我相信你正在问一个 XY 问题。
机制已经有了,即\nameref
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\newcommand{\nnref}[1]{\nameref{#1}~(\ref{#1})}
\newtheorem{theorem}{Theorem}[section]
\begin{document}
\begin{theorem}[The \textit{Example} Theorem]\label{tet}
theorem text theorem text...
\end{theorem}
\begin{theorem}
theorem text theorem text...
\end{theorem}
The ideal reference: \nnref{tet}.
\end{document}
答案2
解决特定扩展问题的一个简单方法是将位置部分拆分为另一个参数,然后将其添加回替换文本的正确位置:
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\newtheorem{theorem}{Theorem}[section]
\newcommand{\labeldef}[3]{%
\def\templabelname{#1}%
\label{label text \templabelname}%
\edef\temp{%
\gdef\csname label text \templabelname\endcsname{\unexpanded{#2} (#3)}%
}\temp
}
\newcommand{\hlink}[1]{%
\ifcsname label text #1\endcsname%
\hyperref[label text #1]{\csname label text #1\endcsname}%
\else%
[MISSING LINK FOR “#1”]%
\fi%
}
\begin{document}
\begin{theorem}[The \textit{Example} Theorem]
theorem text theorem text...
\end{theorem}
\labeldef{examplethm}{The \textit{Example} Theorem}{\arabic{section}.\arabic{theorem}}
\begin{theorem}
theorem text theorem text...
\end{theorem}
The ideal reference: \hyperref[label text examplethm]{The \textit{Example} Theorem (0.1)}
Referencing the above with the new command: \hlink{examplethm}
\end{document}
临时命令\temp
完全扩展了新的命令名称和位置参数,但定理名称未扩展,以便您可以在其中使用所有类型的宏。