![为什么我的宏不起作用?](https://linux22.com/image/453862/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E5%AE%8F%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我想制作一个宏来获取\testfunc{1,2,3}{4,5,6}
并生成
\begin{bmatrix}
1 & 2 & 3\\
4 & 5 & 6
\end{bmatrix}
代码如下:
\def\testfunc#1{
\ExplSyntaxOn
\NewDocumentCommand \countItems { m } {
\clist_count:N #1
}
\ExplSyntaxOff
\begin{bmatrix}
\foreach #1 \do {
\def\length{\countItems{##1}}
\foreach \col [count=\i] in {##1} {
\ifx\i\length
\col
\else
\col &
\fi
\ifx&##1& \else \\ \fi
}
}
\end{bmatrix}
}
但是,如果我在出现更多错误Paragraph ended before \pgffor@@vars was complete.
之前添加新行,我就会不断收到错误。\end{document}
答案1
它无法工作,因为每个\foreach
循环都是按组来处理的。
并且您不能将#1
其用作中的变量\foreach
。
它更简单:\clist_use:nn
您可以在项目之间插入一个标记列表(此处&
)。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\testfunc}{mm}
{
\begin{bmatrix}
\clist_use:nn { #1 } { & } \\
\clist_use:nn { #2 } { & }
\end{bmatrix}
}
\ExplSyntaxOff
\begin{document}
\[
\testfunc{1,2,3}{4,5,6}
\]
\end{document}
更普遍
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\testfunc}{m}
{
\begin{bmatrix}
\tl_map_function:nN { #1 } \drownedsuccess_row:n
\end{bmatrix}
}
\cs_new:Nn \drownedsuccess_row:n
{
\clist_use:nn { #1 } { & } \\
}
\ExplSyntaxOff
\begin{document}
\[
\testfunc{{1,2,3}{4,5,6}{7,8,9}}
\]
\end{document}
使用不同的语法,您可以根据需要使用任意数量的行。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\testfunc}{m}
{
\begin{bmatrix}
\seq_set_split:Nnn \l_tmpa_seq { ; } { #1 }
\seq_map_function:NN \l_tmpa_seq \drownedsuccess_row:n
\end{bmatrix}
}
\cs_new:Nn \drownedsuccess_row:n
{
\clist_use:nn { #1 } { & } \\
}
\ExplSyntaxOff
\begin{document}
\[
\testfunc{1,2,3;4,5,6;7,8,9}
\]
\end{document}