假设我们有一些命令,\SomeCommand{...}
。我希望用语法定义一个新命令\CommandNested[n]{...}
,例如,
\CommandNested[5]{...}
相当于\SomeCommand{\SomeCommand{\SomeCommand{\SomeCommand{\SomeCommand{...}}}}}
。
那么...我该怎么做呢?
答案1
我不确定这是否是你想要的:
\documentclass{scrartcl}
\long\def\grabfirst#1#2{#1} \long\def\grabsecond#1#2{#2}
\def\newnestedcommand#1[#2]#3#4{\edef#1{\donest{#2}{#3}{#4}}}
\def\donest#1#2#3{\ifnum\numexpr#1\relax=1 \expandafter\grabfirst\else\expandafter\grabsecond\fi
{\noexpand#2{\unexpanded{#3}}}{\noexpand#2{\donest{#1-1}{#2}{#3}}}}
\begin{document}
\newnestedcommand\foo[3]\nestthis{three times}
\texttt{\meaning\foo}
\end{document}
这允许您定义一个包含嵌套命令的宏。如果您想即时执行此操作,我们可以做到。除了更灵活之外,这还更强大。
\long\def\grabfirst#1#2{#1} \long\def\grabsecond#1#2{#2}
\def\commandnested[#1]#2#3{\docommandnest{#1-1}{#2}{#2{#3}}}
\def\docommandnest#1#2#3{\ifnum\numexpr#1\relax=0 \expandafter\grabfirst\else\expandafter\grabsecond\fi
{#3}{\docommandnest{#1-1}{#2}{#2{#3}}}}
\def\addparens#1{(#1)}
\commandnested[6]\addparens{this is inside 6 levels of parentheses}
答案2
这里有一个实现expl3
:关键在于定义扩展为左括号和右括号的标记列表(在完整扩展上下文中):
\documentclass{article}
\usepackage{xparse}
% define the command to be nested
\newommand{\SomeCommand}[1]{?#1?}
\ExplSyntaxOn
\NewDocumentCommand{\CommandNested}{O{1}m}
{
\use:x
{
\prg_replicate:nn { #1 }
{ \exp_not:N \SomeCommand \c_argento_left_brace_tl }
\exp_not:n { #2 }
\prg_replicate:nn { #1 }
{ \c_argento_right_brace_tl }
}
}
% when expanded, these give a left brace or a right brace
\tl_const:Nn \c_argento_left_brace_tl { \if_true: { \else: } \fi: }
\tl_const:Nn \c_argento_right_brace_tl { \if_false: { \else: } \fi: }
\ExplSyntaxOff
\begin{document}
\CommandNested{x}
\CommandNested[3]{x}
\end{document}
答案3
(关于如何实现任意数量的嵌套某些命令的应用是更一般的类型。
我不清楚在实践中嵌套相同的命令/相同的控制序列标记集。
当然,在 (La)TeX 中自动嵌套命令/控制序列标记是可行的。但我不知道我的以下答案是否能满足那些引发这个更普遍问题的特定需求。
也许你想通过与你的更普遍的问题相关的信息来揭示你希望实现的具体目标的更多细节?)
看来你的语法规范需要修改:
似乎语法\CommandNested[n]{...}
表示处理二参数(1. 嵌套层数 / 2. 最内层嵌套层的内容),而结果似乎\SomeCommand{\SomeCommand{\SomeCommand{\SomeCommand{\SomeCommand{...}}}}}
是由于处理而产生的三参数(1. 嵌套级别的数量 / 2. 要嵌套的控制序列标记 / 3. 最内层嵌套级别的内容)。
以下是 LaTeX2e(不需要 e-TeX 或 pdfTeX 扩展)的语法
\CommandNested{<amount of nesting levels>}%
{<control sequence token that is to be nested>}%
{<content of innermost nesting level>}
与您的规范中的要求不同,表示的参数
<amount of nesting levels>
不是可选的,而是强制性的。
由于\romannumeral
-扩展,结果将在两个扩展步骤/两个 链之后获得\expandafter
。(这在测试 2 中显示。))
真挚地
乌尔里希
\documentclass{article}
\makeatletter
\newcommand\CommandNested[3]{%
\romannumeral0\expandafter\InnerCommandNested
\romannumeral\number\number#1 000A\relax{#3}{#2}%
}%
\@ifdefinable\InnerCommandNested{%
\long\def\InnerCommandNested#1#2\relax#3#4{%
\ifx A#1\expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi
{\InnerCommandNested#2\relax{#4{#3}}{#4}}{ #3}%
}%
}%
\makeatother
\newcommand\SomeCommand[1]{%
\string\SomeCommand\string{#1\string}%
}%
\begin{document}
\ttfamily\selectfont
\parskip=\bigskipamount
Test 1:
\CommandNested{5}{\SomeCommand}{...}
Test 2:
\expandafter\expandafter\expandafter\def
\expandafter\expandafter\expandafter\temp
\expandafter\expandafter\expandafter{%
\CommandNested{5}{\UndefinedOtherCommand}{...}}
\meaning\temp
\end{document}