创建一个宏,将一些代码附加到现有命令中,并附带参数

创建一个宏,将一些代码附加到现有命令中,并附带参数

当我正在努力改进我的回答时LaTeX 文学编程的不同方法,我创建了一个宏,它会自动处理两个参数并相应地格式化索引。参数是字符串(不是控制序列),其中#1是宏的类型,#2是宏的名称。

以下是我正在使用的宏的一个示例。它依赖于etoolboxxstring

\newcommand{\set@macro@type}[2]{
    \StrSubstitute{#2}{@}{"@}[\entryname]
    % Default definitions
    \def\macro@type{#1}
    \def\macro@format{#2}
    \def\macro@index{#2@\string\texttt{#2}}
    % Specific type definitions
    \ifstrequal{#1}{m}
        {\def\macro@type{}
         \def\macro@format{\textbackslash#2}
         \def\macro@index{%
            \entryname @\string\texttt{{\string\textbackslash}\entryname}}}{}
    \ifstrequal{#1}{l}
        {\def\macro@type{length}
         \def\macro@format{%
            \entryname @\string\texttt{{\string\textbackslash}\entryname}}}{}
    \ifstrequal{#1}{e}
        {\def\macro@type{environment}
         \def\macro@format{\textbackslash#2\par\textbackslash end#2}
         \def\macro@index{%
            \entryname @\string\texttt{{\string\textbackslash}\entryname}}}{}}

不过,我想让用户能够通过如下界面添加新类型的宏:

\addmacro{<name>}{<type>}{<format>}{<index>}

它应该将以下代码附加到我现有的宏中:

\ifstrequal{#1}{<name>}
    {\def\macro@type{<type>}
     \def\macro@format{<format>}
     \def\macro@index{<index>}}

理想情况下,该\addmacro命令也可以加星号,因为我有一个额外的开关可以根据用户的意愿进行切换。

所以,我的问题是:如何实现一个宏,在主宏的末尾附加一些代码,并且可以重复使用。etoolbox如果可能的话,我更愿意继续使用(我在文档中看到过,\apptocmd但无法让它工作)。我遇到的主要困难是参数#1#2\set@macro@style用户必须能够以某种方式引用它们。如何实现呢?也非常欢迎解释。

答案1

您可以\setmacrotypeend在末尾放置一个没有参数的空宏()\set@macro@type,然后将代码附加到\ltx@GlobalAppendToMacro其中命令包。有关必要的扩展,请参阅当参数是使用 etoolbox 命令的结果时,将参数与字符串进行比较.我做到了不是测试一下,但是对于评论来说它太长而且需要太多的格式。

\newcommand{\setmacrotypeend}{}

\newcommand{\set@macro@type}[2]{
... (unchanged as it was before)
\def\setmacrotypefirstargument{#1}
\setmacrotypeend%
}

\RequirePackage{ltxcmds}

\newcommand{\addmacro}[4]{%
\ltx@GlobalAppendToMacro{\setmacrotypeend}{%
  \expandafter\ifstrequal\expandafter{\setmacrotypefirstargument}{#1}
    {\def\macro@type{#2}
     \def\macro@format{#3}
     \def\macro@index{#4}}
}%
}

相关内容