LaTeX3 の適応間隔

LaTeX3 の適応間隔

二項演算子の引数内の空白を自動的に判別し、演算子の周囲に適切なスペースを自動的に提供したいと思います。例:

\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でどう行うのでしょうか? まず、最初の2種類の入力を区別できれば、つまり、2つの引数が最大1つのシンボルの長さであるかどうかをテストできれば十分です。 最大限の機能として、前後の空白が、\mapsto2つの引数のいずれかの最大の空白よりもわずかに大きいことを保証したいと思います。

答え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}

これは最初の 2 つのケース、つまり 1 つのシンボルと 2 つのシンボルを区別し、コメントで発生したネストされたケースに対処します。

最初の2つのケースとネストを区別する

関連情報