如果值具有Latex令牌,则Latex宏中的pdfKey值查找系统将失败



我试图在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}

我知道解决方案与protectrelax或类似的东西有关,但我不知道它是什么

有人知道这个问题的解决办法吗?

我找到了两个解决问题的方案,一个使用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可能导致问题的情况?

最新更新