
Essa questão já existe aqui:Como escrever macro/newcommand infix?
Mas não estou procurando uma maneira de dividir usando um comando infix, para o qual sei que já existe um comando. Estou procurando uma maneira de definir um novo comando infix binário paraqualquerpropósito. Algo como
\infixnewcommand{\T}{{bunchofstuff} {#1} {bunchofstuff} {#2} {bunchofstuff}}
Mais tarde, no código, {2 z \T 3 y}
seria substituído por {{bunchofstuff} {2 z} {bunchofstuff} {3 y} {bunchofstuff}}
.
Além disso, o wobsite não me deixou comentar a outra questão, dizendo que não tinha representante, então fui meio que forçado a iniciar uma nova pergunta, pelo menos até ter representante suficiente para comentar. Desculpe por isso :D
O exemplo específico que enfrento é definir tfrac, mas como infixo, então acho que seria demais. Mas só para ficar claro, não estou interessado em uma "solução" que envolva um pacote pré-existente onde o tover esteja definido. tover é apenas o exemplo atual em questão. Estou interessado em saber comoEUpoderia definir tal comando em meu próprio código, já que posso facilmente ver meu futuro exigindo esse recurso.
Responder1
O TeX funciona com tokens estritamente na ordem em que eles entram no scanner. Quando um tokenTa ser examinado é expansível, o TeX o expande procurando seus argumentos (sem expansão). Se o tokenTé uma macro, ela e seus argumentos são substituídos pelo texto de substituição; caso contrário, ele simplesmente desaparece após ter executado sua ação (este é o caso de \expandafter
, \noexpand
e de todas as condicionais, incluindo \else
e \fi
).
SeTnão é expansível, é enviado pela goela para ser executado. Em alguns casos específicos isso pode ressuscitar tokens na lista principal de tokens (é o caso de \lowercase
and \uppercase
).
Assim, não há como definir uma “macro infixa” que possa examinar o que vem antes dela, porque o que vem antes dela já foi expandido ou executado; em ambos os casos, o token desapareceu e não está mais disponível.
O caso de \over
primitivas relacionadas ( \overwithdelims
, \atop
e \atopwithdelims
) é muito diferente. Eles não são macros e são inexpansíveis, portanto, como dito antes, sãoexecutado. A execução de \over
e das demais consiste em deixar de lado a lista matemática atual que está sendo construída, iniciar uma nova e, ao terminar, colocá-la em outro local especial; as duas listas salvas são então usadas para formar um “átomo de fração” como numerador e denominador. Delimitadores são adicionados para os withdelims
casos e uma linha de fração é definida para os over
casos.
Como você pode ver, nenhuma expansão macro está envolvida aqui (é claro que está envolvida na formação das duas listas matemáticas, mas isso é irrelevante). O processo tira vantagem do fato de que o TeX sabe em qual lista matemática está trabalhando quando está no modo matemático; entretanto, isso não está disponível para o usuário (pode ser com o LuaTeX, mas é um assunto diferente).
Você poderia falsificar a notação infixa usando delimitadores especiais em vez de {
e }
, mas neste ponto uma macro de dois argumentos parece mais prática de maneira semelhante à que \frac
funciona.
Responder2
Importante: verhttps://tex.stackexchange.com/a/638830/250119(e o comentário de egreg abaixo) para explicação do que o código faz (basicamente faz umpesquisa e substituição de regexno código TeX), quais são suas limitações para decidir se deseja usá-lo.
Código fonte:
%! TEX program = lualatex
\documentclass{article}
\usepackage{rewriterest}
\begin{document}
\newcommand\Tprefix[2]{{bunchofstuff} #1 {bunchofstuff} #2 {bunchofstuff}}
\ExplSyntaxOn
\rewriterest:n {
\regex_replace_all:nnN {
\{
( [^\{\}]* ) % group 1: content does not contain any { or }
\\T\b
( [^\{\}]* ) % group 1: content does not contain any { or }
\}
} {
\\Tprefix % we're doing textual substitution here, so no \c{Tprefix}
\{ \1 \}
\{ \2 \}
} \RWRbody
}
\ExplSyntaxOff
test: {2 x \T 3 y}
\end{document}
Resultado: como você pode esperar.
Você precisa de um pacote, atualmente seu código fonte está emhttps://github.com/user202729/TeXlib