我试图在LaTeX文档中使用一种键值查找系统,但当值本身包含LaTeX代码时,我遇到了问题。在我的文档中,我有以下宏定义:
makeatletter
defNewLabel#1#2{expandafterxdefcsname LBL@#1endcsname{#2}}
defRef#1{@ifundefined{LBL@#1}{???}{csname LBL@#1endcsname}}
有了这些宏,我可以在文档中执行以下操作:
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
defNewLabel#1#2{expandafterxdefcsname LBL@#1endcsname{#2}}
defRef#1{@ifundefined{LBL@#1}{???}{csname LBL@#1endcsname}}
usepackage{hyperref}
NewLabel{name1}{noexpandhref{mailto:johnsmith@exmaple.com}{John Smith}}
begin{document}
Ref{name1}
end{document}
使用gdef
的更广泛的解决方案是:
documentclass{article}
makeatletter
defNewLabel#1#2{expandaftergdefcsname LBL@#1endcsname{#2}}
defRef#1{@ifundefined{LBL@#1}{???}{csname LBL@#1endcsname}}
usepackage{hyperref}
NewLabel{name1}{href{mailto:johnsmith@exmaple.com}{John Smith}}
begin{document}
Ref{name1}
end{document}
虽然我明白为什么使用gdef
而不是xdef
可以避免扩大之前导致问题的论点,但我不确定这会产生什么负面后果。是否存在从xdef
更改为gdef
可能导致问题的情况?