38 votes

Manière correcte de définir les macros \ etc \ ie en latex

Dans cet article l'auteur discute de l'utilisation de \@ à mettre corriger les espacements d'après les points qui ne sont pas à la fin d'une phrase, par exemple, M. d. etc.

La macro suggéré

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

n'est pas tout à fait parfait, car dans le cas (\etc more text) il produit (etc.more text).

J'ai vu beaucoup d'auteurs qui ont fait leur propre version de l' \etc macro, la plupart des variations sur etc.\.

Quelles macros pour \etc, \ie, \etal, \eg produire de meilleurs résultats dans la plupart des situations?

Est-ce quelque chose de trop personnel dans le goût d'être résolu en général?

20voto

Jukka Suomela Points 2932

Plus tôt, j'ai utilisé les macros pour "et coll." etc., mais aujourd'hui, je voudrais décourager les gens de la définition de ce type de macros.

Un problème est ce qu'on a déjà observé: il est étonnamment difficile à obtenir l'définitions de droit, afin qu'ils manipulent tous les cas spéciaux correctement (y compris les interactions avec d'autres paquets – par exemple, ceux qui re-définir le "\cite de la commande" et de modifier l'espacement avant les références).

Mais plus important encore, même si vous avez un tas de macros en fonction de vos besoins et vous savez comment les utiliser, votre co-auteurs sont susceptibles d'être confondu avec exactement comment utiliser des macros correctement dans divers cas particuliers.

Donc je vous recommande d'éviter les macros pour des choses insignifiantes comme "et coll." et simplement tout expliquer par l'utilisation de Latex standard de balisage. Après tout, la plupart des cas, n'ont pas besoin particulières de manipulation ("par exemple" est souvent suivi d'une virgule; "et coll." est souvent suivi par "~\cite", etc.), et à chaque fois qu'un traitement spécial est nécessaire, tous les utilisateurs de Latex doivent savoir comment utiliser les commandes comme "\ " et "\@".

5voto

Charles Stewart Points 7698

Un défi technique! On peut éviter le problème des lettres après les espaces en regardant le catcode du caractère suivant et de voir si oui ou non il s'agit d'une lettre; cela peut être fait avec le Latex3 de expl3 macro \peek_charcode:NTF (mon premier expl3 code!):

\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 les conseils je pense que c'est le son, cependant: je dirais que le problème se travaille avec son \etc macro, nous devrions le voir comme un bogue dans le Tex mise en œuvre de l'espacement double (will Robertson doit demander son chèque): si vous connaissez le bug est là, vous pouvez le contourner directement par la mise en \@ dans de tels cas ".)", ou vous pouvez avoir délicate code qui signifie que vous n'avez pas à penser dans ce cas, mais vous avez ajouté de la complexité de la façon dont vous composez ce qui n'est pas d'aller travailler pour vous avec le côté inattendu de pépin, on vous avez probablement vous-même introduit.

Postscript Précédente version fixe, grâce à Joseph Wright remarquer une erreur stupide, à tex.stackexchange.com.

4voto

Geoff Points 3621

Avez-vous essayé d'utiliser l' xspace package?

Exemple de macro:

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

Quelques tests:

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

Produit:

alt text


À partir de la documentation:

Le package xspace fournit un seul commande qui ressemble à ce qui vient après dans le flux de commande, et décide si pour insérer un espace à remplacer un "mangé" par la commande TeX décodeur.

1voto

Svante Points 24355

Toutes les commandes LaTeX éliminent l'espace après elles. Si vous voulez un espace, vous devez y échapper:

 \etc\ and more
 

Cela est nécessaire car vous devez indiquer clairement où se termine le nom de la commande. \etcno space ne peut pas être interprété correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X