下面,请注意我如何复制和粘贴相同的两种类型的命令来创建它们的微小变化;这两个命令“模板”是:
% make a definition
%\def\defn#1{\textbf{Defn [#1]:}}
\newcommand{\defn}[1][]{%
\ifthenelse{ \equal{#1}{} }
{\textbf{Defn:}}
{\textbf{Defn [#1]:}}
}
和
% make a highlight
\def\hi#1{\textbf{#1:}}
我并不想无休止地复制粘贴,而是想创建 1 个命令模板,然后将它们全部实例化,如下所示:
\newcommand{\defn}{ create_command_macro(template1, ‘Defn’) }
\newcommand{\prop}{ create_command_macro(template1, ‘Property’) }
和
\newcommand{\todo}{ create_command_macro(template2, ‘Todo’) }
\newcommand{\recall}{ create_command_macro(template2, ‘Recall’) }
在 Latex 中是否有一个简单的方法可以做到这一点?本质上我正在考虑 C 宏的等价性。
如果它变得更加复杂/难以理解,那么只需复制和粘贴,我就会坚持复制和粘贴。
谢谢!!
梅威瑟:
\documentclass{article}
% used for more complex macros
\usepackage{ifthen}
% example:
% \newcommand{\dx}[1][]{%
% \ifthenelse{ \equal{#1}{} }
% {\ensuremath{\;\mathrm{d}x}}
% {\ensuremath{\;\mathrm{d}#1}}
% }
% make a definition
%\def\defn#1{\textbf{Defn [#1]:}}
\newcommand{\defn}[1][]{%
\ifthenelse{ \equal{#1}{} }
{\textbf{Defn:}}
{\textbf{Defn [#1]:}}
}
% make a property
%\def\prop#1{\textbf{Property [#1]:}}
\newcommand{\prop}[1][]{%
\ifthenelse{ \equal{#1}{} }
{\textbf{Property:}}
{\textbf{Property [#1]:}}
}
% make a todo
\def\todo{\textbf{Todo: }}
% make a recall
\def\recall{\textbf{Recall: }}
\begin{document}
\\
\\
\defn{}\\
\defn{ASDF}\\
\\
\\
\todo\\
\note\\
\end{document}
答案1
这可以通过部分应用的形式来实现:
\NewDocumentCommand{\templateone}{ m o }{%
\textbf{#1\IfNoValueF{#2}{\ [#2]}:}%
}
\NewDocumentCommand{\defn}{}{\templateone{Defn}}
\NewDocumentCommand{\prop}{}{\templateone{Property}}
\NewDocumentCommand{\templatetwo}{ m }{%
\textbf{#1: }%
}
\NewDocumentCommand{\todo}{}{\templatetwo{Todo}}
\NewDocumentCommand{\recall}{}{\templatetwo{Recall}}
这里使用 expl3,因为它允许您拥有非 #1 的可选参数。