Quels conseils les gens ont-ils pour jouer au golf dans TeX / LaTeX? Veuillez poster un conseil par réponse, chacun au moins quelque peu spécifique à TeX / LaTeX.
Contexte: J'ai remarqué cette réponse et il n'y a pas de question de conseils pour TeX / LaTeX, donc je crée celle-ci. Il y a un certain chevauchement avec les conseils de questions plus étroits pour jouer au golf dans TikZ (car TikZ est un package de macro spécifique au-dessus de TeX / LaTeX): les réponses à cette question s'appliqueront probablement également là-bas, mais pas l'inverse.
Réponses:
Considérez les macros LaTeX internes plutôt que celles documentées
Par exemple,
\roman
est une macro LaTeX documentée qui fonctionne sur les compteurs LaTeX. Pour42
devenir,XLIV
il faudrait utiliser quelque chose commeAu lieu de cela, en recherchant comment
\roman
est implémenté (utilisé\show\roman
pour l'obtenir de manière interactive, au lieu de lire les fichiers source), on peut voir qu'il est implémenté en termes d'une macro utile appelée\@roman
, et plutôt l'utiliser directement:\catcode`@11
est l'écriture golfique\makeatletter
(voie propre dans LaTeX) ou\catcode`\@=11
(voie propre dans TeX simple). Il n'est nécessaire qu'une seule fois au début, après cela, vous pouvez utiliser des noms de macro contenant@
.la source
~
peut être utilisé comme macro (tout comme les autres caractères actifs)Exemple
Avant:
Après:
Explication : Généralement, les macros dans TeX sont des «séquences de contrôle»: vous pouvez définir
\something
ou\a
. Mais vous pouvez aller encore plus court, en utilisant un personnage actif. Le seul caractère actif présent par défaut (en plain TeX / LaTeX) est~
(utilisé pour les «cravates», c'est-à-dire défini comme\penalty \@M \
en plain TeX (une pénalité de 10000 suivie d'un espace), et comme\nobreakspace {}
en LaTeX). Mais rien ne vous empêche de le redéfinir pour le but dont vous avez besoin.En outre : vous pouvez faire la même chose avec n'importe quel autre personnage en définissant son code de chat sur
\active
(13). Par exemple, faireZ
un caractère actif a un « coût » de 12 octets:\catcode`Z13
. Ensuite, vous pouvez utiliser simplementZ
partout au lieu d'une macro comme\z
. Pour certains caractères qui commencent par une signification particulière, l'approche de retour direct ne fonctionne pas et vous avez besoin d'un caractère de plus:\catcode`\Z13
ou\catcode90=13
.la source
\def
peut correspondre à des motifs fixesDisons que vous l'avez fait
\def\a #1 #2 {...some definition here...}
. Ensuite, lorsque vous l'appelez sur une chaîne comme\a Act42, Scene26
, à l'intérieur de la macro, les arguments peuvent être affectés comme # 1 <-Act42,
, # 2 <-Scene26
et vous devrez alors faire un travail supplémentaire pour extraire les parties pertinentes. Au lieu de cela, on pourrait directement écrirepuis l'appeler comme
\a Act42, Scene26
définirait directement # 1 <-42
et # 2 <-26
.(Il s'agit essentiellement de la définition de
\def
, mais il est facile d'oublier car on ne le fait généralement pas dans LaTeX, préférant passer des arguments{}
comme s'il s'agissait d'appels de fonction.)la source
Choisir entre TeX simple et LaTeX
Beaucoup peut être dit à ce sujet, mais en bref, comparez un document TeX ordinaire typique qui imprime "Bonjour" avec un document LaTeX typique pour la même chose:
contre
Le "coût" de LaTeX (wrt code golf) est évident; le «bénéfice» est bien sûr que LaTeX est livré avec une bibliothèque de nombreuses macros et packages pré-écrits, dont certains peuvent être utiles pour la tâche à accomplir.
la source
\@Roman
(faire fonctionner les majuscules en clair coûterait beaucoup d'octets) - mais le TeX simple serait souvent plus court.\input ...
est plus court que\usepackage{...}
Par exemple, vous pouvez écrire
au lieu de
ce qui représente 6 octets de moins.
la source
\usepackage
devient plus efficace à mesure que le nombre de packages que vous incluez augmente. Étant donné que vous pouvez utiliser plusieurs packages avec une seule\usepackage
instruction, mais que\input
vous avez besoin d'un pour chaque package, si vous utilisez 3 packages ou plus,\usepackage
devient la meilleure option.Si vous utilisez LaTeX, utilisez un court
documentclass
(idée de Chris H )Au lieu de commencer avec le typique
on peut choisir des classes de documents plus courtes comme
book
ou mêmeou
la source
article
par défaut numérote ses pages, cela peut être considéré comme une sortie supplémentaire. Peut-être qu'une méta-question est pour déterminer quelles classes de documents devraient être autorisées.g.cls
qui est justearticle.cls
avec\pagenumbering{gobble}
mais comme github est en panne, je ne peux pas le mettre pour l'instantg.cls
La création d'un environnement appelé
myenvironment
génère les commandes\myenvironment
et\endmyenvironment
. Ceux-ci sont utilisés en interne pour commencer et terminer l'environnement. Dans certains cas, ils peuvent être utilisés comme raccourcis. Par exemple, au lieu deon peut faire
Non pris en charge, pas fiable, ne fonctionne pas dans tous les cas, utilisez à vos risques et périls, etc. etc.
la source
\itemize{...}
pour encore plus d'économies.\usepackage{packagea,packageb,packagec}
fonctionne, tant que vous ne passez pas d'options aux packages.la source
Exécutez les lignes ensemble. Les sauts de ligne sont rarement nécessaires dans LaTeX / TeX, par rapport à de nombreux langages de forme longue.
la source
Certaines macros dont vous pourriez vous attendre à avoir besoin d'accolades autour de leurs arguments ne le font pas, en particulier lorsqu'elles sont utilisées dans une autre macro avec
#1
des arguments de style.La plupart des macros n'ont besoin d'accolades que s'il y a plus d'un jeton (caractère ou séquence de contrôle) dans l'argument.
la source
Si vous devez utiliser plusieurs fois la même macro avec un nom long, vous pouvez utiliser
\let
pour définir un alias plus court.Cela économise deux octets
\def\a{\mymacrowithalongname}
si vous n'avez pas besoin de plusieurs jetons dans la définition.Au lieu d'un nom de macro, vous pouvez avoir un caractère actif à enregistrer sur les barres obliques inverses.
Notez que
\let
cela ne fonctionne pas seulement avec les noms de macro mais aussi avec les primitives intégrées. Par exemple, si vous utilisez beaucoup de\ifnum ... \fi
constructions dans votre code, définir\let\i\ifnum
et utiliser à la place\i ... \fi
pourrait vous faire économiser quelques octets. Cela fonctionne même pour\let
lui - même:\let\l\let
.la source
Utilisez judicieusement les groupes locaux
{
...}
Comme indiqué dans cette réponse , les caractères actifs comme
~
peuvent être utilisés comme nom de macro. Malheureusement,~
c'est le seul caractère actif par défaut, et changer le catcode pour un autre caractère coûte cher:\catcode`!13
prend 12 octets. Si la nouvelle définition de macro n'est nécessaire que dans une petite région de votre code, les groupes locaux peuvent être une solution.Lorsque TeX entre dans un nouveau groupe local ouvert par
{
, il crée un nouveau niveau de regroupement sur la pile de sauvegarde interne. Cela signifie que toutes les macros et tous les registres actuels sont enregistrés. Toutes les modifications qui y sont apportées (sauf si elles sont explicitement marquées comme\global
) ne sont désormais actives que jusqu'à la fermeture du groupe}
. Cela signifie qu'il~
peut être redéfini au sein d'un groupe, utilisé avec la nouvelle définition, et l'ancienne définition sera automatiquement restaurée une fois le groupe terminé.Voici un exemple:
Cette sorties
Un effet secondaire intéressant de ce mécanisme de regroupement est que les anciennes valeurs sont toujours disponibles à l'intérieur du groupe jusqu'à ce qu'elles y soient modifiées. Pour illustrer cela, imaginez que nous voulons imprimer un certain nombre de caractères en fonction de la valeur d'un compteur, les remplir avec des espaces jusqu'à une longueur fixe et continuer avec la valeur du compteur d'origine. Cela pourrait être réalisé par les moyens suivants:
qui sort
Ce comportement de regroupement est particulièrement important si vous souhaitez utiliser les macros standard de TeX pour les boucles
\loop ... \repeat
imbriquées. Ces macros définissent des commandes internes et les utilisent pour déterminer comment procéder. Les imbriquer sans mettre la boucle intérieure entre accolades confondra les commandes internes et conduira à un comportement inattendu.la source
L'avancement des compteurs, tels que
fonctionnent également comme
Le même principe fonctionne également pour l'initialisation:
met le compteur \ u à 1.
Notez que ceux-ci ont besoin d'un caractère d'espacement (saut de ligne ou espace) après eux (ou un
\relax
, mais l'espace fait de même) de sorte que la commande suivante ne sera pas ignorée. Par exemple,n'imprime PAS \ u, mais ignore la
\the
commande.la source
\enddocument
au lieu d'\end{document}
enregistrer deux caractèresla source
\begin{document}
=>\document
bien