我试图构建一个宏观的宏,这是一个相关的命令。
\documentclass{article}
\newcommand{\myabbv}[3]{%
\newcommand{#1}{#3}
\newcommand{#1full}{#2}
}
\myabbv{\alky}{Alcoholics Anonymous}{AA}
\begin{document}
\alkyfull is a place for people that go to \alky
\end{document}
但是,当我运行命令来执行其他命令时,它会抱怨我已经定义了\alky
。似乎 TeX 不会将参数与我的后缀连接起来;有解决办法吗?
答案1
定义新宏的最佳方式是使用etoolbox
s \csdef
:
笔记:
- 请注意,
\aa
已经定义了。因此您应该使用备用名称。由于\csdef
在这种情况下不会发出错误,因此我添加了一个测试以确保如果您尝试重新定义现有宏,代码会发出错误。 - 您还可以使用
\csname...\endcsname
它来构建宏的名称,如第二个 MWE 所示。
代码:使用\csdef
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\myabbv}[3]{%
%% First lets check that we are not redefining an exsting macro:
\ifcsdef{#1}{\PackageError{myabbv}{Macro #1 is already defined}{}}{}%
\ifcsdef{#1full}{\PackageError{myabbv}{Macro #1full is already defined}{}}{}%
% --------------
\csdef{#1}{#3}%
\csdef{#1full}{#2}%
}
\myabbv{Xaa}{Alcoholics Anonymous}{AA}
\begin{document}
\Xaafull is a place for people that go to \Xaa
\end{document}
代码:使用\csname...\endcsname
:
\documentclass{article}
\newcommand{\myabbv}[3]{%
\expandafter\newcommand\csname#1\endcsname{#3}%
\expandafter\newcommand\csname#1full\endcsname{#2}%
}
\myabbv{Xaa}{Alcoholics Anonymous}{AA}
\begin{document}
\Xaafull is a place for people that go to \Xaa
\end{document}