在元命令中附加宏名称

在元命令中附加宏名称

我试图构建一个宏观的宏,这是一个相关的命令。

\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

定义新宏的最佳方式是使用etoolboxs \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}

相关内容