使用 tabularx 和 datatool 从 csv 文件创建表格

使用 tabularx 和 datatool 从 csv 文件创建表格

我正在尝试使用 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可嵌套三次。每一级都使用相应的计数器:DTLrowiDTLrowiiDTLrowiii跟踪当前行。

请注意,这些计数器仅在<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以及其他固定宽度的列类型(如pm)。例如,使用l-column 不会显示此问题。

相关内容