使用 BibTex 作为生成表的通用数据库

使用 BibTex 作为生成表的通用数据库

我想创建一些数据的概览表。更具体地说,我有一些命名对象,并且每个对象都有一些属性。

示例数据和输出示意图:

+ -------+--------+-------+--------+
| 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}

上面的例子产生:

结果图像

(如果它超过一页,我建议放入\DTLdisplaydbtable使用。)\DTLdisplaylongdb

相关内容