
我想自動確定二元運算子參數內的空格,並自動在運算符周圍提供適當的間距。例子:
\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 個符號,並處理註釋中提出的嵌套情況。