我正在尝试使用 tabularx 和 datatool 从包含词汇表的 csv 文件创建词汇表。
这是我尝试过的:
\documentclass{article}
\usepackage{datatool,tabularx}
\usepackage{hyperref}
\begin{filecontents*}{test.csv}
english,german
voasc1,translation1
vofc2,trans2
\end{filecontents*}
\begin{document}
\DTLloaddb{vocabDB}{test.csv}%Load vocab file
\noindent
\begin{tabularx}{\columnwidth}{X|X}
\textbf{English} & \textbf{German} \\
\hline
\DTLforeach*{vocabDB}{\English=english,\German=german}{
\English & \German \\
}
\end{tabularx}
\end{document}
但随后我在第一列中得到了一个空行。至少编译时没有 TeX 错误。
我尝试在没有 datatool 的情况下使用这个 tabularx 语法,然后成功了,即每行只有一行并且两列的高度相同。
编辑
似乎实际上是 hyperref 导致了这种奇怪的行为。(我已将这一行添加到上面的代码中)。为什么会这样?
编辑2 通过将表放入 NoHyper 环境解决了该问题。
答案1
datatool
跟踪使用时解析的行\DTLforeach[*][<condition>]{<db name>}{<assign list>}{<text>}
(来自用户指南):
此宏最多
\DTLforeach
可嵌套三次。每一级都使用相应的计数器:DTLrowi
和DTLrowii
来DTLrowiii
跟踪当前行。请注意,这些计数器仅在
<condition>
满足时才会递增,因此它们在 中不会具有正确的值<condition>
。这些计数器\refstepcounter
在 开始之前使用 递增<text>
,因此可以使用 引用它们\label
,但请记住\label
引用当前范围内要使用 递增的最后一个计数器\refstepcounter
。因此 \label 应该是 中的第一个命令,<text>
以确保它引用当前行计数器。
这里重要的是,可以使用 来引用行计数器\label
。因此,它使用\refstepcounter
- 来增加hyperref
重新定义以管理其超链接锚点等。
为了避免这种情况,请删除hyperref
表的功能(通过NoHyper
环境),或者不要在计数器中使用可参考的步进机制。即\let\refstepcounter\stepcounter
:
\documentclass{article}
\usepackage{datatool,tabularx}
\usepackage{hyperref}
\begin{filecontents*}{test.csv}
english,german
english1,german1
english2,german2
\end{filecontents*}
\begin{document}
\DTLloaddb{vocabDB}{test.csv}%Load vocab file
\noindent
{\let\refstepcounter\stepcounter% Or \begin{NoHyper}
\begin{tabularx}{\columnwidth}{X|X}
\textbf{English} & \textbf{German} \\
\hline
\DTLforeach*{vocabDB}{\English=english,\German=german}{
\English & \German \\
}
\end{tabularx}%
}% \end{NoHyper}
\end{document}
请注意,此行为也特定于X
-column 类型的tabularx
以及其他固定宽度的列类型(如p
或m
)。例如,使用l
-column 不会显示此问题。