store a text string in latex and then add other text to it (concatenate)

孤街浪徒 提交于 2019-12-05 17:37:06

问题


I start by defining a command to store the string "Hello":

\newcommand{\textstring}{Hello}

I would like to append the string " world" but unfortunately this code causes an error:

\renewcommand{\textstring}{\textstring world}

回答1:


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.




回答2:


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.




回答3:


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.




回答4:


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)



来源:https://stackoverflow.com/questions/3126082/store-a-text-string-in-latex-and-then-add-other-text-to-it-concatenate

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!