adaptiver Abstand in Latex3

adaptiver Abstand in Latex3

Ich möchte die Leerzeichen innerhalb der Argumente eines binären Operators automatisch ermitteln und automatisch einen entsprechenden Abstand um den Operator herum einhalten. Beispiel:

\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}

Wie macht man das in Latex3? Zunächst würde ich mich freuen, wenn ich nur zwischen den ersten beiden Arten von Eingaben unterscheiden könnte, d. h. testen könnte, ob die beiden Argumente höchstens ein Symbol lang sind. Als maximale Fähigkeit würde ich gerne sicherstellen, dass das Leerzeichen davor/danach \mapstoetwas größer ist als das größte Leerzeichen in einem der beiden Argumente.

Antwort1

Dies könnte eine Antwort auf den ersten Teil Ihrer Frage sein. Beachten Sie, dass Token gezählt werden – es ist egal, was diese Token sind. Wenn Sie untersuchen müssen, was die Token sind, können Sie das tun, aber es wird offensichtlich komplexer.

\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}

Dies unterscheidet die ersten beiden Fälle, d. h. 1 Symbol gegenüber 2 Symbolen, und befasst sich mit dem in Kommentaren angesprochenen Verschachtelungsfall.

Unterscheidung der ersten beiden Fälle und Verschachtelung

verwandte Informationen