这是我在这里的第一个问题。在发布之前,我已经花了大量时间搜索这个问题。
这是我的代码:
\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 命令冲突。