сохранить текстовую строку в латексе, а затем добавить к ней другой текст (сцепить) - PullRequest
9 голосов
/ 27 июня 2010

Я начинаю с определения команды для сохранения строки «Hello»:

\newcommand{\textstring}{Hello}

Я хотел бы добавить строку "world", но, к сожалению, этот код вызывает ошибку:

\renewcommand{\textstring}{\textstring world}

Ответы [ 4 ]

11 голосов
/ 27 июня 2010

Вы можете сделать это, используя \expandafter. Например:

% redefine \textstring by appending " world" to it
\expandafter\def\expandafter\textstring\expandafter{\textstring { }world}

Если вы не используете \expandafter, то у вас возникнет проблема рекурсии. Вы можете прочитать больше об этом здесь .

2 голосов
/ 25 мая 2012

Использовал входные данные из этого вопроса для генерации

\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

(извините, Брайан, но это был самый наглядный пример, который я мог придумать)

Scructure может помочь вам создать простой список задач с чем-то вроде:

\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

Надеюсь, что это может помочь кому-то, пытающемуся объединить строки для этой цели.

2 голосов
/ 27 июня 2010

Проблема в том, что перезаписывает определение \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 который сам расширяется до ... вы понимаете.

1 голос
/ 12 апреля 2011

Аналогично ответу Дэвида Андерхилла:

\newcommand{\textstring}{Hello}
\makeatletter
\g@addto@macro\textstring{ world}
\makeatother

Макрос g@addto@macro достигает того же эффекта и может давать немного более читаемый код (особенно если ваш код в пакете / стиле или если вы уже находитесь в ситуации \makeatletter & \makeatother)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...