当我正在努力改进我的回答时LaTeX 文学编程的不同方法,我创建了一个宏,它会自动处理两个参数并相应地格式化索引。参数是字符串(不是控制序列),其中#1
是宏的类型,#2
是宏的名称。
以下是我正在使用的宏的一个示例。它依赖于etoolbox
和xstring
。
\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}}
}%
}