首页 > 解决方案 > 如果值具有乳胶标记,则乳胶宏中的键值查找系统将失败

问题描述

我正在尝试在 LaTeX 文档中使用一种键值查找系统,但是当值本身包含 LaTeX 代码时我遇到了问题。在我的文档中,我有以下宏定义:

\makeatletter
\def\NewLabel#1#2{\expandafter\xdef\csname LBL@#1\endcsname{#2}}

\def\Ref#1{\@ifundefined{LBL@#1}{???}{\csname LBL@#1\endcsname}}

使用这些宏,我可以在我的文档中执行以下操作:

\NewLabel{name1}{John Smith}

\begin{document}
\Ref{name1}
\end{document}

但是,以下失败抱怨额外的}

\usepackage{hyperref}

\NewLabel{name1}{\href{mailto:johnsmith@exmaple.com}{John Smith}}

\begin{document}
\Ref{name1}
\end{document}

我知道解决方案必须与\protect\relax或类似的东西有关,但我无法弄清楚它是什么。

有谁知道这个问题的解决方案?

标签: latexpdflatex

解决方案


我为我的问题找到了两种解决方案,一种使用\noexpand,另一种更改\xdef\gdef,尽管我必须承认我并不完全理解我的解决方案的后果(尤其是使用\gdef)。使用更窄的解决方案\noexpand是:

\documentclass{article}

\makeatletter
\def\NewLabel#1#2{\expandafter\xdef\csname LBL@#1\endcsname{#2}}

\def\Ref#1{\@ifundefined{LBL@#1}{???}{\csname LBL@#1\endcsname}}

\usepackage{hyperref}

\NewLabel{name1}{\noexpand\href{mailto:johnsmith@exmaple.com}{John Smith}}

\begin{document}
\Ref{name1}
\end{document}

使用更广泛的解决方案\gdef是:

\documentclass{article}

\makeatletter
\def\NewLabel#1#2{\expandafter\gdef\csname LBL@#1\endcsname{#2}}

\def\Ref#1{\@ifundefined{LBL@#1}{???}{\csname LBL@#1\endcsname}}

\usepackage{hyperref}

\NewLabel{name1}{\href{mailto:johnsmith@exmaple.com}{John Smith}}

\begin{document}
\Ref{name1}
\end{document}

虽然我明白为什么使用\gdef而不是\xdef会避免扩大以前导致问题的论点,但我不确定这会产生什么负面后果。是否存在从\xdefto更改\gdef可能导致问题的上下文?


推荐阅读