我不确定应该使用什么术语来提出这个问题。
我想要做的是定义一个复数命令,以便我可以执行以下操作:
\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>
”作为最后一个参数。