
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
, \detokenize
e \scantokens
seriam 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
\numexpr
comandos\dimexpr
de expressão etc. que facilitam as operações aritméticas \unless
como negado\if
, especialmente em conjunto com\loop
s 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
,\beginR
etc. - consultas de status como
\currentgrouptype
,\currentiftype
,\lastnodetype
etc. - a possibilidade de salvar itens descartados do topo das páginas sendo incorporada
\pagediscards
- alinhar penalidades específicas com
\interlinepenalties
e similares
Responder1
Pegando os itens mais importantes do e-TeX:
\protected
nos permite criar macros que não se expandem dentro de um\edef
ou 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\protect
mecanismo LaTeX2e, o que está acima é ummuito mais fácil de usar e mais confiável:\protected
macrosnuncaexpandax
a definição do tipo interno, enquanto com a abordagem LaTeX2e é necessário\protected@edef
, etc.\unexpanded
nos 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 oexpl3
tl
tipo 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 atbegshi
pacote mostra um truque interessante de como uma primitiva que toma uma caixa como argumento pode ser redefinida ( \shipout
neste caso), levando em consideração que se o argumento for interceptado com \setbox
e \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 box0
ou 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 \currentgrouplevel
para determinar se \@test
pousou dentro da caixa (que abriu um grupo), caso em que a \output
operaçã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 setouterhbox
as aplicações destas).
Como egreg aponta nos comentários, \currentgrouptype
pode ser consultado no modo matemático para decidir se deve usar uma \middle
variante 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 bidi
pacote fornece uma interface para esses recursos. Também para alguns pacotes LaTeX padrão como babel-hebrew
este parece ser o caminho a seguir. No entanto, LuaTeX abandonou as primitivas \beginL
, \beginR
etc. 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 unravel
pacote, 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 \pagediscards
funcionalidade e a linha específica \{inter,club,widow}linepenalties
.