如何定义一个可以扩展为另一个新命令的新命令

如何定义一个可以扩展为另一个新命令的新命令

我不确定应该使用什么术语来提出这个问题。

我想要做的是定义一个复数命令,以便我可以执行以下操作:

\newcommand{\individual}{individual\xspace}
\pluralize{\individual}

the \individual with the \individuals

然后得到

the individual with the individuals

我之所以要这样做是因为我可能会改变以下术语:

\newcommand{\individual}{name\xspace}
\pluralize{\individual}

the \individual with the \individuals

然后得到

the name with the names

目前我正在做的是明确写出每个命令的复数版本,例如:

\newcommand{\individual}{individual\xspace}
\newcommand{\individuals}{\individual{}s\xspace}

但似乎我应该能够将其转换为用于简单复数形式的宏。

到目前为止,我尝试了三种方法,但都没有奏效。首先,我尝试了我认为可能有效的方法:

\newcommand{\pluralize}[1]{\newcommand{\#1}{\#1{}s\xspace}

然后我在网上查找。我尝试遵循 在另一个新命令中定义一个带有变量名的新命令 我想出了

\makeatletter
\newcommand{\pluralize}[1]{%
    \expandafter\newcommand\csname #1s\endcsname{#1{}s\xspace}%
}
\makeatother

\makeatletter
\newcommand{\pluralize}[1]{%
    \@namedef{#1s}{\\#1s\xspace}
}
\makeatother
\expandafter\newcommand\csname #1s\endcsname{#1{}s}%

但我要么得到编译错误,要么在使用宏时出错。我也不太清楚 @namedef、\expandafter 或 \csname 命令的作用。


如何正确定义复数命令?

答案1

我会改变方法:

\newcommand{\makename}[3][s]{%
  \expandafter\newcommand\csname #2\endcsname{#3\xspace}%
  \expandafter\newcommand\csname #2s\endcsname{#3#1\xspace}%
}

\makename{individual}{name}
\makename[es]{veggie}{potato}

在文档中你可以这样做

The \individual eats \veggie, while \individuals eat \veggies.

这将打印

名字吃土豆,名字吃土豆。

注意。一般情况下我不建议使用\xspace;但在这种情况下我还是建议使用。

答案2

以下是实现此目标的一种方法:

在此处输入图片描述

\documentclass{article}

\usepackage{xspace,xparse}

% https://tex.stackexchange.com/a/64380/5764
\makeatletter
\def\stripbs{\expandafter\@gobble\string}

\NewDocumentCommand{\createplural}{m m O{s}}{%
  \newcommand{#1}{#2\xspace}%
  \@namedef{\stripbs#1#3}{#2#3\xspace}%
}
\makeatother

\createplural{\individual}{name}%[s]

\begin{document}

The \individual with the \individuals.

\end{document}

\pluralize{<csname>}{<name>}[<plural>]提供一个可选的“ <plural>”作为最后一个参数。

使用时xspace有时有利,它也有其缺点

相关内容