如果我有一个像这样工作的宏,在括号内:
{\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
及其用例可以找到更好的解决方案。