我首先定义一个命令来存储字符串“Hello”:
\newcommand{\textstring}{Hello}
我想追加字符串“world”但不幸的是这段代码会导致错误:
\renewcommand{\textstring}{\textstring world}
答案 0 :(得分:11)
您可以使用\expandafter
来完成此操作。例如:
% redefine \textstring by appending " world" to it
\expandafter\def\expandafter\textstring\expandafter{\textstring { }world}
如果您不使用\expandafter
,那么最终会出现递归问题。您可以阅读更多相关信息here。
答案 1 :(得分:2)
问题是这个会覆盖 \textstring
的定义,而不是引用旧的定义。为了追加,标准方法是使用TeX命令\edef
,它在分配内容之前扩展定义。因此,如果你有
\def\textstring{Hello} % Or with \newcommand
\edef\textstring{\textstring{} world}
LaTeX会将\edef
的右侧更改为Hello world
,然后将其重新分配给\textstring
,这就是您想要的。相反,在您当前的版本中,\newcommand
不会扩展右侧,因此当您使用\textstring
时,它会扩展为\textstring world
,本身扩展到\textstring world world
,本身扩展为......你明白了。
答案 2 :(得分:2)
使用此问题的输入生成
\edef\history{ }
\newcommand{\historyAdd}[1]{\edef\history{\history{}#1 }}
\newcommand{\historyAddEcho}[1]{#1\historyAdd{#1}}
The history was:
\historyAddEcho{Hi brian}
\historyAdd{you idiot}
\historyAddEcho{how are you?}
\lipsum[3]
The real history was: \history
(抱歉brian,但这是我能想到的最具说明性的例子)
该结构可以帮助您创建一个简单的待办事项列表,其中包括:
\lipsum[1]
\historyAdd{\\work more with: }
\section{\historyAddEcho{Introduction}}
\lipsum[1]
\historyAdd{\\work more with the text on page \thepage}
\lipsum[1]
\section{ToDo:}
\history
希望这可以帮助那些试图为此目的连接字符串的人。
答案 3 :(得分:1)
类似于David Underhill的回答是以下
\newcommand{\textstring}{Hello}
\makeatletter
\g@addto@macro\textstring{ world}
\makeatother
g@addto@macro
宏实现了相同的效果,并且可能会产生稍微更易读的代码(特别是如果您的代码采用包/样式,或者您已经在\makeatletter
& { {1}}情况)