Корректный способ определить макросы \etc \ie в латексе

В этой статье автор обсуждает использование \для помещения корректных интервалов после точек, которые не являются в конце предложения, например, г-на т.е. и т.д.

Макрос предлагается

\newcommand\etc{etc\@ifnextchar.{}{.\@}}

не совсем прекрасно с тех пор в случае (\etc more text) это производит (etc.more text).

Я видел много авторов, которые сделали их собственные версии \etc макрос, главным образом вариации на etc.\.

Какие макросы для \etc, \ie, \etal, \eg привести к самым хорошим результатам в большинстве ситуаций?

Это - что-то слишком персональное во вкусе, который будет решен в целом?

36
задан Péter Török 19 July 2010 в 15:13
поделиться

4 ответа

Ранее я использовал макросы для "и т.д." и т.п., но сейчас я бы не советовал людям определять макросы такого рода.

Одна из проблем заключается в том, что вы уже заметили: удивительно сложно правильно подобрать определения, чтобы они правильно обрабатывали все особые случаи (включая взаимодействие с другими пакетами - например, с теми, которые переопределяют команду "\cite" и настраивают интервалы перед ссылками).

Но что более важно, даже если у вас есть куча макросов, которые подходят для ваших нужд, и вы знаете, как их использовать, ваши соавторы, скорее всего, не будут знать, как именно правильно использовать ваши макросы в различных особых случаях.

Поэтому я бы рекомендовал вам избегать макросов для таких тривиальных вещей, как "и др.", и просто писать все с помощью стандартной разметки Latex. В конце концов, большинство случаев не требуют специальной обработки ("например" часто сопровождается запятой; "и др." часто сопровождается "~\cite" и т.д.), а когда требуется специальная обработка, все пользователи Latex должны знать, как использовать такие команды, как "\ " и "\@".

19
ответ дан 27 November 2019 в 06:14
поделиться

Техническая проблема! Мы можем избежать проблемы с буквами после пробелов, посмотрев на код следующего символа и определив, является ли это буквой; это можно сделать с помощью макроса 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.

5
ответ дан 27 November 2019 в 06:14
поделиться

Все команды LaTeX удаляют пробелы после них. Если вам нужен пробел, вам нужно его экранировать:

\etc\ and more

Это необходимо, потому что вам нужно четко указать, где заканчивается имя команды. \ etcno space не может быть правильно интерпретирован.

1
ответ дан 27 November 2019 в 06:14
поделиться

Пробовали ли вы использовать пакет xspace?

Пример макроса:

\def\etc{etc.\@\xspace}

Некоторые тесты:

Кошка, собака, \etc. И так далее. \\
Кошка, собака, \etc! И так далее. \\
Кошка, собака, \etc, и так далее. \\
Кошка (собака, \etc). И так далее. \\

Производит:

alt text


Из документации:

Пакет xspace предоставляет единственную команду, которая смотрит на то, что идет после в потоке команд, и решает вставить ли пробел для замены один "съеденный" командой TeX декодер.

4
ответ дан 27 November 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: