¿Qué consejos tienen las personas para jugar al golf en TeX / LaTeX? Publique un consejo por respuesta, cada uno al menos algo específico para TeX / LaTeX.
Contexto: me di cuenta de esta respuesta y de que no hay preguntas sobre consejos para TeX / LaTeX, así que estoy creando esta. Hay cierta superposición con los consejos de preguntas más estrictas para jugar al golf en TikZ (ya que TikZ es un paquete macro específico sobre TeX / LaTeX): las respuestas a esta pregunta probablemente también se apliquen allí, pero no al revés.
Respuestas:
Considere las macros internas de LaTeX en lugar de las documentadas
Por ejemplo,
\roman
es una macro de LaTeX documentada que funciona en contadores de LaTeX. Para convertirse42
enXLIV
tendrías que usar algo comoEn cambio, al buscar cómo
\roman
se implementa (se usa\show\roman
para obtener esto de forma interactiva, en lugar de leer los archivos fuente), se puede ver que se implementa en términos de una macro útil llamada\@roman
, y en su lugar se usa directamente:\catcode`@11
es la forma de escribir de golf\makeatletter
(forma limpia en LaTeX) o\catcode`\@=11
(forma limpia en TeX simple). Se necesita solo una vez al principio, después de esto puede usar nombres de macro que contengan@
.fuente
~
se puede usar como macro (al igual que otros caracteres activos)Ejemplo
Antes de:
Después:
Explicación : Generalmente las macros en TeX son "secuencias de control": puede definir
\something
o\a
. Pero puedes ir aún más corto, usando un personaje activo. El único carácter activo que está presente de forma predeterminada (en TeX / LaTeX simple) es~
(usado para "empates", es decir, definido como\penalty \@M \
en TeX simple (una penalización de 10000 seguido de un espacio), y como\nobreakspace {}
en LaTeX). Pero nada le impide redefinirlo para cualquier propósito que necesite.Además : puede hacer lo mismo con cualquier otro personaje estableciendo su código de gato en
\active
(13). Por ejemplo, hacerZ
un carácter activo tiene un "costo" de 12 bytes:\catcode`Z13
. Luego puede usar simplemente enZ
todas partes en lugar de una macro como\z
. Para algunos caracteres que comienzan con un significado especial, el enfoque de retroceso directo no funciona y necesita un carácter más:\catcode`\Z13
o\catcode90=13
.fuente
\def
puede coincidir con patrones fijosDigamos que tuviste
\def\a #1 #2 {...some definition here...}
. Luego, cuando lo llame en una cadena como\a Act42, Scene26
, dentro de la macro, los argumentos pueden asignarse como # 1 <-Act42,
, # 2 <-Scene26
y luego tendrá que hacer un trabajo adicional para extraer las partes relevantes. En cambio, uno podría escribir directamentey luego llamarlo como
\a Act42, Scene26
establecería directamente # 1 <-42
y # 2 <-26
.(Esta es básicamente la definición de
\def
, pero es fácil de olvidar ya que uno no suele hacer esto en LaTeX, prefiriendo pasar argumentos{}
como si fueran llamadas a funciones).fuente
Elegir entre TeX simple y LaTeX
Se puede decir mucho sobre esto, pero en resumen, compare un documento normal típico de TeX que imprima "Hola" con un documento típico de LaTeX para lo mismo:
versus
El "costo" de LaTeX (wrt code golf) es obvio; El "beneficio", por supuesto, es que LaTeX viene con una biblioteca de muchas macros y paquetes escritos previamente, algunos de los cuales pueden ser útiles para la tarea en cuestión.
fuente
\@Roman
(hacer que las mayúsculas funcionen en plano costaría muchos bytes), pero el TeX simple a menudo sería más corto.\input ...
es más corto que\usepackage{...}
Por ejemplo, puedes escribir
en lugar de
que es 6 bytes menos.
fuente
\usepackage
vuelve más eficiente a medida que aumenta la cantidad de paquetes que incluye. Como puede usar más de un paquete con una sola\usepackage
declaración, pero requiere una\input
para cada paquete, si está usando 3 o más paquetes, se\usepackage
convierte en la mejor opción.Si usa LaTeX, use un breve
documentclass
(idea de Chris H )En lugar de comenzar con lo típico
uno puede elegir clases de documentos más cortas como
book
o inclusoo
fuente
article
por defecto numera sus páginas, esto puede considerarse una salida adicional. Quizás una meta pregunta es para determinar qué clases de documentos deberían permitirse.g.cls
que está justoarticle.cls
con,\pagenumbering{gobble}
pero como github está caído, no puedo ponerlo por ahorag.cls
Crear un entorno llamado
myenvironment
genera los comandos\myenvironment
y\endmyenvironment
. Estos se utilizan internamente para comenzar y finalizar el entorno. En algunos casos pueden usarse como atajos. Por ejemplo, en lugar deuno puede hacer
No es compatible, no es confiable, no funciona en todos los casos, use bajo su propio riesgo, etc., etc.
fuente
\itemize{...}
para ahorrar aún más.\usepackage{packagea,packageb,packagec}
funciona, siempre y cuando no pase opciones a los paquetes.fuente
Corre líneas juntas. Los saltos de línea rara vez se necesitan en LaTeX / TeX, en comparación con muchos lenguajes de formato largo.
fuente
Algunas macros que podría esperar necesitar llaves alrededor de sus argumentos en realidad no lo hacen, especialmente cuando se usan dentro de otra macro con
#1
argumentos de estilo.La mayoría de las macros solo necesitan llaves si hay más de un token (carácter o secuencia de control) en el argumento.
fuente
Si necesita usar la misma macro con un nombre largo varias veces, puede usarla
\let
para definir un alias más corto.Esto ahorra dos bytes
\def\a{\mymacrowithalongname}
, si no necesita múltiples tokens en la definición.En lugar de un nombre de macro, puede tener un carácter activo para guardar en barras invertidas.
Tenga en cuenta que
\let
no solo funciona con nombres de macro sino también con primitivas integradas. Por ejemplo, si usa muchas\ifnum ... \fi
construcciones en su código, definirlas\let\i\ifnum
y usarlas\i ... \fi
podría ahorrarle unos pocos bytes. Esto funciona incluso para\let
sí mismo:\let\l\let
.fuente
Use los grupos locales
{
...}
sabiamenteComo se señaló en esta respuesta , los caracteres activos como
~
pueden usarse como un nombre de macro. Desafortunadamente,~
es el único carácter activo de forma predeterminada, y cambiar el código cat por otro carácter es costoso:\catcode`!13
toma 12 bytes. Si la nueva definición de macro solo es necesaria en una pequeña región de su código, los grupos locales pueden ser una solución.Cuando TeX ingresa a un nuevo grupo local abierto por
{
, crea un nuevo nivel de agrupación en la pila de guardado interna. Esto significa que se guardan todas las macros y registros actuales. Cualquier modificación a ellos (a menos que se marque explícitamente como\global
) ahora solo estará activa hasta que se cierre el grupo}
. Esto significa que~
puede redefinirse dentro de un grupo, usarse allí con la nueva definición, y la definición anterior se restaurará automáticamente una vez que el grupo haya finalizado.Aquí hay un ejemplo:
Esto salidas
Un efecto secundario interesante de este mecanismo de agrupación es que los valores antiguos todavía están disponibles dentro del grupo hasta que se cambien allí. Para ilustrar eso, imagine que queremos imprimir varios caracteres en función del valor de un contador, rellenarlos con espacios de una longitud fija y continuar con el valor del contador original. Esto podría lograrse de la siguiente manera:
que salidas
Este comportamiento de agrupación es especialmente importante si desea utilizar las macros estándar de TeX para bucles
\loop ... \repeat
anidados. Estas macros definen comandos internos y los usan para determinar cómo proceder. Anidarlos sin poner el lazo interno entre llaves confundirá los comandos internos y conducirá a un comportamiento inesperado.fuente
El avance de contadores, como
también funciona como
El mismo principio también funciona para la inicialización:
establece el contador \ u en 1.
Tenga en cuenta que estos necesitan un carácter de espacio en blanco (salto de línea o espacio) después de ellos (o un
\relax
, pero el espacio en blanco hace lo mismo) para que no se ignore el siguiente comando. Por ejemplo,NO imprime \ u, pero ignora el
\the
comando.fuente
\enddocument
en lugar de\end{document}
guardar dos personajesfuente
\begin{document}
=>\document
aunque