我尝试使用该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}