store a text string in latex and then add other text to it (concatenate)
I start by defining a command to store the str开发者_C百科ing "Hello":
\newcommand{\textstring}{Hello}
I would like to append the string " world" but unfortunately this code causes an error:
\renewcommand{\textstring}{\textstring world}
You can accomplish this by using \expandafter
. For example:
% redefine \textstring by appending " world" to it
\expandafter\def\expandafter\textstring\expandafter{\textstring { }world}
If you don't use \expandafter
then you end up with a recursion problem. You can read more about it here.
Used the input from this question to generate
\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
(sorry brian, but this was the most illustrative example I could think of)
The scructure can help you create a simple todo list with something like:
\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
Hope this can help someone out there trying to concat strings for this purpose.
The problem is that this overwrites the definition of \textstring
, rather than referencing the old one. In order to append, the standard way is to use the TeX command \edef
, which expands the definition before assigning something. Thus, if you have
\def\textstring{Hello} % Or with \newcommand
\edef\textstring{\textstring{} world}
LaTeX will change the right-hand side of the \edef
into Hello world
, and then reassign that to \textstring
, which is what you want. Instead, in your current version, the \newcommand
doesn't expand the right-hand side, so when you use \textstring
, it expands to \textstring world
, which itself expands to \textstring world world
, which itself expands to… you get the idea.
Similar to David Underhill's answer is the following
\newcommand{\textstring}{Hello}
\makeatletter
\g@addto@macro\textstring{ world}
\makeatother
The g@addto@macro
macro achieves the same effect, and may produce slightly more readable code (especially if your code is in a package/style, or if you're already in a \makeatletter
& \makeatother
situation)
精彩评论