![tabularray:从存储在宏中的表中有选择地打印一些行](https://linux22.com/image/441924/tabularray%EF%BC%9A%E4%BB%8E%E5%AD%98%E5%82%A8%E5%9C%A8%E5%AE%8F%E4%B8%AD%E7%9A%84%E8%A1%A8%E4%B8%AD%E6%9C%89%E9%80%89%E6%8B%A9%E5%9C%B0%E6%89%93%E5%8D%B0%E4%B8%80%E4%BA%9B%E8%A1%8C.png)
我如何才能打印出存储在表中的某些行\MyTable
?
例如我需要以两种方式打印两组rows = 1 to 3
和:rows = 6 to 8
- 打印所有六行作为一个整体,没有视觉分隔
- 在横跨两列的两组之间打印一个分隔行,并以居中标题显示(例如
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
而不能在条件中使用(我们需要它),然后,还有其他计数器(DTLrowi
,DTLrowii
和DTLrowiii
)仅对过滤后的行进行计数。
在下面的例子中,我将表的最后一项更改为与行索引不同的值,以说明不通过这些值进行过滤,
\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
是只读的,这就是我只在第二次迭代中使用它的原因。由于我们需要编辑数据库以附加索引列,因此使用了非星号版本的宏。