上下文 假设我们有 2 个团体聚会,分别是红色和蓝色。它们有不同的子部分:红色、蓝色。在每个相应的子部分中,都有一个包含相同信息的表格。时刻(计数数字)、日期、类型(红色或蓝色)、主题。
我有 2 个表,想生成第 3 个表;或者我有 1 个表,想生成另外 2 个表
期望结果开始
1 张桌子
\begin{table}[]
\begin{tabular}{llll}
Moment & Date & Type & subject\\
1 & \now{} & RED & Pie
2 & \now{} & BLUE & Pie
3 & \now{} & RED & Apple
4 & \now{} & BLUE & Apple
\end{tabular}
\end{table}
\begin{table}[]
\begin{tabular}{llll}
Moment & Date & Type & subject\\
\end{tabular}
\end{table}
2 张桌子
\begin{table}[]
\begin{tabular}{llll}
Moment & Date & Type & subject\\
1 & \now{} & RED & Pie
3 & \now{} & RED & Apple
\end{tabular}
\end{table}
\begin{table}[]
\begin{tabular}{llll}
Moment & Date & Type & subject\\
2 & \now{} & BLUE & Pie
4 & \now{} & BLUE & Apple
\end{tabular}
\end{table}
期望结果结束
希望 1 生成其他 2 个。或者 1 是在 2 个之前生成的
答案1
分裂
我建议使用pgfplotstable
并从用创建的文本文件开始filecontents
。
pgfplotstable
有一个选项row predicate
允许您在每一行执行一些代码。\pgfplotstablegetelem{#1}{Type}\of\mytable
您可以使用它获取当前行的“类型”列的值\pgfplotsretval
。
然后您可以使用包\ifdefstring
来etoolbox
测试该值并设置\pgfplotstableuserowfalse
何时不想显示该行。
由于您没有发布完整的 MWE 并且我不知道\now
宏,所以我使用了包\today
中的宏datetime
。
\documentclass{article}
\usepackage{array}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
\pgfplotstableset{
string type,
column type=l,
every head row/.style={
before row=\toprule,
after row=\midrule,
},
every last row/.style={
after row=\bottomrule
},
}
\usepackage{etoolbox}
\usepackage[yyyymmdd]{datetime}
\usepackage{filecontents}
\begin{document}
\begin{filecontents}{mytable.dat}
Moment Date Type subject
1 {\today} RED Pie
2 {\today} BLUE Pie
3 {\today} RED Apple
4 {\today} BLUE Apple
\end{filecontents}
\pgfplotstableread{mytable.dat}{\mytable}
Whole table:\bigskip
\pgfplotstabletypeset{\mytable}
\bigskip\bigskip Table with only rows with column ``Type''=BLUE:\bigskip
\pgfplotstabletypeset[
row predicate/.code={%
\pgfplotstablegetelem{#1}{Type}\of\mytable%
\ifdefstring{\pgfplotsretval}{BLUE}{}{\pgfplotstableuserowfalse}%
},
]{\mytable}
\bigskip\bigskip Table with only rows with column ``Type''=RED:\bigskip
\pgfplotstabletypeset[
row predicate/.code={%
\pgfplotstablegetelem{#1}{Type}\of\mytable%
\ifdefstring{\pgfplotsretval}{RED}{}{\pgfplotstableuserowfalse}%
},
]{\mytable}
\end{document}
合并
这甚至更简单。您可以使用 创建两个文本文件filecontents
,一个包含“蓝色”行,另一个包含“红色”行,您可以分别对它们进行排版,也可以使用 合并它们\pgfplotstablevertcat
,如果需要,还可以使用 对它们进行排序\pgfplotstablesort
。
\documentclass{article}
\usepackage{array}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
\pgfplotstableset{
string type,
column type=l,
every head row/.style={
before row=\toprule,
after row=\midrule,
},
every last row/.style={
after row=\bottomrule
},
}
\usepackage{etoolbox}
\usepackage[yyyymmdd]{datetime}
\usepackage{filecontents}
\begin{document}
\begin{filecontents}{mytableblue.dat}
Moment Date Type subject
2 {\today} BLUE Pie
4 {\today} BLUE Apple
\end{filecontents}
\begin{filecontents}{mytablered.dat}
Moment Date Type subject
1 {\today} RED Pie
3 {\today} RED Apple
\end{filecontents}
\pgfplotstableread{mytableblue.dat}{\mytable}
\pgfplotstableread{mytableblue.dat}{\mytableblue}
\pgfplotstableread{mytablered.dat}{\mytablered}
Whole table:\bigskip
\pgfplotstablevertcat{\mytable}{\mytablered}
\pgfplotstablesort[sort key={Moment}]\mytable\mytable
\pgfplotstabletypeset{\mytable}
\bigskip\bigskip Table with only rows with column ``Type''=BLUE:\bigskip
\pgfplotstabletypeset{\mytableblue}
\bigskip\bigskip Table with only rows with column ``Type''=RED:\bigskip
\pgfplotstabletypeset{\mytablered}
\end{document}
结果和以前一样。