我尝试在数据库中添加一个计数器值。但如果要打印数据库内容,该值始终是最大值。我有一个简单的代码示例
\documentclass[11pt,titlepage,a4paper]{article}
\usepackage{datatool}
\DTLnewdb{testDB}
\newcounter{couter1}
\begin{document}
%first row
\setcounter{couter1}{1}
\DTLnewrow{testDB}%
\DTLnewdbentry{testDB}{Field1}{cnt: \arabic{couter1}}%
\stepcounter{couter1}
\DTLnewdbentry{testDB}{Field2}{cnt: \arabic{couter1}}%
%second row
\stepcounter{couter1}
\DTLnewrow{testDB}%
\DTLnewdbentry{testDB}{Field1}{cnt: \arabic{couter1}}%
\stepcounter{couter1}
\DTLnewdbentry{testDB}{Field2}{cnt: \arabic{couter1}}%
%display content of the database
\DTLdisplaydb{testDB}
\end{document}
结果应该如下所示:
1 | 2
3 | 4
谁能帮我?
答案1
第 5.1 节解释说,作为 的参数给出的值\DTLnewdbentry
不会被扩展,因此在所有情况下都会得到cnt: \arabic{couter1}
。但手册还建议了一种解决方法,即使用\dtlexpandnewvalue
和\dtlnoexpandnewvalue
。
\documentclass[11pt,titlepage,a4paper]{article}
\usepackage{datatool}
\DTLnewdb{testDB}
\newcounter{couter1}
\begin{document}
%first row
\setcounter{couter1}{1}
% we want to expand values
\dtlexpandnewvalue
\DTLnewrow{testDB}%
\DTLnewdbentry{testDB}{Field1}{cnt: \arabic{couter1}}%
\stepcounter{couter1}
\DTLnewdbentry{testDB}{Field2}{cnt: \arabic{couter1}}%
%second row
\stepcounter{couter1}
\DTLnewrow{testDB}%
\DTLnewdbentry{testDB}{Field1}{cnt: \arabic{couter1}}%
\stepcounter{couter1}
\DTLnewdbentry{testDB}{Field2}{cnt: \arabic{couter1}}%
% revert to the default
\dtlnoexpandnewvalue
%display content of the database
\DTLdisplaydb{testDB}
\end{document}
请注意,这样所有内容都会完全展开,有时这并不是我们想要的。单个控制序列(例如)\textbf
可能会破坏这种上下文,但只需在它前面加上\noexpand
即可;可以将更长的(与括号平衡的)不展开标记列表作为参数传递给\unexpanded
。