ForArray 在 newcommand 中不起作用

ForArray 在 newcommand 中不起作用

我尝试使用该forarray包,但在自定义包中使用时输出不同\newcommand

\documentclass{scrartcl}

\usepackage{forarray}

\begin{document}

\newcommand{\printforarray}{%
    \ForArray{;,}{*}{|}%
        {[*]\par|(*)}%
        {A,B;C,D}%
}

\printforarray

\end{document}

输出

[*]
[*]

\ForArray如果我直接使用

\documentclass{scrartcl}

\usepackage{forarray}

\begin{document}

\ForArray{;,}{*}{|}%
    {[*]\par|(*)}%
    {A,B;C,D}%

\end{document}

它按预期输出

[(A)(B)]
[(C)(D)]

为什么渲染结果不同?我需要在自定义中使用\newcommand

答案1

包中的一些重要宏forarray需要更改其参数中某些字符的类别代码。一旦宏及其参数已被吸收为另一个命令的参数,则无法执行此操作,在本例中为\newcommand

后果就是你不能从事forarray这份工作,对不起。

除非您在定义时使“子级标记”和“功能列表分隔符”处于活动状态,然后将类别代码恢复为正常。

\documentclass{scrartcl}

\usepackage{forarray}

\catcode`*=\active\catcode`|=\active
\newcommand{\printforarray}[1]{%
    \ForArray{;,}{*}{|}%
        {[*]\par|(*)}%
        {#1}%
}
\catcode`*=12 \catcode`|=12

\begin{document}

\printforarray{A,B;C,D}

\end{document}

这将打印预期的内容

在此处输入图片描述

我并不推荐它。


这是不同的方法expl3。该宏\forarray接受两个参数;第一个是一组键值选项,第二个是需要处理的数组。

可用的键是

  • row-del,用于行之间的输入分隔符(默认;
  • col-del,用于列之间的输入分隔符(默认,
  • row-sep,用于在输出阶段插入行之间的代码(默认为空)
  • col-sep,用于在输出阶段插入列之间的代码(默认为空),
  • row-wrap,用于包装每一行的代码;行的内容用 表示#1(默认为#1,即打印已处理的行)
  • entry-wrap,用于包装每个条目的代码;条目用 表示#1(默认为#1,即打印条目)
  • wrap用于包装整个循环

请参阅下面代码中的示例;最后一个例子定义了一个\makematrix可以接收可选参数的宏,因此\makematrix{1,2;3,4}会打印一个bmatrix,但\makematrix[p]{1,2;3,4}会生成一个pmatrix

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

\ExplSyntaxOn
\NewDocumentCommand{\forarray}{+mm}
 {
  \mountain_array:nn { #1 } { #2 }
 }


\keys_define:nn { mountain/array }
 {
  row-del    .tl_set:N = \l__mountain_array_row_del_tl, % for input
  col-del    .tl_set:N = \l__mountain_array_col_del_tl, % for input
  row-sep    .tl_set:N = \l__mountain_array_row_sep_tl, % for output
  col-sep    .tl_set:N = \l__mountain_array_col_sep_tl, % for output
  row-wrap   .code:n   = \cs_set_protected:Nn \__mountain_array_row_wrap:n { #1 },
  entry-wrap .code:n   = \cs_set_protected:Nn \__mountain_array_entry_wrap:n { #1 },
  wrap       .code:n   = \cs_set_protected:Nn \__mountain_array_wrap:n { #1 },
 }

\seq_new:N \l__mountain_array_rows_seq
\seq_new:N \l__mountain_array_rows_out_seq
\seq_new:N \l__mountain_array_arow_seq
\seq_new:N \l__mountain_array_arow_out_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { NV }
\cs_generate_variant:Nn \seq_use:Nn { NV }

\cs_new_protected:Nn \mountain_array:nn
 {
  \keys_set:nn { mountain/array }
   {
    % start with a clean slate
    row-del={;},col-del={,},row-sep={},col-sep={},row-wrap={##1},entry-wrap={##1},wrap={##1},
    % set the chosen options
    #1
   }
  \__mountain_array_wrap:n { \__mountain_array_loop:nn { #1 } { #2 } }
 }

\cs_new_protected:Nn \__mountain_array_loop:nn
 {
  % begin the outer loop
  \seq_set_split:NVn \l__mountain_array_rows_seq \l__mountain_array_row_del_tl { #2 }
  \seq_set_map:NNn \l__mountain_array_rows_out_seq \l__mountain_array_rows_seq
   {
    \__mountain_array_row_wrap:n { \__mountain_array_row_process:n { \exp_not:n { ##1 } } }
   }
  \seq_use:NV \l__mountain_array_rows_out_seq \l__mountain_array_row_sep_tl
 }

\cs_new_protected:Nn \__mountain_array_row_process:n
 {
  \seq_set_split:NVn \l__mountain_array_onerow_seq \l__mountain_array_col_del_tl { #1 }
  \seq_set_map:NNn \l__mountain_array_onerow_out_seq \l__mountain_array_onerow_seq
   {
    \__mountain_array_entry_wrap:n { \exp_not:n { ##1 } }
   }
  \seq_use:NV \l__mountain_array_onerow_out_seq \l__mountain_array_col_sep_tl
 }

\ExplSyntaxOff

\NewDocumentCommand{\makematrix}{O{b}m}{%
  \forarray{row-sep=\\,col-sep={&},wrap=\begin{#1matrix}##1\end{#1matrix}}{#2}
}

\begin{document}

\forarray{
  row-wrap={[#1]},
  entry-wrap=(#1),
  row-sep=\par,
}
{A,B;C,D}

\forarray{
  col-sep=+,
  row-sep=\par,
}
{A,B;C,D}

\forarray{
  col-sep=+,
  row-sep=\par,
  row-wrap={$#1$},
}
{a,b,c;d,e,f}

$\makematrix{1,2,3;4,5,6}$

\end{document}

在此处输入图片描述

相关内容