带有空格和标点符号的自定义命令?

带有空格和标点符号的自定义命令?

我想编写一个自定义命令来生成物种名称,但是在使用标点符号时遇到了困难。

我期望的输出规格是:

  • 斜体文字
  • 无换行
  • 如果在文本中使用,则在名称后保留空格,如果标点符号后面没有空格

我用了

\newcommand{\rip}{\mbox{\textit{C. riparius }}}

但这会在标点符号前产生空格。

我读过有关该\xspace软件包的信息,但似乎无法让它正常工作。

实现这一目标的正确方法是什么?

答案1

我建议这样做:

\newcommand{\rip}{\textit{C.~riparius}\xspace}
  • \xspace最后根据空格和标点符号做你想做的事情。
  • 内部的空格\mbox是自然宽度,这可能与同一行上的其他空格不同。使用~代替 可以避免\mbox这个问题,IE,使用~,你的不可破坏空格将与同一行上的其他单词间空格具有相同的宽度——这是一件好事。另一方面,~(称为领带) 并不能阻止“riparius”的连字符,所以如果你确实想阻止它,你必须采取其他措施(我会说\mbox,或者在序言中明确说明\hyphenation{riparius}[1],这会更好,因为我已经解释过间距的原因)。

(当周围内容已经是斜体时,如果您希望将参数排版为直立形状,则可能需要使用\emph而不是\textit,但根据 egreg 的说法,这对于物种名称来说是不正确的,因此将此替代方案排除在提议的解决方案之外:)


[1] 如果你使用 babel 并在语言之间切换,\babelhyphenation可能比 更好\hyphenation,请参阅这条信息举个例子。

答案2

我建议使用诸如 之类的命令\species{rip},这样就不会出现空格问题。这也更加灵活。使用以下代码,您可以为常用物种定义缩写字符串,但\species也允许输入不带缩写的字符串。

标记不会重很多,而且它在灵活性和语义方面是有回报的。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \g_voidnyx_species_tl

\NewDocumentCommand{\addspecies}{mm}
 {
  \tl_gput_right:Nn \g_voidnyx_species_tl { {#1}{#2} }
 }

\NewDocumentCommand{\species}{m}
 {
  \textit
   {
    \str_case:nVF { #1 } \g_voidnyx_species_tl { #1 }
   }
 }

\ExplSyntaxOff

\addspecies{rip}{C.~riparius}
\addspecies{homo}{H.~sapiens}

\begin{document}

My preferred species is \species{rip}, but I also
like \species{homo} because it's very interesting.
Possibly \species{E.~caballus} is another one.

\end{document}

在此处输入图片描述

相关内容