我正在尝试设置一个宏来适当地格式化特定类型的数学量。量 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}