在带有文本输出的命令中添加 s 或 's

在带有文本输出的命令中添加 s 或 's

如果我做了类似的事情

\newcommand{\mc}{\textbf{MyCommand}\xspace}

我希望能够在文本中添加 s 或 's。在这种情况下,我希望能够轻松地以粗体输出 MyCommands 或 MyCommand's。

现在我必须使用多个命令才能完成此操作。理想情况下,我想使用 \mc's 和 \mcs(或者如果必要的话,使用 \mc^s 之类的命令)来添加 's,但全部以粗体显示。

答案1

我觉得这不是个好主意。无论如何,下面是:

\documentclass{article}
\usepackage{xspace}
\makeatletter
\newcommand{\mc}{%
  \textbf{MyCommand}%
  \@ifnextchar'%
    {\mc@checks}% check for a following s
    {\xspace}% no ' follows
}
\newcommand{\mc@checks}[1]{% gobble the apostrophe
  \@ifnextchar s%
    {\textbf{'s}\@gobble}% print 's and gobble the s
    {'}% reinstate the apostrophe
}
\makeatother

\begin{document}
\mc is simple

\mc's has s

``\mc'' has no s

``\textbf{MyCommand}'' has no s % just for testing
\end{document}

在此处输入图片描述

如果您有多个这样的命令,并且还需要“s-variant”,则只需抽象构造:

\documentclass{article}
\usepackage{xspace}
\makeatletter
\newcommand{\defineabbrev}[2]{%
  \expandafter\newcommand\csname#1\endcsname{%
    \textbf{#2}\@ifnextchar'{\dabbr@checks}{\xspace}%
  }
  \expandafter\newcommand\csname#1s\endcsname{%
    \textbf{#2s}\xspace
  }
}
\newcommand{\dabbr@checks}[1]{%
  \@ifnextchar s{\textbf{'s}\@gobble}{'}%
}
\makeatother

\defineabbrev{mc}{MyCommand}

\begin{document}
\mc is simple

\mc's has s

``\mc'' has no s

``\textbf{MyCommand}'' has no s

\mcs has s
\end{document}

通过\defineabbrev{xyz}{Text}定义\xyz检查是否's跟随它以及\xyzs是否直接附加它s

答案2

\documentclass{article}
\usepackage{xspace}
\newcommand{\mc}[1][]{\textbf{MyCommand#1}\xspace}
\begin{document}
\mc 
\mc[s]
\mc['s].
\end{document}

在此处输入图片描述

答案3

从上面的评论中,我了解到您并不反对对所需的每种形式使用不同的命令:您只是不想在每次想要构建新的可拒绝宏时都必须麻烦地写出代码。

这里有一种方法,可让您在一个命令中构建所有宏,该命令与\newcommand您构建底层宏时发出的典型命令非常相似。

宏名称为,\buildDeclinedForms它接受两个参数。第一个参数应该是裸控制序列名称(但不带转义符)。第二个参数应该是插入变体形式的\替换文本。#1

\documentclass{article}
\usepackage{xspace}
\makeatletter

\newcommand\buildDeclinedForms[2]{%%
  \expandafter\newcommand\csname ae@#1\endcsname[1]{#2}
  \expandafter\newcommand\csname #1\endcsname{\csname ae@#1\endcsname{}}%%
  \expandafter\newcommand\csname #1s\endcsname{\csname ae@#1\endcsname{s}}%%
  \expandafter\newcommand\csname #1as\endcsname{\csname ae@#1\endcsname{'s}}%%
  \expandafter\newcommand\csname #1sa\endcsname{\csname ae@#1\endcsname{s'}}}%%

\makeatother
\begin{document}

\buildDeclinedForms{nc}{\textbf{declinable command#1}\xspace}

\nc   following text\par
\ncs  following text\par
\ncas following text\par
\ncsa following text\par

\end{document}

输出结果:

在此处输入图片描述

当然,这打开了潘多拉魔盒的其他可能性:创建动词形式、上下文大写等等。如果你想走到这个极端,那应该不难。

一旦你忘记了如何获取所有这些花哨的命令,错误消息也可能会造成混淆。如果你已经定义了 \ncsa或后来选择定义\ncsa,LaTeX 发送给你的错误消息将不会特别有用。至少如果是我,我可能记得创建,\nc但可能会忘记我随后还创建了\ncs\ncas\ncsa

相关内容