Подтвердить что ты не робот

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

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

Предлагаемый макрос

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

не совсем совершенна, так как в случае (\etc more text) она вырабатывает (etc.more text).

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

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

Является ли это слишком личным во вкусе, которое нужно решить в целом?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Техническая проблема! Мы можем избежать проблемы с буквами после пробелов, взглянув на кодовый символ следующего персонажа и увидев, является ли оно буквой; это можно сделать с помощью макроса Latex3 expl3 \peek_charcode:NTF (мой первый код expl3!):

\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}

Совет Jukka. Я думаю, что это звучит, хотя: я бы сказал, что проблема будет работать с его макросом \etc, который мы должны увидеть как ошибку в реализации двойного интервала в Tex (Will Robertson должен попросить его проверить): если вы знаете, ошибка там, вы можете обходить ее напрямую, вставляя\@в таких случаях, как "." ", или у вас может быть сложный код, который означает, что вам не нужно думать в этом случае, но вы добавили сложности для как вы набираете набор, который не будет работать для вас со следующим неожиданным сбоем, который вы, вероятно, представили себе.

Postscript Предыдущая версия исправлена, благодаря Джозефу Рауту, заметив глупую ошибку на tex.stackexchange.com.

Ответ 3

Вы пытались использовать пакет xspace?

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

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

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

Cat, dog, \etc. And so on.   \\
Cat, dog, \etc! And so on.   \\
Cat, dog, \etc, and so on.   \\
Cat (dog, \etc). And so on.  \\

Выдает:

alt text


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

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

Ответ 4

В пакете стиля CVPR он определяется как:

\usepackage{xspace}

% Add a period to the end of an abbreviation unless there one
% already, then \xspace.
\makeatletter
\DeclareRobustCommand\onedot{\futurelet\@[email protected]\@onedot}
\def\@onedot{\ifx\@[email protected]\else.\null\fi\xspace}

\def\eg{\emph{e.g}\onedot} \def\Eg{\emph{E.g}\onedot}
\def\ie{\emph{i.e}\onedot} \def\Ie{\emph{I.e}\onedot}
\def\cf{\emph{c.f}\onedot} \def\Cf{\emph{C.f}\onedot}
\def\etc{\emph{etc}\onedot} \def\vs{\emph{vs}\onedot}
\def\wrt{w.r.t\onedot} \def\dof{d.o.f\onedot}
\def\etal{\emph{et al}\onedot}
\makeatother

Ответ 5

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

\etc\ and more

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