我已经使用该软件包datatool
一段时间了,我想制作我创建的数据库的图表。但我不想绘制数据库中的所有行,所以我想使用条件。这是从 -package 手册中摘录的datatool
:
\DTLplot[<condition>]{<db list>}{<settings>}
此命令创建一个图(在 tikzpicture 环境中),其中包含 中列出的数据库中给出的所有数据
<db list>
,该数据库应为以逗号分隔的数据库名称列表。可选参数<condition>
与 的参数相同\DTLforeach
。<settings>
参数是逗号分隔的对列表<setting>=<value>
。有两个必须指定的设置x
和y
。其他设置是可选的。
在下一部分中,我将向不熟悉该软件包的人解释 datatool 的工作原理。如果您已经知道它的工作原理,请跳到下一个标题。
datatool 简介
我来举个例子\DTLforeach
。创建文件 score.txt,内容如下:
FirstName,Surname,StudentNo,Score
John,Smith,102689,68
Jane,Brown,102647,75
Andy,Brown,103569,42
Zoe,Adams,105987,52
Roger,Brady,106872,58
Clare,Verdon,104356,45
加载并打印数据库的代码:
\documentclass{article}
\usepackage{datatool}
\DTLloaddb{score}{score.txt} % create the database score
\begin{document}
\DTLdisplaydb{score} % prints the database
\end{document}
粗体文本称为键、标题或标识符。它们可用于将数据分配给命令。我将使用命令来解释\DTLforeach
:
该命令\DTLforeach[<condition>]{<db name>}{<assign list>}{<text>}
遍历数据库的每一行,并在满足条件<text>
时执行<condition>
。例如,当我想计算有多少名学生的分数大于 60 时,我可以这样写:
\documentclass{article}
\usepackage{datatool}
\DTLloaddb{score}{score.txt}
\begin{document}
\newcounter{nostudents}
\DTLforeach[\DTLisgt{\Score}{60}]{score}{\Score=Score}{\stepcounter{nostudents}}
A total of \arabic{nostudents}\ have a score higher than 60.
\end{document}
分配列表的工作方式如下:<cmd>=<key>
,其中每行的列值Score
存储在中\Score
。该命令\DTLisgt
只是检查参数 2 是否大于参数 1。
我的实际问题
我将使用与上一节相同的文件,现在我想制作一张(无用的)图表(在本例中),其中学生的分数大于 60 与其学生编号的对比。制作每个人的图表很简单:\DTLplot{score}{x=StudentNo, y=Score}
可以完成这项工作。但有条件的话,我需要一个,<assign list>
但似乎没有\DTLplot
。所以写
\DTLplot[\DTLisgt{\Score}{60}]{score}{x=StudentNo, y=Score}
会导致错误,因为他不知道命令\Score
。在最后一个参数中添加 \Score=Score 也会导致同样的错误。
如果您能告诉我您是否知道解决方案,那就太好了。如果我没有得到任何答复,我会联系软件包维护者。我不喜欢用糟糕的问题打扰他:)
答案1
这似乎是dataplot
包中的一个错误。它调用
\@sDTLforeach[#1]{\dtl@thisdb}{\dtl@x=\dtl@xkey,%
\dtl@y=\dtl@ykey}{...
因此,它传递了条件,但没有提供添加的机会assign list
。我认为不可能从外部向内部 foreach 的这个赋值列表添加内容。请注意,该settings
参数甚至不是为了提供这样的功能。
在这种特殊情况下,您可以使用以下miny
设置:
\DTLplot{score}{x=StudentNo, y=Score, miny=60}
当然,这并不能实现任意条件,而且不幸的是,它不会改变绘制的 x 值的范围。
无论如何,这种绘图类型可能不适合示例中给出的那种数据和关系。该databar
包提供了一种创建条形图的方法,并允许使用条件。代码如下
\DTLbarchart[\DTLisgt{\Score}{60}]{
barlabel=\StudentNo,
upperbarlabel=\Score,
variable=\Score}{score}
{\Score=Score,\StudentNo=StudentNo}
无法\DTLplot
使用 进行修补,因为它需要一个可选参数,而我不必解决这个问题。此外,还必须更改以下内容:etoolbox
xpatch
\DTLcomputebounds[#1]{#2}{\dtl@xkey}{\dtl@ykey}
{\DTLminX}{\DTLminY}{\DTLmaxX}{\DTLmaxY}%
如果您查看文档,您会发现\DTLcomputebounds
没有可选参数,也没有办法传递assign list
。但实现确实包含可选参数。换句话说,这看起来有点像一项正在进行的工作。