Правильный способ определения макросов \ etc \ т.е. в латексе - PullRequest
34 голосов
/ 19 июля 2010

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

Макрос предложил

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

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

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

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

Это что-то слишком личное во вкусе, чтобы его вообще можно было решить?

Ответы [ 5 ]

19 голосов
/ 19 июля 2010

Раньше я использовал макросы для слов "и др." И т. Д., Но в настоящее время я не рекомендую людям определять такие макросы.

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

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

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

5 голосов
/ 07 сентября 2016

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

\usepackage{xspace}

% Add a period to the end of an abbreviation unless there's one
% already, then \xspace.
\makeatletter
\DeclareRobustCommand\onedot{\futurelet\@let@token\@onedot}
\def\@onedot{\ifx\@let@token.\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 голосов
/ 20 июля 2010

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

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

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

4 голосов
/ 20 августа 2010

Вы пробовали использовать пакет 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.

1 голос
/ 19 июля 2010

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

\etc\ and more

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...