缩写:考虑间距和标点符号

缩写:考虑间距和标点符号

所以我试着想出一些好的一般的我的 TeX 模板中的拉丁缩写定义......

到目前为止我所做的是:

\usepackage{xspace}
\newcommand{\etc}{etc.\xspace}

..适用于间距但是当我使用像这样的宏时,它并不能解决句子末尾出现“blah 等”的问题。blah \etc.所以我四处寻找,在这个答案中找到了很好的解决方案这里,我稍微修改了一下:

\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\appendFullStop}[1]{
  \peek_meaning:NTF . {% Same as \@ifnextchar
    #1\@}%
  { \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter
      #1.\@ }%
    {#1.\@}}}
\ExplSyntaxOff
% Omit final dot from each definition, it is added automatically when needed!
\newcommand{\etc}{\appendFullStop{etc}}

现在,适用于标点,这意味着..blah \etc.实际上编译为“..blah 等”而不是“等”。但我现在又遇到了间距问题……

所以我想通过合并这两种方法来解决这个问题。但是将上面代码片段中的最后一行改为

\newcommand{\etc}{\appendFullStop{etc}\xspace}

再次破坏了标点符号......

我对此很困惑,非常感谢您的帮助!


第二段代码片段不处理间距的示例:

\documentclass{article}
%\usepackage{xspace}

% Define a macro to look ahead one character and append a full-stop
\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\appendFullStop}[1]{
  \peek_meaning:NTF . {% Same as \@ifnextchar
    #1\@}%
  { \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter
      #1.\@ }%
    {#1.\@}}}
\ExplSyntaxOff
% Define the style for latin abbreviations
% Omit final dot from each definition, it is added automatically when needed!
\newcommand{\etc}{\appendFullStop{etc}}

\begin{document}
Test \etc in the middle. \\
After comma \etc, we test as well. \\
Finally at the end of a sentence \etc. \\
\end{document}

答案1

好的,尝试找到解决方案,这里是一个组合。我决定使用该\xspace包来避免手动处理整个间距问题 - 根据我的经验,\xspace它实际上在这方面相当不错...

版本 1

如果下一个字符是 ,则抑制句子末尾的句号.

\usepackage{expl3}
\usepackage{xspace}
\ExplSyntaxOn
\newcommand{\latinabbrev}[1]{
  \peek_meaning:NTF .
  {#1\xspace}
  {
    #1.\xspace
  }
}
\ExplSyntaxOff
\newcommand{\etc}{\latinabbrev{etc}}

版本 2

如果下一个字符是.,!或,则隐藏句点?。我不确定这在印刷上是否合理,至少我没有找到任何来源。如果您有兴趣讨论,我在 english.stackexchange 上发布了一个问题这里

\usepackage{expl3}
\usepackage{xspace}
\ExplSyntaxOn
\newcommand{\latinabbrev}[1]{
  \peek_meaning:NTF .
  {#1\xspace}
  {
    \peek_meaning:NTF !
    {#1\xspace}
    { 
      \peek_meaning:NTF ?
      {#1\xspace}
      { 
        #1.\xspace
      }
    }
  }
}
\ExplSyntaxOff
\newcommand{\etc}{\latinabbrev{etc}}

如果您有任何建议,请加入讨论...

答案2

对宏进行以下更改似乎可以解决问题(我在您的示例中添加了一些文本以显示句末标点符号):

\documentclass{article}
%\usepackage{xspace}

% Define a macro to look ahead one character and append a full-stop
\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\appendFullStop}[1]{
  \peek_meaning:NTF . {% Same as \@ifnextchar
    #1\@}%
  { \peek_catcode:NTF a {% Check whether next char has same catcode as \'a, i.e., is a letter
      #1.\@\ }%
    {#1.\@}}}
\ExplSyntaxOff
% Define the style for latin abbreviations
% Omit final dot from each definition, it is added automatically when needed!
\newcommand{\etc}{\appendFullStop{etc}}

\begin{document}
Test \etc in the middle. \\
After comma \etc, we test as well. \\
Finally at the end of a sentence \etc. Two. Three. \\
\end{document}

第二种情况(缩写后面跟着一个字母)后面的空格被吞噬了,这是不会发生的\- 我认为这是一个 expl3 语法问题,因为空格在那时通常并不重要;我很惊讶我之前测试的时候没有注意到这一点。

这很像黑客行为。例如,它无法正确处理句末标点符号.。除非有人实施了正确的方法,否则在使用这种宏时要小心。此外,对于像测试 catcodes 这样微不足道的事情,加载 expl3 宏似乎有些过头了,但毫无疑问,几年后这将变得非常自然。

宏的名称:我更喜欢\latinabbrev,因为它指向我们想要的特定功能;仅名称就表明了完全不同的\def\appendFullStop#1{#1\@.}良好实现。

相关内容