列表的最后一个元素未显示。\tl_use 未执行?

列表的最后一个元素未显示。\tl_use 未执行?

我正在尝试设置一个宏来适当地格式化特定类型的数学量。量 T 确实需要两组参数才能显示在小矩阵中。

它几乎按预期工作。然而,每个集合的最后一个元素是不是显示。如果我删除“&”(在以 \seq_map_inline 开头的行中),一切都会正常,但列不会正确对齐。

以下是 MWE:

\documentclass{article}
\usepackage{amsmath,xparse}

\DeclareMathOperator{\TL}{T}

\ExplSyntaxOn
\NewDocumentCommand{\Tgennew}{m m}
{\TL\left[\begin{smallmatrix} \Tgennew_print:n {#1} \\ \Tgennew_print:n {#2} \end{smallmatrix}\right]
}

\seq_new:N \l_Tgennew_list_seq
\tl_new:N \l_Tgennew_last_tl
\cs_new_protected:Npn \Tgennew_print:n #1
{
  \seq_set_split:Nnn \l_Tgennew_list_seq { , } { #1 }
  \seq_pop_right:NN \l_Tgennew_list_seq \l_Tgennew_last_tl
  \seq_map_inline:Nn \l_Tgennew_list_seq { ##1 , &  }
  \tl_use:N \l_Tgennew_last_tl
}
\ExplSyntaxOff


\begin{document}
$\Tgennew{111,2,3333,4,5}{a,b,c,d,eee}$

or, with a couple of variables:

$\Tgennew{\alpha_1, \alpha_2, \dots, \alpha_\ell}{\beta_1, \beta_2, \dots, \beta_\ell}$
\end{document}

我怎样才能完整且正确地对齐显示这两组参数?

答案1

问题是,标记列表变量设置在小矩阵的一个单元格中,而您尝试在另一个单元格中使用它。

您也可以弹出第一个项目,但还有更好的方法:

\documentclass{article}
\usepackage{amsmath,xparse}

\DeclareMathOperator{\TL}{T}

\ExplSyntaxOn
\NewDocumentCommand{\Tgennew}{m m}
 {
  \TL\left[\begin{smallmatrix}
  \Tgennew_print:n {#1} \\
  \Tgennew_print:n {#2}
  \end{smallmatrix}\right]
 }

\seq_new:N \l_Tgennew_list_seq

\cs_new_protected:Npn \Tgennew_print:n #1
{
  \seq_set_split:Nnn \l_Tgennew_list_seq { , } { #1 }
  \seq_use:Nn \l_Tgennew_list_seq { , & }
}
\ExplSyntaxOff


\begin{document}
$\Tgennew{111,2,3333,4,5}{a,b,c,d,eee}$

or, with a couple of variables:

$\Tgennew{\alpha_1, \alpha_2, \dots, \alpha_\ell}{\beta_1, \beta_2, \dots, \beta_\ell}$
\end{document}

在此处输入图片描述

允许超过两行(或仅一行)的变体

\documentclass{article}
\usepackage{amsmath,xparse}

\DeclareMathOperator{\TL}{T}

\ExplSyntaxOn
\NewDocumentCommand{\Tgennew}{m}
 {
  \TL\left[\begin{smallmatrix}
  \Tgennew_make:n { #1 }
  \end{smallmatrix}\right]
 }

\seq_new:N \l_Tgennew_rows_seq
\seq_new:N \l_Tgennew_list_seq
\tl_new:N \l_Tgennew_body_tl

\cs_new_protected:Npn \Tgennew_make:n #1
 {
  \seq_set_split:Nnn \l_Tgennew_rows_seq { ; } { #1 }
  \seq_map_inline:Nn \l_Tgennew_rows_seq
   {
    \Tgennew_makerow:n { ##1 }
   }
  \tl_use:N \l_Tgennew_body_tl
 }

\cs_new_protected:Npn \Tgennew_makerow:n #1
 {
  \seq_set_split:Nnn \l_Tgennew_list_seq { , } { #1 }
  \tl_put_right:Nx \l_Tgennew_body_tl
   {
    \seq_use:Nn \l_Tgennew_list_seq { , & }
    \exp_not:N \\
   }
 }
\ExplSyntaxOff


\begin{document}
$\Tgennew{111,2,3333,4,5;a,b,c,d,eee}$

\bigskip

$\Tgennew{
  \alpha_1, \alpha_2, \dots, \alpha_\ell;
  \beta_1, \beta_2, \dots, \beta_\ell;
  \gamma_1, \gamma_2, \dots, \gamma_\ell
}$
\end{document}

在此处输入图片描述

答案2

另外,可以使用 TABstack。在这里,我指定一个空格作为列分隔符(而不是默认的&)。

\documentclass{article}
\usepackage{amsmath,tabstackengine}
\DeclareMathOperator{\TL}{T}

\setstackTAB{ } % COLUMN SEPARATOR
\TABstackMath % STACK MATH BY DEFAULT
\def\stackalignment{r} % RIGHT ALIGN COLUMNS
\TABstackMathstyle{\scriptstyle} % FORMAT OF CELL ENTRIES
\setstacktabbedgap{3pt} % INTER-COLUMN GAP
\def\stacktype{S} % STACK WITH FIXED GAP BETWEEN ROWS
\setstackgap{S}{1pt} % GAP BETWEEN ROWS
\begin{document}
$\TL\Bigl[\tabbedstackanchor{111, 2, 3333, 4, 5}{a, b, c, d, eee}\Bigr]$

$\TL\bigl[\tabbedstackanchor{\alpha_1, \alpha_2, \dots, \alpha_\ell}
  {\beta_1, \beta_2, \dots, \beta_\ell}\bigr]$
\end{document}

在此处输入图片描述

相关内容