
Me gustaría determinar automáticamente el espacio en blanco dentro de los argumentos de un operador binario y proporcionar automáticamente el espacio adecuado alrededor del operador. Ejemplo:
\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}
¿Cómo hacer eso en látex3? Para empezar, me gustaría distinguir entre los dos primeros tipos de entradas, es decir, comprobar si los dos argumentos tienen como máximo un símbolo de longitud. Como capacidad máxima, me gustaría asegurarme de que el espacio en blanco antes/después \mapsto
sea ligeramente más grande que el espacio en blanco más grande en cualquiera de los dos argumentos.
Respuesta1
Esta puede ser una respuesta a la primera parte de su pregunta. Tenga en cuenta que cuenta tokens; no le importa cuáles sean esos tokens. Si necesita examinar cuáles son los tokens, puede hacerlo, pero obviamente será más complejo.
\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}
Esto distingue los dos primeros casos, es decir, 1 símbolo versus 2 símbolos y trata el caso de anidación planteado en los comentarios.