重新定义宏而不使用 tmp 变量

重新定义宏而不使用 tmp 变量

是否可以修改宏而不将原始宏存储在 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}

在此处输入图片描述

相关内容