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 个符号,并处理了注释中提出的嵌套情况。

区分前两种情况和嵌套

相关内容