是否可以修改宏而不将原始宏存储在 tmp 变量中?
方法与这里的方法类似:根据旧宏重新定义宏。但没有OldMacro
我想到了一些使用群组的方法,但是没有用。
\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}
编辑:它确实部分起作用了。但没有达到我的期望。
\documentclass{article}
\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}
\begin{document}
\abc
\end{document}
输出:abcdef(按预期工作)
\documentclass{article}
\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}
\begin{document}
\abc
\abcorg
\end{document}
输出:错误:未定义的控制序列(按预期工作,因为\abcorg
未定义)
\documentclass{article}
\def\abc{abc}
\begingroup\let\orgabc\abc\def\abc{\orgabc\endgroup def}
\begin{document}
\orgabc
\end{document}
输出:abc(为什么\orgabc
在这里定义?)
编辑:重新定义与 titlesec 包有冲突。我提出了一个新问题这里
答案1
这当然行不通,因为它会留下\begingroup
悬挂的效果,直到你称呼 \abc
,这很可能发生在一些不受欢迎的地方(参见您的另一个问题)。
在我看来你想做
\def\abc{abc}
\expandafter\def\expandafter\abc\expandafter{\abc def}
但这很笨拙并且仅限于允许附加。
无需重新发明轮子,您可以使用etoolbox
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\abc}{abc}
\begin{document}
The macro \verb|\abc| expands to ``\abc''.
\appto\abc{def}
The macro \verb|\abc| expands to ``\abc''.
\preto\abc{X}\appto\abc{X}
The macro \verb|\abc| expands to ``\abc''.
\end{document}
这将打印
宏
\abc
扩展为“abc”。
宏\abc
扩展为“abcdef”。
宏\abc
扩展为“XabcdefX”。
答案2
重新组织并更正了我的答案
仍然可用的原因\orgabc
是该组实际上从未关闭,它会导致有关 的警告semi groups
。
现在,egreg已经使用过\expandafter\def\....
了。
可以\xdef\foo{\foo other stuff}
使用较短的版本。
作为第三种变体,\g@addto@macro
从 LaTeX 内核应用,它首先将扩展的所有内容存储在标记中,然后用 重新定义宏\xdef
,以扩展标记。
\documentclass{article}
\def\abc{abc}
\def\abcother{abc}
\def\abcyetanother{abc}
\expandafter\def\expandafter\abc\expandafter{\abc\ defappended which works}
\xdef\abcother{\abcother\ defappended works as well}
\makeatletter
\g@addto@macro\abcyetanother{\ and here again}
\makeatother
\begin{document}
First version: \abc
Second version: \abcother
Third version: \abcyetanother
\end{document}