определение новой инфиксной команды

определение новой инфиксной команды

Этот вопрос уже существует здесь:Как написать инфиксный макрос/новую команду?

Но я не ищу способ разделить с помощью инфиксной команды, для которой, как я знаю, уже существует команда. Я ищу способ определить новую бинарную инфиксную команду длялюбойЦель. Что-то вроде

\infixnewcommand{\T}{{bunchofstuff} {#1} {bunchofstuff} {#2} {bunchofstuff}}

Затем позже в коде {2 z \T 3 y}он будет заменен на {{bunchofstuff} {2 z} {bunchofstuff} {3 y} {bunchofstuff}}.

Кроме того, сайт не позволил мне прокомментировать другой вопрос, заявив, что у меня нет репутации, поэтому мне пришлось начать новый вопрос, по крайней мере, пока у меня не будет достаточно репутации, чтобы прокомментировать. Извините за это :D

Конкретный пример, с которым я столкнулся, определяет tfrac, но как инфикс, поэтому я предполагаю, что это будет tover. Но просто для ясности: меня не интересует «решение», включающее уже существующий пакет, где определен tover. tover — это просто текущий пример под рукой. Мне интересно узнать, какямог бы определить такую ​​команду в своем собственном коде, поскольку я легко могу представить, что в будущем мне понадобится эта возможность.

решение1

TeX работает с токенами строго в том порядке, в котором они попадают в его сканер. Когда токенТдля проверки является расширяемым, TeX расширяет его, ища его аргументы (без расширения). Если токенТявляется макросом, он и его аргументы заменяются заменяющим текстом; в противном случае он просто исчезает после выполнения своего действия (это касается \expandafter, \noexpandи всех условных операторов, включая \elseи \fi).

ЕслиТнерасширяем, он отправляется в глотку для исполнения. В некоторых особых случаях это может воскресить токены в главном списке токенов (это случай \lowercaseи \uppercase).

Таким образом, нет способа определить «инфиксный макрос», который может проверить то, что ему предшествует, поскольку то, что ему предшествует, уже было либо расширено, либо выполнено; в любом случае токен исчез и больше недоступен.

Случай \overи связанных примитивов ( \overwithdelims, \atopи \atopwithdelims) совершенно иной. Они не являются макросами и нерасширяемы, поэтому, как уже было сказано, ониказнен. Выполнение \overи других состоит в том, чтобы отложить в сторону текущий математический список, который строится, начать новый и, когда закончите, поместить его в другое специальное место; два сохраненных списка затем используются для формирования «атома дроби» в качестве числителя и знаменателя. Для случаев добавляются разделители, withdelimsа для случаев устанавливается линия дроби over.

Как видите, здесь не задействовано макрорасширение (конечно, оно задействовано при формировании двух математических списков, но это не имеет значения). Процесс использует тот факт, что TeX знает, с каким математическим списком он работает в математическом режиме; однако, это недоступно пользователю (это может быть в LuaTeX, но это другой вопрос).

Вы можете подделать инфиксную нотацию, используя специальные разделители вместо {и }, но на данный момент макрос с двумя аргументами кажется более практичным, так как работает аналогично \frac.

решение2

Важный: видетьhttps://tex.stackexchange.com/a/638830/250119(и комментарий egreg ниже) для объяснения того, что делает код (в основном делаетпоиск и замена регулярных выраженийв коде TeX), каковы его ограничения, чтобы решить, хотите ли вы его использовать.


Исходный код:

%! 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}

Результат: как и ожидалось.

Вам нужен пакет, в настоящее время его исходный код находится по адресуhttps://github.com/user202729/TeXlib

Связанный контент