
Этот вопрос уже существует здесь:Как написать инфиксный макрос/новую команду?
Но я не ищу способ разделить с помощью инфиксной команды, для которой, как я знаю, уже существует команда. Я ищу способ определить новую бинарную инфиксную команду длялюбойЦель. Что-то вроде
\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