\href 在 \xdef 内不起作用

\href 在 \xdef 内不起作用

这是我在这里的第一个问题。在发布之前,我已经花了大量时间搜索这个问题。

这是我的代码:

\documentclass[]{article}
\usepackage{hyperref}

\def\test{First -- Void1}

\begin{document}
\xdef\test{\test\ \& Second -- Void2}
\test
\end{document}

其给出所需的输出为:

输出

但每当我将代码更改为:

\documentclass[]{article}
\usepackage{hyperref}

\def\test{First -- \href{http://www.google.com}{Google}}

\begin{document}
\xdef\test{\test\ \& Second -- \href{http://www.wikibooks.org}{Wikibooks}}
\test
\end{document}

Latex 出现错误并且当然没有产生任何输出。

我只对 Void1、Void2 和两者进行了替换(如第二个代码片段所示);但没有任何效果。

有人能帮助我吗?(如果 \href 不能与 \xdef 一起使用,我需要一种替代方法将 URL 附加到现有字符串

谢谢。

修改后的代码:

\documentclass[]{article}
\usepackage{multido}
\usepackage{arrayjob}

\newarray\Emails
\readarray{Emails}{[email protected]&[email protected]&[email protected]&[email protected]}
\def\test{}

\begin{document}
\multido{\idx=1+1}{4}{%
  \checkEmails(\idx)
  \noindent Email-\idx\ \ is \cachedata\\
  % Here I want some way to store the emails as href in that global macro '\test'
  % Something like --> \xdef\test{\unexpanded\expandafter{\test} \href{mailto:\cachedata}{\cachedata}}
  \xdef\test{\unexpanded\expandafter{\test} Normal-Text -- \cachedata, }%
}

\test

\end{document}

答案1

你其实并不想这样做\xdef,因为它会对你的宏造成非常坏的影响。无论如何,你也不想一直扩展,但这样\xdef做确实会造成影响。

目前已经有多种方法可以将标记附加到无参数宏:

\def\test{First -- Void1}

\makeatletter
\g@addto@macro\test{\ \& Second -- \href{http://www.wikibooks.org}{Wikibooks}}
\makeatother

使用 LaTeX 内核中定义的方法。

一个稍微不同但基本相同的方法是

\def\test{First -- Void1}

\expandafter\gdef\expandafter\test\expandafter{%
  \test\ \& Second -- \href{http://www.wikibooks.org}{Wikibooks}}

这更接近于您想要做的事情。您会看到,当替换文本已经扩展\test时,会发生(全局) 重新定义。\test

\usepackage{etoolbox}有其他选择

\def\test{First -- Void1}

\appto\test{\ \& Second -- \href{http://www.wikibooks.org}{Wikibooks}}
\gappto\test{\ \& Second -- \href{http://www.wikibooks.org}{Wikibooks}}

\appto该操作对于发生这种情况的组来说是本地的,该\gappto操作是全局的(可能是您想要的)。


对于这个\multido问题,你需要一些稍微不同的东西。

\documentclass[]{article}
\usepackage{multido}
\usepackage{arrayjobx}
\usepackage{hyperref}

\newarray\Emails
\readarray{Emails}{%
  \href{[email protected]}{abc}&%
  \href{[email protected]}{xyz}&%
  \href{[email protected]}{pqr}&%
  \href{[email protected]}{mno}}
\def\test{}

\begin{document}
\multido{\idx=1+1}{4}{%
  \checkEmails(\idx)
  \noindent Email-\idx\ \ is \cachedata\\
  \xdef\test{\unexpanded\expandafter{\test}
             Normal-Text --
             \unexpanded\expandafter{\cachedata}, }%
}

\test

\end{document}

我添加了\href只是为了表明它也适用于它。使用arrayjobx而不是arrayjob与一些重要的 LaTeX 命令冲突。

相关内容