所以我试着想出一些好的,一般的我的 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\@.}
良好实现。