definindo um novo comando infix

definindo um novo comando infix

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, \noexpande de todas as condicionais, incluindo \elsee \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 \lowercaseand \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 \overprimitivas relacionadas ( \overwithdelims, \atope \atopwithdelims) é muito diferente. Eles não são macros e são inexpansíveis, portanto, como dito antes, sãoexecutado. A execução de \overe 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 withdelimscasos e uma linha de fração é definida para os overcasos.

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 \fracfunciona.

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

informação relacionada