
Gostaria de determinar automaticamente o espaço em branco dentro dos argumentos de um operador binário e fornecer automaticamente o espaçamento apropriado ao redor do operador. Exemplo:
\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}
Como fazer isso no latex3? Para começar, eu ficaria feliz em distinguir entre os dois primeiros tipos de entradas, ou seja, em testar se os dois argumentos têm no máximo um símbolo. Como capacidade máxima, gostaria de garantir que o espaço em branco antes/depois \mapsto
seja ligeiramente maior que o maior espaço em branco em qualquer um dos dois argumentos.
Responder1
Esta pode ser uma resposta à primeira parte da sua pergunta. Observe que ele conta tokens - não importa quais são esses tokens. Se precisar examinar o que são os tokens, você pode fazer isso, mas obviamente será mais complexo.
\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}
Isto distingue os dois primeiros casos, ou seja, 1 símbolo versus 2 símbolos e trata do caso de aninhamento levantado nos comentários.