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에서는 어떻게 하나요? 우선, 처음 두 종류의 입력을 구별하는 것, 즉 두 인수가 최대 한 기호 길이인지 테스트하는 것만으로도 행복할 것입니다. 최대 기능으로 앞/뒤의 공백이 \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 기호를 구별하고 주석에서 발생한 중첩 사례를 처리합니다.

처음 두 사례 구별 및 중첩

관련 정보