Dicas para jogar golfe no TeX / LaTeX


28

Que dicas as pessoas têm para jogar golfe no TeX / LaTeX? Poste uma dica por resposta, cada uma pelo menos um pouco específica para o TeX / LaTeX.


Contexto: notei esta resposta e não há perguntas sobre o TeX / LaTeX, por isso estou criando essa. Há alguma sobreposição com as dicas de perguntas mais restritas para jogar golfe no TikZ (como o TikZ é um pacote de macro específico sobre o TeX / LaTeX): as respostas a essa pergunta provavelmente também se aplicarão lá, mas não o contrário.


Como você pode jogar golfe em uma linguagem que não seja de programação?
The Great Duck

1
@TheGreatDuck Muito mal :-)
ShreevatsaR

@TheGreatDuck Na verdade, o TeX é uma linguagem de programação, mesmo que geralmente seja usada apenas como tipográfica.
Gvgramazio # 15/18

Respostas:


15

Considere macros internas do LaTeX em vez das documentadas

Por exemplo, \romané uma macro LaTeX documentada que funciona em contadores LaTeX. Para ligar 42para XLIVvocê teria que usar algo como

\newcounter{z}
\setcounter{z}{42}
\roman{z}

Em vez disso, observando como \romané implementado (use \show\romanpara obter isso de forma interativa, em vez de ler os arquivos de origem), pode-se ver que ele é implementado em termos de uma macro útil chamada \@romane, em vez disso, use-a diretamente:

\catcode`@11
\@roman{42}

\catcode`@11é a maneira de escrever golfe \makeatletter(maneira limpa no LaTeX) ou \catcode`\@=11(maneira limpa no TeX comum). É necessário apenas uma vez no início; depois disso, você pode usar nomes de macro contendo @.


13

~pode ser usado como uma macro (assim como outros caracteres ativos)

Exemplo

Antes:

\def\a{...some definition...} ... use \a...

Depois de:

\def~{...some definition...} ... use ~...

Explicação : Geralmente, as macros no TeX são "seqüências de controle": você pode definir \somethingou \a. Mas você pode ir ainda mais curto, usando um caractere ativo. O único caractere ativo que está presente por padrão (no TeX / LaTeX sem formatação) é ~(usado para "empates", ou seja, definido como \penalty \@M \na TeX sem formatação (uma penalidade de 10000 seguida por um espaço) e como \nobreakspace {}no LaTeX). Mas nada impede que você a redefina para qualquer finalidade que você precise.

Além disso : você pode fazer o mesmo com qualquer outro caractere, definindo seu código de gato como \active(13). Por exemplo, fazendo Zum personagem ativo tem um "custo" de 12 bytes: \catcode`Z13. Então você pode usar simplesmente em Zqualquer lugar, em vez de uma macro \z. Para alguns caracteres que começam com um significado especial, a abordagem de backtick direto não funciona e você precisa de mais um caractere: \catcode`\Z13ou \catcode90=13.


9

\def pode corresponder a padrões fixos

Digamos que você tivesse \def\a #1 #2 {...some definition here...}. Então, quando você a chama em uma string como \a Act42, Scene26, dentro da macro, os argumentos podem ser atribuídos como # 1 <- Act42,, # 2 <- Scene26e, em seguida, você precisa trabalhar mais para extrair as partes relevantes. Em vez disso, alguém poderia escrever diretamente

\def\a Act#1, Scene#2 {...some definition here...}

e depois chamá-lo como \a Act42, Scene26definiria diretamente o número 1 <- 42e o número 2 <- 26.

(Essa é basicamente a definição de \def, mas é fácil esquecer, porque normalmente não se faz isso no LaTeX, preferindo passar argumentos {}como se fossem chamadas de função.)


8

Escolhendo entre TeX e LaTeX simples

Muito pode ser dito sobre isso, mas, resumindo, compare um documento TeX comum comum que imprima "Hello" com um documento LaTeX típico para o mesmo:

Hello
\bye

versus

\documentclass{article}
\begin{document}
Hello
\end{document}

O "custo" do LaTeX (código wrt golf) é óbvio; o "benefício", é claro, é que o LaTeX vem com uma biblioteca de muitas macros e pacotes pré-escritos, alguns dos quais podem ser úteis para a tarefa em questão.


Fiquei preso ao uso do LaTeX por causa de \@Roman(fazer com que as maiúsculas funcionassem em forma simples custaria muitos bytes) - mas o TeX comum costumava ser mais curto.
Chris H

8

\input ... é mais curto que \usepackage{...}

Por exemplo, você pode escrever

\input color

ao invés de

\usepackage{color}

que é 6 bytes menos.


8
É útil ressaltar que isso \usepackagese torna mais eficiente à medida que o número de pacotes que você inclui aumenta. Como você pode usar mais de um pacote com apenas uma \usepackageinstrução, mas exigir uma \inputpara cada pacote, se você estiver usando 3 ou mais pacotes, essa \usepackageserá a melhor opção.
Assistente de trigo

7

Se estiver usando o LaTeX, use uma brevedocumentclass (ideia de Chris H )

Em vez de começar com o típico

\documentclass{article}

pode-se escolher classes de documentos mais curtas, como book ou mesmo

\documentclass{ecv}

ou

\documentclass{tui}

Lembre-se de ficar dentro das especificações da pergunta; articlepor padrão, numera suas páginas, isso pode ser considerado uma saída extra. Talvez uma meta questão seja para determinar quais classes de documentos devem ser permitidas.
Wheat Wizard

@WheatWizard Bom ponto. Eu acho que pode ser uma questão individual se os números de página são considerados saída extra.
ShreevatsaR

Eu acho uma classe mínima seria uma boa ideia - um único nome de letra e sem numeração de página
Chris H

Eu coloquei um g.clsque é apenas article.clscom \pagenumbering{gobble}mas como github é baixo Eu não posso colocá-lo por agora
Chris H


7

Criar um ambiente chamado myenvironmentgera os comandos \myenvironmente \endmyenvironment. Eles são usados ​​internamente para iniciar e finalizar o ambiente. Em alguns casos, eles podem ser usados ​​como atalhos. Por exemplo, em vez de

\begin{itemize}
\item abc
\end{itemize}

alguém pode fazer

\itemize
\item abc
\enditemize

Não suportado, não confiável, não funciona em todos os casos, use por sua conta e risco, etc. etc.


Bem vindo ao site!
DJMcMayhem

3
Você pode fazer isso \itemize{...}com muito mais economia.
Wheat Wizard

4

\usepackage{packagea,packageb,packagec} funciona, desde que você não esteja passando opções para os pacotes.


4

Executar linhas juntos. As quebras de linha raramente são necessárias no LaTeX / TeX, em comparação com muitos idiomas de formato longo.


3

Algumas macros que você pode esperar que precisem de colchetes em torno de seus argumentos não precisam, especialmente quando usadas dentro de outra macro com #1argumentos -style.

A maioria das macros precisa de chaves se houver mais de um token (caractere ou sequência de controle) no argumento.

\mymacro1          % equivalent to \mymacro{1}
\mymacro{12}       % equivalent to \mymacro{12}
\mymacro a         % equivalent to \mymacro{a}
\mymacro{ab}       % equivalent to \mymacro{ab}
\mymacro\foo       % equivalent to \mymacro{\foo}
\mymacro{\foo x}   % equivalent to \mymacro{\foo x}

3

Se você precisar usar a mesma macro com um nome longo várias vezes, poderá \letdefinir um alias mais curto.

\let\a\mymacrowithalongname
\a{foo}\a{bar}\a{qux}

Isso economiza dois bytes \def\a{\mymacrowithalongname}, se você não precisar de vários tokens na definição.

Em vez de um nome de macro, você pode ter um caractere ativo para salvar nas barras invertidas.

Observe que \letnão funciona apenas com nomes de macro, mas também com primitivas internas. Por exemplo, se você usar muitas \ifnum ... \ficonstruções em seu código, definir \let\i\ifnume, em vez disso, \i ... \fipode economizar alguns bytes. Isso funciona mesmo para \letsi: \let\l\let.


3

Use grupos {... locais }com sabedoria

Conforme indicado nesta resposta , caracteres ativos como ~podem ser usados ​​como um nome de macro. Infelizmente, ~é o único caractere ativo por padrão, e alterar o código de gato para outro caractere é caro: \catcode`!13leva 12 bytes. Se a nova definição de macro for necessária apenas em uma pequena região do seu código, os grupos locais poderão ser uma solução.

Quando o TeX entra em um novo grupo local aberto por {, ele cria um novo nível de agrupamento na pilha de salvamento interna. Isso significa que todas as macros e registros atuais são salvos. Quaisquer modificações nelas (a menos que sejam explicitamente marcadas como \global) agora só estão ativas até o fechamento do grupo }. Isso significa que ~pode ser redefinido dentro de um grupo, usado lá com a nova definição, e a definição antiga será restaurada automaticamente após o término do grupo.

Aqui está um exemplo:

\def~{abc}
~ -- {\def~{123}~} -- ~

Isso gera

abc - 123 - abc

Um efeito colateral interessante desse mecanismo de agrupamento é que os valores antigos ainda estão disponíveis dentro do grupo até serem alterados lá. Para ilustrar isso, imagine que queremos imprimir um número de caracteres com base no valor de um contador, preenchê-los com espaços até um comprimento fixo e continuar com o valor original do contador. Isso pode ser alcançado através do seguinte:

\newcount\x
\x=3
Print a char \the\x\ times,
{\x=-\x \advance\x 10 pad with \the\x\ spaces,}
and go on with x=\the\x.

quais saídas

Imprima um caractere 3 vezes, preencha com 7 espaços e continue com x = 3.

Esse comportamento de agrupamento é especialmente importante se você deseja usar as macros padrão do TeX para fazer um loop \loop ... \repeataninhado. Essas macros definem comandos internos e os utilizam para determinar como proceder. Aninhando-os sem colocar o loop interno entre chaves confundirá os comandos internos e levará a um comportamento inesperado.


1

O avanço de contadores, como

\advance\u by 1
\multiply\u by 3
\divide\u by 2

também funcionam como

\advance\u1        % \u = \u + 1
\advance\u-1       % \u = \u - 1
\multiply\u3       % \u = \u * 3
\multiply\u\u      % \u = \u * \u
\divide\u2         % \u = \u / 2

O mesmo princípio também funciona para inicialização:

\newcount\u\u1

define o contador \ u como 1.

Observe que eles precisam de um caractere de espaço em branco (quebra de linha ou espaço) após eles (ou um \relax, mas o espaço em branco faz o mesmo) para que o próximo comando não seja ignorado. Por exemplo,

\u1\the\u

NÃO imprime \ u, mas ignora o \thecomando.


1

\enddocumentem vez de \end{document}salvar dois caracteres


Não parece funcionar para \begin{document}=> \documentembora
sheß
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.