![给定列,如何提取一行?](https://linux22.com/image/312769/%E7%BB%99%E5%AE%9A%E5%88%97%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8F%90%E5%8F%96%E4%B8%80%E8%A1%8C%EF%BC%9F.png)
给定一个数组的某些列作为逗号分隔的列表,我该如何构造该数组?
我想如果我可以从以逗号分隔的此类列列表中提取特定行,那么我可能就可以完成其余工作,但我甚至无法编译以下代码:
\documentclass{article}
\usepackage{tikz}
\def\colzero{0,0,1}
\def\colone{0,1,0}
\def\coltwo{0,1,1}
\newcommand{\getrow}[2]{%
\xdef\rowans{}
\foreach \x in #2 {
\xdef\rowans{\rowans \pgfmathparse{{\x}[#1]}\pgfmathresult}
}
\rowans
}
\begin{document}
$\getrow{0}{{\colzero},{\colone},{\coltwo}}$
\end{document}
我以前曾设法弄清楚如何做到这一点(使用我在 StackExchange 上找到的各种东西),但现在我找不到任何与我所寻找的内容相关的答案。
理想情况下,我希望使用可变数量的列来实现这一点,但不一定是使用可变数量的行来实现。
答案1
我建议使用expl3
和xparse
;使用命令定义列\setcolumn
并使用\getrow
收集所选行中的项目并使用最后一个参数中给出的分隔符生成它们。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\setcolumn}{mm}
{
\clist_if_exist:cF { g_ylab_column_#1_clist }
{
\clist_new:c { g_ylab_column_#1_clist }
}
\clist_gset:cn { g_ylab_column_#1_clist } { #2 }
}
\NewDocumentCommand{\getrow}{mmm}
{
\seq_clear:N \l_ylab_row_seq
\clist_map_inline:nn { #2 }
{
\seq_put_right:Nx \l_ylab_row_seq
{
\clist_item:cn { g_ylab_column_##1_clist } { #1 }
}
}
\seq_use:Nn \l_ylab_row_seq { #3 }
}
\ExplSyntaxOff
\setcolumn{colone}{0,0,1}
\setcolumn{coltwo}{0,1,0}
\setcolumn{colthree}{0,1,1}
\begin{document}
\getrow{1}{colone,coltwo,colthree}{}
\getrow{2}{colone,coltwo,colthree}{, }
\begin{tabular}[t]{ccc}
\getrow{1}{colone,coltwo,colthree}{&} \\
\getrow{2}{colone,coltwo,colthree}{&} \\
\getrow{3}{colone,coltwo,colthree}{&}
\end{tabular}
\end{document}
命令\setcolumn
定义一个clist
变量(如果不存在)并(全局)设置它。你可以这样调用它姓名在\getrow
命令中设置一个seq
变量,其中包含指定行中的项目。然后,它会生成带有项目之间选定分隔符的序列。
请注意,expl3
计数项目通常从 1 开始(这比从 0 开始更合乎逻辑)。