![在带有文本输出的命令中添加 s 或 's](https://linux22.com/image/280286/%E5%9C%A8%E5%B8%A6%E6%9C%89%E6%96%87%E6%9C%AC%E8%BE%93%E5%87%BA%E7%9A%84%E5%91%BD%E4%BB%A4%E4%B8%AD%E6%B7%BB%E5%8A%A0%20s%20%E6%88%96%20's.png)
如果我做了类似的事情
\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
。