2010-07-19 14 views
33

En this article el autor analiza el uso de \ @ para colocar los espaciamientos correctos después de las paradas completas que no están al final de una oración, p. El señor es decir, etc.Forma correcta de definir macros etc ie en latex

La macro sugirió

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

no es del todo perfecto ya que en el caso (\etc more text) produce (etc.more text).

He visto muchos autores que han hecho sus propias versiones de la macro \etc, en su mayoría variaciones en etc.\.

Qué macros para \etc, \ie, \etal, \eg producen los mejores resultados en la mayoría de situaciones?

¿Se trata de un gusto demasiado personal para ser resuelto en general?

+0

Esta ha sido mi favorito hasta [latex] qn en mucho tiempo. –

+2

He usado \ xspace para mis macros \ etc-like, y mirándolo, me da un espaciado incorrecto y nunca me di cuenta. Me alegro de haber leído esta pregunta. –

+0

@Ivan - ¿Cuáles son los ejemplos de contador? Publiqué una respuesta hace unos días y acabo de ver este comentario. – Geoff

Respuesta

16

Anteriormente usé macros para "et al.", Etc., pero hoy en día no recomendaría que la gente defina ese tipo de macros.

Un problema es lo que ya observó: es sorprendentemente complicado tener las definiciones correctas para que manejen correctamente todos los casos especiales (incluidas las interacciones con otros paquetes, por ejemplo, aquellos que redefinen el comando "\ cite" y ajustar el espaciado antes de las referencias).

Pero lo más importante, incluso si que tiene un montón de macros que se adapten a sus necesidades y saben cómo usarlos, sus coautores son susceptibles de ser confundido con exactamente cómo utilizar las macros correctamente en varios casos especiales.

Por lo tanto, le recomiendo que evite las macros para cosas triviales como "et al". y simplemente deletrear todo mediante el uso de marcado Latex estándar. Después de todo, la mayoría de los casos no necesitan ningún manejo especial ("p. Ej." A menudo va seguido de una coma; "et al." A menudo va seguido de "~ \ cite", etc.) y siempre que sea necesario un manejo especial, todos Los usuarios de látex deben saber cómo usar comandos como "\" y "\ @".

+1

Estoy de acuerdo con el sentimiento de "curación es peor que la enfermedad" de su respuesta, pero * todos los usuarios de Latex deben saber cómo usar comandos como "\" y "\ @" * me perdieron: sabían que Tex pone extra espacio después del período en ".)"? Si lo hiciste, felicitaciones, eres un TeXnician de élite. Si no, entonces no sabía el uso correcto de \ @, que fue lo que llevó a la pregunta. La forma en que Tex digiere tu texto es muy complicado, lo suficientemente complicado como para atrapar a alguien como Will Robertson. –

+0

Charles: Oh, lo siento, me estaba refiriendo a casos más simples (y mucho más comunes) que están cubiertos en prácticamente cualquier tutorial de látex. Claro, estoy de acuerdo en que el caso de ".)" Es realmente sorprendente, y fue agradable aprender algo nuevo de la pregunta original.:) Sin embargo, creo que las complejidades como esta son una buena razón para no intentar arreglarlo mediante el uso de macros ... –

+1

Parece que este es el mejor camino a seguir (al menos hasta que LaTeX3 se convierta en estándar). –

1

Todos los comandos de LaTeX eliminan espacio después de ellos. Si quieres un espacio, lo que necesita para escapar de ella:

\etc\ and more 

Esto es necesario, porque hay que tener claro donde termina el nombre del comando. \etcno space no se puede interpretar correctamente.

+0

Pero puede mirar hacia adelante para ver si el siguiente caracter es catcode 10, para ver si debería haber habido espacio: vea mi respuesta. –

+0

Sí, puedes. Solo estoy diciendo cómo funciona. – Svante

+1

Lamento no dejar de criticar: en realidad no es cierto que todos los comandos eliminen el espacio: solo aquellos compuestos por letras (es decir, catcode 10 caracteres). Otros comandos definidos de la manera normal (es decir, que no usan '\ csname') son secuencias de control de un carácter largo y no engullen el espacio. Esta es exactamente la razón por la cual es una buena idea mirar el catcode del siguiente personaje. –

5

¡Un desafío técnico! Podemos evitar el problema de las letras después de espacios mirando el código cat del siguiente personaje y viendo si es una letra o no; esto se puede hacer con \peek_charcode:NTF macro expl3 del Latex3 (mi primer código 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} 

consejo de Jukka Creo que es sonido, sin embargo: Yo diría que el problema se soluciona con su \ etc macro debemos ver como un error en la implementación de doble espacio de Tex (Will Robertson debería pedir su cheque): si sabes que el error está allí, puedes solucionarlo directamente colocando \ @ en casos como ".)", o puedes Tiene un código engañoso que significa que no tiene que pensar en este caso, pero ha agregado complejidad a la forma en que compuso, lo que no le va a funcionar con el próximo error inesperado, uno que probablemente se haya presentado usted mismo.

Postscript Versión anterior corregida, gracias a Joseph Wright noticing a stupid error en tex.stackexchange.com.

+0

Es "et al.", Abreviatura de "et alii". – Svante

+0

Además, creo que debe haber un espacio pequeño e irrompible en "i.e." y "por ejemplo". – Svante

+0

@Svante: * et al. * - de hecho, arreglado; * Poco, espacio irrompible * - Nunca he oído hablar de eso, y no puedo verlo en ningún libro que haya visto: ¿estás seguro? –

3

¿Has probado con el paquete xspace?

Ejemplo macro:

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

Algunas pruebas:

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

Produce:

alt text


De the documentation:

El paquete XSPACE proporciona un solo comando que se ve en lo que viene después en el flujo de comandos, y decide si desea insertar un espacio para reemplazar uno "comido" por el comando TeX decodificador.

+3

Debe engullir el período de la abreviatura en su primera prueba (es decir, no "etc."), por lo que también debe probar el siguiente carácter. Pero tiene razón, el paquete xspace se puede usar en lugar de probar explícitamente el código de catcode 10. –

+0

Oh. Wow, buen punto. Entonces el primer ejemplo es incorrecto No estaba enterado de esta regla de gramática de alguna manera. – Geoff

+0

Por lo tanto, en su ejemplo 'Tal vez una lista, \ eg,' una lista debe ser 'Tal vez una lista, \ eg.,' Ya que su macro no tiene el período final en ella. Ahora veo por qué no incluye el período final en su macro. Gracias. – Geoff

3

En paquete de estilo de CVPR, que se define como:

\usepackage{xspace} 

% Add a period to the end of an abbreviation unless there's 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 
Cuestiones relacionadas