我想创建一些数据的概览表。更具体地说,我有一些命名对象,并且每个对象都有一些属性。
示例数据和输出示意图:
+ -------+--------+-------+--------+
| Object | Edible | Color | Size |
+ -------+--------+-------+--------+
| Apple | yes | green | small |
| Cat | no | brown | medium |
+ -------+--------+-------+--------+
我并不想手动输入表格,而是想创建一个类似数据库的东西,然后根据格式描述生成表格。
我认为这也许可以用 BibTex 来实现。
我将创建一个包含如下内容的 bib 文件:
@misc{apple,
name={Apple},
edible={yes},
color={green},
size={small}
}
@misc{cat,
name={Cat},
edible={no},
color={brown}
size={medium}
}
然后创建一个(非常)自定义的书目样式以将其转换为表格。
我可以创建一些外部脚本将 bib 文件转换为表格(JSON 可能是更好的数据格式)但我想使用 TeX 工具。
我怎样才能从这个(或类似的)围兜转到表格而不是列表(通常带有参考资料)?
答案1
除非你知道如何用 bibtex 的基于堆栈的语言编写,否则我不建议这样做。如果你只想使用 TeX 工具而不依赖外部脚本,你可以使用datatool
。下面是一个例子:
\documentclass{article}
\usepackage{datatool}
\begin{filecontents*}{test.csv}
Object,Edible,Color,Size
Apple,yes,green,small
Cat,no,brown,medium
Aardvark,no,grey,medium
\end{filecontents*}
\DTLloaddb{mydata}{test.csv}
% Define a command to access a field in `mydata' in the row identified by a
% given object:
% Syntax: \field{object}{column label}
\newcommand{\field}[2]{%
\dtlgetrowforvalue{mydata}{\dtlcolumnindex{mydata}{Object}}{#1}%
\dtlgetentryfromcurrentrow{\thisvalue}{\dtlcolumnindex{mydata}{#2}}%
\thisvalue
}
% Syntax: \boolfield{object}{column label}{true part}{false part}
\newcommand{\boolfield}[4]{%
\dtlgetrowforvalue{mydata}{\dtlcolumnindex{mydata}{Object}}{#1}%
\dtlgetentryfromcurrentrow{\thisvalue}{\dtlcolumnindex{mydata}{#2}}%
\DTLifstringeq{\thisvalue}{yes}{#3}{#4}%
}
\begin{document}
List the data in a tabular environment:
\DTLdisplaydb{mydata}
Sort on `Object' column.
\DTLsort{Object}{mydata}
List sorted data in a tabular environment:
\DTLdisplaydb{mydata}
Access data: an apple is \field{Apple}{Size} and \field{Apple}{Color}.
It \boolfield{Apple}{Edible}{is}{isn't} edible.
Access data: a cat is \field{Cat}{Size} and \field{Apple}{Color}.
It \boolfield{Cat}{Edible}{is}{isn't} edible.
\end{document}
上面的例子产生:
(如果它超过一页,我建议放入\DTLdisplaydb
或table
使用。)\DTLdisplaylongdb