我很困惑为什么edef
下面的内容没有在链接中展开?
来自\GetTexFilePath
输出不应显示的文本,它是可扩展的,而\GetTexFilePathOld
是旧版本,它不可扩展。在这种情况下,两者产生相同的结果。
我尝试了各种\expandafter
魔法,但无法找出正确的组合。
\documentclass{article}
\usepackage{xstring}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\GetTexFilePath}{m m m}{% Expandable version
\str_if_eq:xxTF{#1}{SpecialValue}{#1/#2#3}{../#1/#2#3}%
}%
\ExplSyntaxOff
\NewDocumentCommand{\GetTexFilePathOld}{m m m}{%
\IfStrEq{#1}{SpecialValue}{#1/#2#3}{../#1/#2#3}%
}%
\begin{document}
\edef\FullExpandedFileName{\GetTexFilePath{foo}{bar}{.tex}}
\href{run:\FullExpandedFileName}{\GetTexFilePath{foo}{bar}{}}
%
\edef\FullExpandedFileName{\GetTexFilePathOld{foo}{bar}{.tex}}
\href{run:\FullExpandedFileName}{\GetTexFilePathOld{foo}{bar}{}}
\edef\FullExpandedFileName{\GetTexFilePath{SpecialValue}{bar}{.tex}}
\href{run:\FullExpandedFileName}{\GetTexFilePath{SpecialValue}{bar}{}}
%
\edef\FullExpandedFileName{\GetTexFilePathOld{SpecialValue}{bar}{.tex}}
\href{run:\FullExpandedFileName}{\GetTexFilePathOld{SpecialValue}{bar}{}}
\end{document}
答案1
使用创建的命令\NewDocumentCommand
非常强大。\DeclareExpandableDocumentCommand
如果您想要一个可扩展的版本,则必须使用(请参阅 xparse 文档)。或者您可以使用
\expandafter\edef\expandafter\FullExpandedFileName\expandafter{\GetTexFilePath....
答案2
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\cs_new:Npn \grill_spval:n #1
{
\str_if_eq:nnTF { #1 } { SpecialValue } { #1 } { ../#1 }
}
\NewDocumentCommand\PathHref{ m m m }
{
\exp_args:Nxx \href
{
run:\grill_spval:n {#1} / #2 #3
}
{
\grill_spval:n {#1} / #2
}
}
\ExplSyntaxOff
现在\PathHref{foo}{bar}{.tex}
应该\PathHref{SpecialValue}{bar}{.tex}
做你想做的事。
请注意,\str_if_eq:xxTF
只要#1
是字符串,就不需要;当然,如果要扩展的\str_if_eq:xxTF
第一个参数,则可能需要。所需的扩展是的扩展,应该在执行之前执行:我们通过获得它。\PathHref
\grill_spval:n
\href
\exp_args:Nxx