从表达式中删除宏的应用

从表达式中删除宏的应用

我将如何编写宏\firstArgument以及\macroName它将执行以下操作:

\firstArgument{\bf{a}}    reduces to a
\macroName{\bf{a}}        reduces to bf

我知道这种方法\def\dismantle#1{{\let\Large\@firstofone #1}},但它对我来说不是一个解决方案,因为它只适用于\bf我正在寻找对所有宏都执行此操作的宏。

更新:在整个讨论过程中,情况变得清晰起来,“firstArgument”仅应暗示此处所指的结构。同样,它\bf仅用作任意示例。这一点很重要,因为当宏的定义尚不清楚时,TeX 没有参数的概念,而该概念可能依赖于该定义。

答案1

\documentclass{article}

\def\firstArgument#1{\zza#1}
\def\macroName#1{\zzb#1}
\def\zza#1#2{#2}
\def\zzb#1#2{\expandafter\zzc\string#1}
\def\zzc#1{}
\begin{document}

\firstArgument{\bf{a}}

\macroName{\bf{a}}
   
\end{document}

在此处输入图片描述

请注意,这a不是这里的论点\bf

答案2

与 TeX 一样,它们与定义和扩展宏的概念密切相关,让我们完全避免使用术语“参数”和“参数”,而是使用第 24 章:TeXbook 垂直模式摘要中引入的用于定义 TeX 的“词性”的 Backus/Naur 符号的修改形式:

如果将其应用于 token 模式

⟨控制序列⟩⟨左括号⟩⟨平衡文本⟩⟨右括号⟩

  • ⟨控制序列⟩既不是\outer标记,也不是活动字符,也不是可通过\csname\endcsname或通过类别代码为 0(转义)的单个字符(即反斜杠)构造的“无名控制序列标记”,位于输入行未注释的末尾,而\endlinechar的值不是正数
  • ⟨平衡文本⟩不包含根据以下定义的标记\outer

仅,而\escapechar-parameter 具有其通常值 92(十进制):

\documentclass{article}

\makeatletter
\newcommand\firstArgument[1]{\@secondoftwo#1}%
\newcommand\macroName[1]{\expandafter\expandafter\expandafter\@gobble\expandafter\string\@firstoftwo#1}%
\makeatother

\begin{document}

\ttfamily\selectfont

\firstArgument{\textbf{a}}
 
\macroName{\textbf{a}}

\end{document}

相关内容