为什么我的宏不起作用?

为什么我的宏不起作用?

我想制作一个宏来获取\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}

相关内容