
Я хотел бы автоматически определять пробелы внутри аргументов бинарного оператора и автоматически обеспечивать соответствующие интервалы вокруг оператора. Пример:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\binding}{mm}{#1\!\mapsto\!#2}
\ExplSyntaxOff
\begin{document}
\noindent
\verb!\(\binding{a}{b}\)! should produce \(a{\mapsto}b\).\\
\verb!\(\binding{aa}{bb}\)! should produce \(aa\!\mapsto\!bb\).\\
\verb!\(\binding{f(a+b)}{g(c+d)}\)! should produce \(f(a+b)\mapsto g(c+d)\).\\
\verb!\(\binding{f\,a}{g\,b}\)! should produce \(f\,a\,\mapsto\,g\,b\).
\verb!\(\binding{i}{(\binding{a}{b})}\)! should produce \(i\mapsto(a{\mapsto}b)\).
\end{document}
Как это сделать в latex3? Для начала я был бы рад просто различать первые два типа входных данных, то есть, проверить, являются ли два аргумента длиной не более одного символа. В качестве максимальной возможности я хотел бы убедиться, что пробел до/после \mapsto
немного больше, чем самый большой пробел в любом из двух аргументов.
решение1
Это может быть ответом на первую часть вашего вопроса. Обратите внимание, что он считает токены — ему все равно, что это за токены. Если вам нужно проверить, что это за токены, вы можете это сделать, но, очевидно, это будет сложнее.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_leon_first_tl
\tl_new:N \l_leon_second_tl
\cs_new_protected_nopar:Nn \leon_binding:nn
{
\group_begin:
\tl_set:Nn \l_leon_first_tl { #1 }
\tl_set:Nn \l_leon_second_tl { #2 }
\int_compare:nTF
{
( \int_max:nn
{ \tl_count:V \l_leon_first_tl }
{ \tl_count:V \l_leon_second_tl }
)
<= 1
}
{
\l_leon_first_tl {\mapsto} \l_leon_second_tl
}{
\l_leon_first_tl \! \mapsto \! \l_leon_second_tl
}
\group_end:
}
\NewDocumentCommand{\binding}{mm}
{
\leon_binding:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\(\binding{a}{b}\) should produce \(a{\mapsto}b\).
\(\binding{aa}{bb}\) should produce \(aa\!\mapsto\!bb\).
$\binding{i}{(\binding{a}{b})}$
\(\binding{f(a+b)}{g(c+d)}\) should produce \(f(a+b)\mapsto g(c+d)\).
\(\binding{a\,a}{b\,b}\) should produce \(a\,a\,\mapsto\,b\,b\).
\end{document}
Это позволяет различить первые два случая, т.е. 1 символ против 2 символов, и решает проблему вложенности, упомянутую в комментариях.