在latex中存储文本字符串,然后向其中添加其他文本(连接)

时间:2010-06-27 01:43:25

标签: string latex

我首先定义一个命令来存储字符串“Hello”:

\newcommand{\textstring}{Hello}

我想追加字符串“world”但不幸的是这段代码会导致错误:

\renewcommand{\textstring}{\textstring world}

4 个答案:

答案 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}}情况)