latex - 如果值具有乳胶标记,则乳胶宏中的键值查找系统将失败
问题描述
我正在尝试在 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
或类似的东西有关,但我无法弄清楚它是什么。
有谁知道这个问题的解决方案?
解决方案
我为我的问题找到了两种解决方案,一种使用\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
会避免扩大以前导致问题的论点,但我不确定这会产生什么负面后果。是否存在从\xdef
to更改\gdef
可能导致问题的上下文?
推荐阅读
- python - 为什么我的 DataGenerator 迭代的数据多于数据集的大小并给出 IndexError: list index out of range?
- angular - 动态更改角度 6 中的图标
- ansible - 在 kubernetes 命名空间中使用 ansible playbook 升级 helm
- django - Django 字段与多个抽象基类发生冲突
- c - 定时器触发 GPDMA 传输到 SRAM
- c# - 为什么字体被“包围”时不呈现在 HTML 中
- certificate - 使用自签名证书进行内核模式驱动程序签名
- reactjs - 在reactjs中提交之前无法更改状态值
- html - 无法设置动态创建的 .innerHTML (Angular)
- ssis - 尽管已将 -hostkey 开关添加到 WinSCP 命令行,但“主机密钥未验证”