![带有空格和标点符号的自定义命令?](https://linux22.com/image/378695/%E5%B8%A6%E6%9C%89%E7%A9%BA%E6%A0%BC%E5%92%8C%E6%A0%87%E7%82%B9%E7%AC%A6%E5%8F%B7%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想编写一个自定义命令来生成物种名称,但是在使用标点符号时遇到了困难。
我期望的输出规格是:
- 斜体文字
- 无换行
- 如果在文本中使用,则在名称后保留空格,如果标点符号后面没有空格
我用了
\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}