我有一个包含参考项目的大型主table*
表,这是此类项目的简单跨项目数据库。现在我想将此主表的各个部分包含在不同的文档中,并根据特定文档的重点选择任意行。
举个例子:主表包含游戏中可以购买的物品。典型的一行包含物品的标签、成本、重量、一些属性和描述列。现在我有不同的 XeLaTeX 文档,其中包含专注于特定时间段(中世纪、文艺复兴、现代、科幻小说等)的游戏规则。主表中的某些项目在某些时间段使用(例如剑或手机)。下面是两个这样的行的简短示例:
Hammer & 1 & 0 & 1 & 10 & 1 & \\
Longsword & 2 & -1 & 2 & 75 & 2 & two-handed \
我想从主表中手动挑选要在单个表中显示的项目(而不是按某些字段或标志进行过滤),但只想引用基本记录,这样如果我在主表上进行更改,例如更改重量或价格,这也会在所有派生表中自动完成。
有没有最佳实践来做到这一点?
答案1
下面是使用的示例包裹datatool
从下面定义的下表中提取数据。要打印的行 ID 列表在以下调用中指定:
\PrintDTLTable{myDB}{Hammer001,Hammer003,Longsword003}
得出下表:
笔记:
- 第一列(
RowID
)必须是唯一的,并且不能是彼此的子集。因此,如果您有一个RowID=foo
和另一个RowID=foobar
,则定位请求RowID=foo
也会匹配RowID=foobar
。 - 我将分隔符改为逗号,但如果您想将其保留为
&
,则只需取消注释该\DTLsetseparator
行。
代码:
\documentclass{article}
\usepackage{datatool}
\usepackage{filecontents}
\begin{filecontents*}{foo.dat}
Hammer001, Hammer, 1 , 0 , 1 , 10 , 1 , light\\
Hammer002, Hammer, 2 , 0 , 1 , 10 , 1 , heavy\\
Hammer003, Hammer, 3 , 0 , 1 , 10 , 1 , realy heavy\\
Longsword001,Longsword, 1 , -1 , 2 , 75 , 2 , one-handed \\
Longsword002,Longsword, 2 , -1 , 2 , 75 , 2 , two-handed \\
Longsword003,Longsword, 3 , -1 , 2 , 75 , 2 , three-handed \\
\end{filecontents*}
\newcommand{\PrintDTLTable}[2]{%
% #1 = database to search
% #2 = list of rowIDs
\begin{tabular}{c c c c c c p{3.0cm}}
Label & Cost & Weight & PropA & PropB & PropC & Description\\\hline
\DTLforeach[\DTLisSubString{#2}{\RowID}]{#1}{%
\RowID=RowID,%
\Label=Label,%
\Cost=Cost,%
\Weight=Weight,%
\PropA=PropA,%
\PropB=PropB,%
\PropC=PropC,%
\Description=Description%
}{%
\Label & \Cost & \Weight & \PropA & \PropB & \PropC & \Description
}%
\end{tabular}
}%
\begin{document}
%\DTLsetseparator{&}% Define separator of the data
\DTLloaddb[noheader,keys={RowID,Label,Cost,Weight,PropA,PropB,PropC,Description}]{myDB}{foo.dat}
%\DTLdisplaydb{myDB}% Usefule for debugging.
\PrintDTLTable{myDB}{Hammer001,Hammer003,Longsword003}
\end{document}