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 個符號,並處理註釋中提出的嵌套情況。

區分前兩種情況和嵌套

相關內容