Saltar al contenido

Espacio después de los comandos LaTeX

Solución:

Si crea una macro sin argumentos, siempre debe invocarla con una declaración vacía después:
arnold{}

La razón detrás de esto es que LaTeX ignora los espacios (escritos) directamente después de la macro (simplemente detienen la búsqueda del nombre de la macro). Debe romper eso usando un espacio protegido (como ya escribió) o una declaración vacía {}. Recomendaría usar una declaración vacía, ya que usar un espacio protegido puede generar efectos desagradables, por ejemplo, si ese espacio protegido va seguido directamente de un salto de línea. En ese caso, LaTeX podría imprimir dos espacios en su lugar, lo que se ve feo y no es deseado. El uso de una declaración vacía evita esto.

Ya se ha respondido cómo puede agregar el espacio directamente a la macro, pero ¿realmente desea esto? Te meterás en problemas tan pronto como la macro vaya seguida de un signo de puntuación (o si la macro va seguida de una footnote, etc.):

arnold,
Arnold Schwarzenegger ,

Recomiendo optar por la opción de declaración vacía, uno se acostumbra bastante rápido.

Si, mira el xspace paquete.

usepackage{xspace}

Y luego …

newcommand{arnold}{Arnold Schwarzeneggerxspace}

* Esta es una respuesta resumida, destacando los beneficios e inconvenientes de las diferentes técnicas disponibles para preservar espacios después de una palabra de control. Conceptualmente, esto está destinado a implementaciones de LaTeX donde la palabra de control no acepta argumentos, se expande a texto simple, posiblemente formateado, y se usa principalmente en prosa.

Fondo:

El procesador de entrada TeX, después de construir una secuencia de control que consta de caracteres con el código de categoría = 11 (una palabra de control), cambia al estado S, que omite los caracteres con el código de categoría = 10 (espacio). Por lo tanto, para conservar los espacios que siguen a una palabra de control, se debe utilizar un carácter con código de categoría <10 o código de categoría> 11 entre la palabra de control y el siguiente espacio. Esta es la esencia de las primeras cinco opciones a continuación. La sexta opción funciona después del procesador de entrada y agrega un espacio dependiendo del siguiente token.

Criterios de evaluación:

La pregunta define una base única para la comparación:

  1. Minimice el número de caracteres adicionales más allá de la palabra de control de línea de base (arnold como ejemplo).

La brevedad no debe ser el único factor a considerar. Las características cualitativas también son importantes. Por ejemplo, el enfoque:

  1. ¿Permitir que los espacios finales esperados se eliminen por error? En otras palabras, ¿existen variantes válidas de la palabra de control que eliminarían un espacio explícito?
  2. ¿Agregar espacios finales inesperados después de la palabra de control?
  3. ¿Genera un error si la palabra de control ya está definida?
  4. Aplicar a las palabras de control existentes (p. Ej., LaTeX)?
  5. ¿Hacer cumplir el uso consistente de la palabra de control en la prosa? Al igual que con (2), ¿existen variantes válidas de la palabra de control? El deseo de un uso coherente se deriva de la interpretación razonable de una palabra de control como un sustituto directo del texto subyacente.
  6. ¿Crea consecuencias / conflictos no deseados con otros aspectos de LaTeX?

Como el peso de cada punto anterior es subjetivo y no existe una solución perfecta, el mejor El enfoque es en gran medida una cuestión de preferencia personal. El factor (1) se enumera en el encabezado de las opciones, mientras que los factores restantes se evalúan en Beneficios y Inconvenientes. Cada una de las opciones siguientes tiene implementaciones (aquellas “Con verificación”) para satisfacer (4) y, por lo tanto, se omite.


Opción 1: Agregue un espacio de control ( = barra invertida + espacio) después de la palabra de control cuando se desea un espacio. Impacto: 0 o 1 caracteres adicionales.

La solución “explícita” dada en la página 8 de The TEXbook. Esto produce un token de secuencia de control (diferente del token de carácter que se genera solo con un espacio) y, por lo tanto, se retiene.

Definición: newcommand{arnold}{Arnold Schwarzenegger}

Usos de ejemplo:

  1. Espacio después: He yelled ``Get to the choppa!'' in his best arnold impression.
  2. Puntuación después de: According to arnold, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (3) No agrega espacios finales inesperados.
  • (5) Aplicable a palabras de control preexistentes.

Inconvenientes:

  • (2) Si se omite, se eliminarán los espacios finales (es decir, best arnold impression por encima de los rendimientos best Arnold Schwarzeneggerimpression).
  • (6) Uso no consistente (es decir, arnold , por encima de los rendimientos Arnold Schwarzenegger ,).

Opcion 2: Agregar {} después de la palabra de control cuando se desea un espacio o después de cada uso.

Implementación A: Impacto: 0 o 2 caracteres adicionales.

Como se sugiere en la respuesta de bluebrother, el { El carácter que sigue a la palabra de control en este enfoque hace que el procesador de entrada cambie al estado M y retenga el primer espacio siguiente.

Definición: newcommand{arnold}{Arnold Schwarzenegger}

Usos:

  1. Espacio después: He yelled ``Get to the choppa!'' in his best arnold{} impression.
  2. Puntuación después de:
    • According to arnold, it is pronounced Kal-e-four-knee-yah.
    • According to arnold{}, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (3) No agrega espacios finales inesperados.
  • (5) Aplicable a palabras de control preexistentes.

Inconvenientes:

  • (2) Si se omite, se eliminarán los espacios finales (es decir, best arnold impression por encima de los rendimientos best Arnold Schwarzeneggerimpression).
  • (6) Uso no consistente (inclusión u omisión de {} ambos son aceptables si van seguidos de puntuación).
  • (7) Consecuencias / conflictos no deseados:

    • Evita el interletraje y las ligaduras con el texto posterior si se usa como parte de una palabra / acrónimo (consulte la respuesta de Ulrich Diez).

Implementación B: Impacto: 2 personajes adicionales.

Enfoques alternativos que generan errores si {} no sigue la palabra de control se puede encontrar en Inconvenientes del método csname para evitar espacios después del comando.

Definición: Varía

Usos:

  • Espacio después: He yelled ``Get to the choppa!'' in his best arnold{} impression.
  • Puntuación después de: According to arnold{}, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (2) Evita que se eliminen los espacios finales esperados (se genera un error si {} se omite).
  • (3) No agrega espacios finales inesperados.
  • (6) El uso es principalmente consistente (error generado si {} se omite; sin embargo, {relax} compilará).

Inconvenientes:

  • (5) No se aplica a las palabras de control existentes.
  • (7) Consecuencias / conflictos no deseados:

    • Algunos las implementaciones pueden evitar el kerning y las ligaduras con el texto posterior si se usan como parte de una palabra / acrónimo (consulte la respuesta de Ulrich Diez).

Opcion 3: Rodee la palabra de control en { } cuando se desea un espacio o para cada uso. Impacto: 0 o 2 caracteres adicionales.

Sugerido por Trylks en un comentario a la respuesta de bluebrother.

Definición: newcommand{arnold}{Arnold Schwarzenegger}

Usos:

  1. Espacio después: He yelled ``Get to the choppa!'' using his best {arnold} impression.
  2. Puntuación después de:
    • According to arnold, it is pronounced Kal-e-four-knee-yah.
    • According to {arnold}, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (3) No agrega espacios finales inesperados.
  • (5) Aplicable a palabras de control preexistentes.

Inconvenientes:

  • (2) Si se omite, se eliminarán los espacios finales (es decir, best arnold impression por encima de los rendimientos best Arnold Schwarzeneggerimpression).
  • (6) Uso no consistente (inclusión u omisión de { } ambos son aceptables si van seguidos de puntuación).
  • (7) Consecuencias / conflictos no deseados:

    • Coloca el comando en un grupo, lo que limita los efectos no globales de ese comando a ese alcance (como lo señala gernot en los comentarios a continuación).
    • Evita el interletraje y las ligaduras con el texto posterior si se usa como parte de una palabra / acrónimo (consulte la respuesta de Ulrich Diez).

Opcion 4: Agregue un carácter que no sea una letra al final de la palabra de control en su definición y después de cada uso. Impacto: 1 personaje adicional.

Una variante de la respuesta de Przemysław Scherwentke (ver también la respuesta de Lockstep y la respuesta de yo), esta es quizás la solución “canónica” (Página 204 de The TEXbook):

Puede utilizar esta idea para definir macros que están destinadas a ser utilizadas en oraciones, para que los usuarios no tengan que preocuparse por la posible desaparición de espacios.

Definiendo la palabra de control con def y colocando un carácter que no sea una letra al principio del texto del parámetro, el carácter será requerido. Como arriba, la definición puede estar envuelta en @ifdefinable para realizar la misma comprobación que newcommand y generar un error si la palabra de control ya está definida.

Definición:

Sin cheque: defarnold/{Arnold Schwarzenegger}

Con verificación (consulte el Apéndice al final de esta respuesta para una implementación alternativa):

makeatletter
    @ifdefinable{arnold}{defarnold/{Arnold Schwarzenegger}}
makeatother

Usos:

  1. Espacio después: He yelled ``Get to the choppa!'' using his best arnold/ impression.
  2. Puntuación después de: According to arnold/, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (2) Evita que se eliminen los espacios finales esperados (se genera un error si / se omite).
  • (3) No agrega espacios finales inesperados.
  • (6) El uso es consistente (se produce un error si / se omite).

Inconvenientes:

  • (5) No se aplica a las palabras de control existentes. Adicional: El Apéndice al final de esta respuesta proporciona un medio para redefinir las palabras de control existentes individuales para seguir esta convención.

Opción 5: Agregar # al final del texto del parámetro en la definición para requerir { para seguir inmediatamente la palabra de control. Impacto: 2 o? caracteres adicionales.

Definiendo la palabra de control con def y colocando # al final del texto del parámetro, la palabra de control deberá ir seguida de una llave de apertura (página 204 de The TEXbook). Una llave de cierre también será requerido para cerrar el grupo (ver los comentarios de gernot a continuación), aunque, en el momento de escribir este artículo, no todos los editores analizan correctamente la advertencia resultante de su omisión. La definición puede estar envuelta en @ifdefinable para realizar la misma comprobación que newcommand y generar un error si la palabra de control ya está definida.

Definición:

Sin cheque: defarnold#{Arnold Schwarzenegger}

Con verificación (consulte el Apéndice al final de esta respuesta para una implementación alternativa):

makeatletter
    @ifdefinable{arnold}{defarnold#{Arnold Schwarzenegger}}
makeatother

Usos:

  • Espacio después:

    • He yelled ``Get to the choppa!'' in his best arnold{} impression.
    • He yelled ``Get to the choppa!'' in his best arnold{ }impression.
  • Puntuación después de:

    • According to arnold{}, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (2) Evita que se eliminen los espacios finales esperados (se genera un error / advertencia si {, {}, o {<anything>} se omite).
  • (3) No agrega espacios finales inesperados.

Inconvenientes:

  • (5) No se aplica a las palabras de control existentes. Adicional: El Apéndice al final de esta respuesta proporciona un medio para redefinir las palabras de control existentes individuales para seguir esta convención.
  • (6) El uso no es consistente. La palabra de control puede ir seguida de {} o {<anything>}.

Opción 6: utilice el xspace empaquetar y agregar xspace al final de la definición. Impacto: 0 * caracteres adicionales

Esta es la respuesta de Uri. los xspace El paquete actúa después del procesador de entrada y agrega un espacio dependiendo del token que sigue a la palabra de control.

Definición: newcommand{arnold}{Arnold Schwarzeneggerxspace}

Usos:

  1. Espacio después:
    • He yelled ``Get to the choppa!'' in his best arnold impression.
    • He yelled ``Get to the choppa!'' in his best arnold{} impression.
    • He yelled ``Get to the choppa!'' in his best arnold impression.
  2. Puntuación después de:
    • According to arnold, it is pronounced Kal-e-four-knee-yah.
    • According to arnold{}, it is pronounced Kal-e-four-knee-yah.

Beneficios:

  • (2) Evita que se eliminen los espacios finales esperados.

Inconvenientes:

  • (3) Puede agregar espacios finales inesperados.
  • (6) El uso puede no ser * consistente.
  • (5) No se aplica a las palabras de control existentes.

* Idealmente, este enfoque no requeriría caracteres adicionales cada vez que se use la palabra de control. Sin embargo, en situaciones en las que falla, un {} es necesario.


Apéndice

Una interfaz para agregar un delimitador requerido a una macro sin parámetros existente que produce texto solamente.

documentclass{article}

makeatletter
newcommandrequiredelimiter[2][########]{%
  ifdefined#2%
    def@temp{def#2#1}%
    expandafter@tempexpandafter{#2}%
  else
    @[email protected]{noexpand#2undefined}@ehc
  fi
}
@onlypreamblerequiredelimiter
makeatother

requiredelimiter{LaTeX}

newcommandarnold{Arnold Schwarzenegger}
requiredelimiter[/]{arnold}

requiredelimiter{foo} % <---- ERROR

begin{document}

LaTeX{} is nice

arnold/ is strong

end{document}

Sin un argumento opcional, la macro (redefinida) requerirá un par de llaves después de ella, como LaTeX en el ejemplo. Con el argumento opcional, se requerirán los tokens especificados en su lugar, como para arnold en el ejemplo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *