序列中的项目不能用 \left 和 \right 调用

序列中的项目不能用 \left 和 \right 调用

有人能向我解释一下这里发生了什么吗?

\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}

相关内容