LINUX.ORG.RU

latex - \let и переопределение

 ,


0

1

Возник вопрос, почему не работает код. чяднт =)

Вот простой пример:


\def\printstrings{aaa} 
\def\addstr#1{
    \let\oldprintstrings\printstrings
    \def\printstrings{
        \oldprintstrings \\
        #1
    }
}

 \addstr{bbb} 
 \addstr{ccc}

Вообще, дальше я хотела, чтобы команда \printstrings выдала результат:

aaa

bbb

ccc

Но результат другой - ошибка ((

TeX capacity exceeded, sorry [input stack size=5000] \printstrings

Вроде несложная задача то - addstr добавляет строчку, а printstrings потом все накопленное печатает. Даже понятно, чем \def и \let отличаются.

Заранее спасибо всем ответившим!



Последнее исправление: TatianaSh (всего исправлений: 1)

Советую почитать про списки токенов в техе. Этот вариант работать не будет. Чтобы понять, почему, попробуйте сами выступить в роли теха и раскрыть все команды.

Eddy_Em ☆☆☆☆☆
()
\newtoks\mytoks
\mytoks={aaa}
\def\printstrings{\noindent\the\mytoks}
\def\addstr#1{\global\mytoks=\expandafter{\the\mytoks\\ #1}}
\addstr{bbb}
\addstr{ccc}
\printstrings
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от zinfandel

Чтобы понять, почему, попробуйте сами выступить в роли теха и раскрыть все команды.

Видно что проблема в бесконечной рекурсии, которая переполняет стек.

Когда я это придумывала, я раскрывала это без всяких рекурсий =) Ошибочка вышла)

TatianaSh
() автор топика
Ответ на: комментарий от Eddy_Em

Правильно ли я понимаю, что \expandafter говорит теху сначала раскрыть в последовательность знаков {\the\mytoks\\ #1}.

И в определении \addstr получаем \mytoks=раскрытые_знаки_раскрытые_знаки, а не \mytoks=нераскрытый_макрос_плюс_какие-то_знаки.

TatianaSh
() автор топика
Ответ на: комментарий от TatianaSh

Да. Иногда, если требуется несколько углубиться в раскрытии, встречаются и конструкции из пяти-десяти \expandafter, следующих друг за другом. Если же раскрыть надо позже, применяется \noexpand (в сложных макросах).

И в определении \addstr получаем

Правильно. Иначе получается бесконечная рекурсия, если макросы начать раскрывать в конце.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Спасибо за ответ и подробный комментарий!

TatianaSh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.