Técnicas macro usando e-TeX

Técnicas macro usando e-TeX

As extensões e-TeX foram destinadas a resolver algumas das deficiências do TeX original de Knuth, e como são exigidas pelo LaTeX2e há algum tempo, a maioria dos autores de pacotes pode confiar em sua presença. Agora, embora existam alguns recursos disponíveis para aprender expressões macro puras do TeX, incluindoesta discussãoneste site e também nobenefícios do e-TeXem geral, gostaria de ver alguns exemplos concretos de como as extensões do e-TeX podem facilitar a vida de um escritor de macros.

Em particular, alguns conselhos/truques práticos sobre o uso dos comandos relacionados à expansão e análise \protected, \unexpanded, \detokenizee \scantokensseriam muito apreciados. Eles me parecem úteis, mas nunca percebo quando poderia usá-los para simplificar as coisas (oManual do e-TeXtambém é muito conciso sobre eles).


O escopo da questão é bastante amplo, mas eu estaria mais interessado nas extensões listadas acima. A seguir estão algumas reflexões adicionais sobre outras extensões que eu também ficaria feliz em discutir.

Para algumas das extensões, a sua utilidade é imediatamente evidente para mim, incluindo

  • não ter que se preocupar em alocar novos registros devido ao aumento do número de 32.767 slots por tipo
  • os convenientes \numexprcomandos \dimexprde expressão etc. que facilitam as operações aritméticas
  • \unlesscomo negado \if, especialmente em conjunto com \loops onde, caso contrário, novas condicionais teriam que ser definidas se um loop fosse executado, desde que a condição fosse falsa
  • vários novos comandos e opções de rastreamento, ajudando no diagnóstico

Mas então, alguns recursos me fazem pensar se eles são realmente usados ​​por pacotes por aí ou se foram substituídos por abordagens mais "modernas", como

  • composição tipográfica de direção mista com \beginL, \beginRetc.
  • consultas de status como \currentgrouptype, \currentiftype, \lastnodetypeetc.
  • a possibilidade de salvar itens descartados do topo das páginas sendo incorporada\pagediscards
  • alinhar penalidades específicas com \interlinepenaltiese similares

Responder1

Pegando os itens mais importantes do e-TeX:

  • \protectednos permite criar macros que não se expandem dentro de um \edefou similar:

    \protected\def\foo{\let\baz\bong}
    \edef\test{Some text\foo}
    

    normalmente daria um erro (assumindo que não há definição para \baz/ \bong), mas aqui é 'seguro'. Se você observar o \protectmecanismo LaTeX2e, o que está acima é ummuito mais fácil de usar e mais confiável: \protectedmacrosnuncaexpanda xa definição do tipo interno, enquanto com a abordagem LaTeX2e é necessário \protected@edef, etc.

  • \unexpandednos permite proteger tokens arbitrários da expansão sem a necessidade de usar toks

    \edef\test{Some text\unexpanded{lots of \textbf{stuff}}}
    

    o que é muito útil com entradas arbitrárias do usuário. Também permite coisas como

    \edef\demo{\unexpanded{tokens #}}
    

    o que significa que é possível armazenar facilmente #dentro de uma macro (consulte o expl3 tltipo de dados).

  • \detokenizeé bom para tornar as coisas 'seguras', por exemplo, se puderem ter caracteres ativos

    \csname Tokens\detokenize{&_~^\foo}\endcsname
    

    o que é particularmente verdadeiro, por exemplo, se estiver usando caracteres ativos para entrada UTF-8 em LaTeX

  • \numexpr, etc., funcionam muito bem para fazer cálculos expansíveis facilmente

Responder2

examinando os arquivos de origem no TeX Live, posso adicionar alguns insights sobre o uso dos recursos do e-TeX, pelo menos na minha percepção, menos difundidos.

Para alguns dosinquérito de statusprimitivas, os pacotes de Heiko Oberdiek fornecem algumas ilustrações para sua aplicação. O atbegshipacote mostra um truque interessante de como uma primitiva que toma uma caixa como argumento pode ser redefinida ( \shipoutneste caso), levando em consideração que se o argumento for interceptado com \setboxe \afterassignment, o token a ser inserido após a atribuição pode ou pode não cai dentro da caixa dependendo se a caixa é dada como box0ou como \hbox{...}. Parece mais ou menos assim:

\def\shipout{%
  \edef\saved@grouplevel{\number\currentgrouplevel}
  \afterassignment\@test 
  \setbox\mybox=}

\def\@test{%
  \ifnum\saved@grouplevel<\currentgrouplevel
    \expandafter\aftergroup
  \fi
    \output
}

Ele usa e-TeX \currentgrouplevelpara determinar se \@testpousou dentro da caixa (que abriu um grupo), caso em que a \outputoperação subsequente é adiada para depois da caixa.

Outro fato útil é que \lastnodetypeé menor que 11 para todas as coisas não descartáveis, e -1 se a lista atual ainda estiver vazia (veja por exemplo setouterhboxas aplicações destas).

Como egreg aponta nos comentários, \currentgrouptypepode ser consultado no modo matemático para decidir se deve usar uma \middlevariante delimitadora ou não, como \currentgrouptypeé 16 em um grupo aberto por \left(por exemploaqui).

e-TeXcomposição tipográfica bidirecionalrecursos na forma de TeX - XeT é o que é usado pelo XeTeX, para o qual o bidipacote fornece uma interface para esses recursos. Também para alguns pacotes LaTeX padrão como babel-hebreweste parece ser o caminho a seguir. No entanto, LuaTeX abandonou as primitivas \beginL, \beginRetc. e, em vez disso, integra a extensão Omega TeX.

Por outro lado, para vários recursos não encontrei nenhuma aplicação real. Os únicos lugares onde eles aparecem são onde provavelmente todos os primitivos aparecerão, como o kernel LaTeX3, ConTeXt MkIV e o unravelpacote, e em alguns outros lugares onde os autores tentaram aumentar a compatibilidade com outros pacotes que os utilizam. Esses recursos incluem as \currentif{type,branch,level}consultas, a \pagediscardsfuncionalidade e a linha específica \{inter,club,widow}linepenalties.

informação relacionada