更改宏的语法,使其进入括号内

更改宏的语法,使其进入括号内

如果我有一个像这样工作的宏,在括号内:

{\SomeMacro applies to this text}

我可以轻松做到这一点:

\newcommand\MySomeMacro[1]{{\SomeMacro #1}}

然后新命令超出括号的范围:

\MySomeMacro{applies to this text}

我还可以\let通过中介来重新定义原始宏。

我的问题:可以反过来做吗?也就是说,如果我已经有一个在括号外使用的宏,我可以重新定义它(或创建一个新的宏)来执行相同的操作,但在括号内吗?

我在 TeXlive 2016 上使用 LuaTeX,但这肯定是一个相当基本的问题,适用于任何事情。此外,在我的特定情况下,宏的参数非常简单,通常是纯文本。

我为什么要这样做:我正在处理一个文档,其中大多数用户命令都位于括号内。为了保持书写的一致性,我想定义自己的命令,使它们以相同的方式工作。重新定义原始命令,使它们位于括号之外,可能会让编辑我文档的人感到困惑。

答案1

例如,如果你想输入

{\macro argument or whatever}

并希望 TeX 转换

\command{argument or whatever}

要获得使用一个参数轻松定义的命令的所有灵活性,您可以这样做

\def\macro{\aftergroup\command\aftergroup{}}
\def\command#1{Whatever you whant to do with the argument [#1].}

这是起什么作用的?

您的代码{\macro argument}将打开一个组{,然后展开\macro,展开为\aftergroup\command\aftergroup{}。反过来,\aftergroup确保在关闭组之后准确插入下一个标记,因此\aftergroup\command确保关闭组时\command存在,并\aftergroup{确保\command{关闭组时存在。然后,您使用以下内容关闭组,}使您的代码保留\command{argument}

答案2

真实的解决方案取决于如何\commandwitharg定义。允许的一般解决方案

 <open group>\noarg text<close group>

即使可能的话,也确实很难找到。

以下是 Manuel 的解决方案的替代版本,更加巧妙:

\documentclass{article}

\newcommand\commandwitharg[1]{---#1---}

\newcommand{\noarg}{%
  % close the group
  \egroup                  
  % the first \expandafter removes \iftrue
  % the second \expandafter removes \else
  \expandafter\expandafter\expandafter
  \commandwitharg\iftrue\expandafter{\else}\fi 
}

\begin{document}

\commandwitharg{ABC}

{\noarg ABC}

\end{document}

不指望能够有\begingroup\noarg text\endgroup:只{\noarg text}希望有效果。

这是很多最好使用文本编辑器并简单地进行更改

{\noarg<space>

\commandwitharg{

最后,了解的真正定义\commandwitharg及其用例可以找到更好的解决方案。

相关内容