有人能向我解释一下这里发生了什么吗?
\documentclass{article}
\ExplSyntaxOn
\begin{document}
\[
\seq_new:N \l_args_seq
\seq_set_from_clist:Nn \l_args_seq { (,) }
\seq_use:Nn \l_args_seq {} \\ % both items show up
\left{\seq_item:Nn \l_args_seq { 1 }}
hi
\right{\seq_item:Nn \l_args_seq { 2 }} % "Missing delimeter" message
\]
\end{document}
答案1
\left
和\right
是 TeX 原语,它们只接受一个标记作为参数,因此当你写入 时\left{<things>}
,TeX 会发现\left {
并抱怨{
不是一个有效的分隔符(从现在开始一切都变得错误)。与在你的问题关于\str_if_eq:eeTF
,您需要先强制扩展\seq_item:Nn
,然后将生成的标记传递给\left
和\right
。
以下是两个命令\Left
和,\Right
它们将任何输入作为参数,对其进行扩展,然后分别将生成的标记传递给\left
和\right
。如果扩展的输入产生多个标记,则会引发错误并且仅使用第一个标记。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand \Left { m }
{ \mjc_math_delim:Ne \left {#1} }
\NewDocumentCommand \Right { m }
{ \mjc_math_delim:Ne \right {#1} }
\cs_new_protected:Npn \mjc_math_delim:Nn #1 #2
{
\tl_if_single_token:nTF {#2}
{ #1 #2 }
{
\msg_error:nnn { mjc } { multi-token-delim } {#2}
\exp_last_unbraced:Ne #1 { \tl_head:n {#2} }
}
}
\cs_generate_variant:Nn \mjc_math_delim:Nn { Ne }
\msg_new:nnn { mjc } { multi-token-delim }
{
Argument~must~expand~to~a~single~token.\\
You~passed~'#1'~as~argument.
}
\ExplSyntaxOff
\begin{document}
\ExplSyntaxOn
\[
\seq_new:N \l_args_seq
\seq_set_from_clist:Nn \l_args_seq { (,) }
\seq_use:Nn \l_args_seq {} \\ % both items show up
\Left{\seq_item:Nn \l_args_seq { 1 }}
\frac{1}{2}
\Right{\seq_item:Nn \l_args_seq { 2 }} % "Missing delimeter" message
\]
\end{document}