tabularray:从存储在宏中的表中有选择地打印一些行

tabularray:从存储在宏中的表中有选择地打印一些行

我如何才能打印出存储在表中的某些行\MyTable

例如我需要以两种方式打印两组rows = 1 to 3和:rows = 6 to 8

  1. 打印所有六行作为一个整体,没有视觉分隔
  2. 在横跨两列的两组之间打印一个分隔行,并以居中标题显示(例如second part
begin{filecontents*}{mytable.tex}
1  &  11  \\
2  &  12  \\
3  &  13  \\
4  &  14  \\
5  &  15  \\
6  &  16  \\
7  &  17  \\
8  &  18  \\
\end{filecontents*}

\documentclass{article}

\usepackage{xcolor, catchfile}
\usepackage{tabularray}
\UseTblrLibrary{booktabs,siunitx}

\begin{document}

\CatchFileDef{\MyTable}{mytable.tex}{}

\begin{tblr}[ long, expand = \MyTable ]{ 
        row{odd} = {gray!10},
        row{even} = {white},
        row{1} = {white},
        colspec = {X S} 
    }
    \toprule[1.5pt]
    One & {{{Two}}}  \\
    \midrule
    \MyTable
    \bottomrule[1.5pt]
\end{tblr}

\end{document}

答案1

以下是部分解决方案:虽然不够好,但至少有效。

\begin{filecontents*}{mytable.tex}
1  &  11  \\
2  &  12  \\
3  &  13  \\
4  &  14  \\
5  &  15  \\
6  &  16  \\
7  &  17  \\
8  &  18  \\
\end{filecontents*}

\documentclass{article}

\usepackage{xcolor, catchfile}
\usepackage{tabularray}
\UseTblrLibrary{booktabs,siunitx}

\begin{document}

\CatchFileDef{\MyTable}{mytable.tex}{}

\newcommand\HideIt[1]{}

\begin{tblr}[ long, expand = \MyTable ]{ 
        row{odd} = {gray!10},
        row{even} = {white},
        row{1} = {white},
        colspec = {X S},
        stretch = 0,
        rowsep = 4pt,
        row{5-6} = {cmd=\HideIt,rowsep=0pt},
    }
    \toprule[1.5pt]
    One & {{{Two}}}  \\
    \midrule
    \MyTable
    \bottomrule[1.5pt]
\end{tblr}

\end{document}

在此处输入图片描述

答案2

无论如何,这可能不是你希望的答案:

为什么你不使用datatool带有许多为此目的而构建的优秀功能的软件包呢?

如果文件的第一列始终包含行号,则可以执行以下操作:

\begin{filecontents}{mytable.tex}
1  &  11  \\
2  &  12  \\
3  &  13  \\
4  &  14  \\
5  &  15  \\
6  &  16  \\
7  &  17  \\
8  &  18  \\
\end{filecontents}

\documentclass{article}

\usepackage{datatool}
\usepackage{tabularx, colortbl, xcolor, booktabs}

\newcolumntype{S}{>{\raggedleft\arraybackslash}X}

\DTLsetseparator{&}
\DTLloaddb[noheader]{mytable}{mytable.tex}

\begin{document}

\noindent%
\begin{tabularx}{\textwidth}{ X S }
    \toprule
    \textbf{One} & \textbf{Two} 
    \DTLforeach*[\DTLisSubString{1,2,3,6,7,8}{\coli}]{mytable}{%
        \coli=Column1, \colii=Column2}{%
        \DTLiffirstrow{\\ \midrule}{\\}%
        \DTLifoddrow{\rowcolor{gray!10}}{\rowcolor{white}}%
        \coli & \DTLsubstituteall{\colii}{\\}{}\colii %
    } \\ %
    \bottomrule
\end{tabularx}

\end{document}

在此处输入图片描述

datatool包更容易处理 CSV 数据,但经过一些细微的调整,您也可以将其用于 TeX 格式的数据:\DTLsetseparator{&}您可以将列分隔符更改为类似 TeX 的&,并且\DTLsubstituteall{\colii}{\\}{}\colii需要从每行末尾删除双斜杠以避免表中出现额外的空行。

由于该datatool包的功能,甚至不需要使用该tabularray包。我没有测试该datatool包和该tabularray包是否兼容。由于我避免使用该tabularray包,我使用了其他包来获得希望非常相似的表格样式。


更新

如果表没有提供带有索引或行号的列,最可行的方法是先附加另一列,该列包含行号(即索引),稍后可用于过滤。

遗憾的是,该datatool包不提供索引计数器,该计数器可在条件中\DTLforeach直接通过宏进行过滤。据我了解,该包仅提供了一个内部计数器(\DTLcurrentindex),只能在主体中使用,\DTLforeach而不能在条件中使用(我们需要它),然后,还有其他计数器(DTLrowiDTLrowiiDTLrowiii)仅对过滤后的行进行计数。

在下面的例子中,我将表的最后一项更改为与行索引不同的值,以说明不通过这些值进行过滤,

\begin{filecontents}{mytable.tex}
1  &  11  \\
2  &  12  \\
3  &  13  \\
4  &  14  \\
5  &  15  \\
6  &  16  \\
7  &  17  \\
9  &  19  \\
\end{filecontents}

\documentclass{article}

\usepackage{datatool}
\usepackage{tabularx, colortbl, xcolor, booktabs}

\newcolumntype{S}{>{\raggedleft\arraybackslash}X}

\DTLsetseparator{&}
\DTLloaddb[noheader]{mytable}{mytable.tex}

% appending index column
\DTLforeach{mytable}{}{
    \DTLappendtorow{ID}{\DTLcurrentindex}
}

\begin{document}

\noindent%
\begin{tabularx}{\textwidth}{ X S }
    \toprule
    \textbf{One} & \textbf{Two} 
    \DTLforeach*[\DTLisSubString{1,2,3,6,7,8}{\id}]{mytable}{%
        \id=ID, \coli=Column1, \colii=Column2}{%
        \DTLiffirstrow{\\ \midrule}{\\}%
        \DTLifoddrow{\rowcolor{gray!10}}{\rowcolor{white}}%
        \coli & \DTLsubstituteall{\colii}{\\}{}\colii %
    } \\ %
    \bottomrule
\end{tabularx}

\end{document}

与之前一样,过滤是通过\DTLisSubString{1,2,3,6,7,8}{\id}数字表示应打印的行的索引来完成的。这大概就是您最初想要的,至少是第一部分。

请注意,带星号的版本\DTLforeach是只读的,这就是我只在第二次迭代中使用它的原因。由于我们需要编辑数据库以附加索引列,因此使用了非星号版本的宏。

相关内容