Hyperref 在参数中扩展宏

Hyperref 在参数中扩展宏

我很困惑为什么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

相关内容