
이진 연산자 인수 내부의 공백을 자동으로 결정하고 연산자 주위에 적절한 간격을 자동으로 제공하고 싶습니다. 예:
\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 기호를 구별하고 주석에서 발생한 중첩 사례를 처리합니다.