В этой статье автор обсуждает использование \для помещения корректных интервалов после точек, которые не являются в конце предложения, например, г-на т.е. и т.д.
Макрос предлагается
\newcommand\etc{etc\@ifnextchar.{}{.\@}}
не совсем прекрасно с тех пор в случае (\etc more text)
это производит (etc.more text)
.
Я видел много авторов, которые сделали их собственные версии \etc
макрос, главным образом вариации на etc.\
.
Какие макросы для \etc
, \ie
, \etal
, \eg
привести к самым хорошим результатам в большинстве ситуаций?
Это - что-то слишком персональное во вкусе, который будет решен в целом?
Ранее я использовал макросы для "и т.д." и т.п., но сейчас я бы не советовал людям определять макросы такого рода.
Одна из проблем заключается в том, что вы уже заметили: удивительно сложно правильно подобрать определения, чтобы они правильно обрабатывали все особые случаи (включая взаимодействие с другими пакетами - например, с теми, которые переопределяют команду "\cite" и настраивают интервалы перед ссылками).
Но что более важно, даже если у вас есть куча макросов, которые подходят для ваших нужд, и вы знаете, как их использовать, ваши соавторы, скорее всего, не будут знать, как именно правильно использовать ваши макросы в различных особых случаях.
Поэтому я бы рекомендовал вам избегать макросов для таких тривиальных вещей, как "и др.", и просто писать все с помощью стандартной разметки Latex. В конце концов, большинство случаев не требуют специальной обработки ("например" часто сопровождается запятой; "и др." часто сопровождается "~\cite" и т.д.), а когда требуется специальная обработка, все пользователи Latex должны знать, как использовать такие команды, как "\ " и "\@".
Техническая проблема! Мы можем избежать проблемы с буквами после пробелов, посмотрев на код следующего символа и определив, является ли это буквой; это можно сделать с помощью макроса Exp3 из Latex3 \ peek_charcode: NTF
(мой первый код explo3!):
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand\latinabbrev[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 def.
\def\eg{\latinabbrev{e.g}}
\def\etal{\latinabbrev{et al}}
\def\etc{\latinabbrev{etc}}
\def\ie{\latinabbrev{i.e}}
\begin{document}
Maybe a list, \eg, a, b, c, and d. Which is to say (\ie) a, b, \etc. Consider Knuth, \cf The TeXbook.
\end{document}
Совет Юкки, я думаю, звучит, хотя: я бы сказал, что проблема Уилл решает его \ etc макрос, который мы должны рассматривать как ошибку в реализации Tex с двойным интервалом (Уилл Робертсон должен попросить его проверить): если вы знаете, что ошибка существует, вы можете исправить ее напрямую, вставив \ @ в таких случаях, как ".) ", или у вас может быть сложный код, который означает, что вам не нужно думать в этом случае, но вы усложнили способ набора, который не сработает для вас со следующим неожиданным сбоем, который вы, вероятно, представили себя.
Постскриптум Предыдущая версия исправлена благодаря Джозефу Райту, который заметил глупую ошибку на tex.stackexchange.com.
Все команды LaTeX удаляют пробелы после них. Если вам нужен пробел, вам нужно его экранировать:
\etc\ and more
Это необходимо, потому что вам нужно четко указать, где заканчивается имя команды. \ etcno space
не может быть правильно интерпретирован.
Пробовали ли вы использовать пакет xspace
?
Пример макроса:
\def\etc{etc.\@\xspace}
Некоторые тесты:
Кошка, собака, \etc. И так далее. \\ Кошка, собака, \etc! И так далее. \\ Кошка, собака, \etc, и так далее. \\ Кошка (собака, \etc). И так далее. \\
Производит:
Из документации:
Пакет xspace предоставляет единственную команду, которая смотрит на то, что идет после в потоке команд, и решает вставить ли пробел для замены один "съеденный" командой TeX декодер.