合并不同的 dbtex 数据库文件

合并不同的 dbtex 数据库文件

我想将 2 个数据库文件合并到一个文件中。我尝试加载文件 11g.dbtex 和 2005it.dbtex,如下所示

\documentclass[a4paper,9pt]{article}
\usepackage{amssymb,amsthm}
\usepackage{amsmath}
\usepackage{setspace}
\usepackage[resetfonts]{cmap}
\usepackage{bytefield}
\usepackage{datatool}
\newcommand{\altura}{.45cm}
\usepackage{fancyvrb}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage[margin=1in]{geometry}
\usepackage{tikz}
\usepackage{fancyvrb}
\usepackage{fancyhdr}
\usepackage{mathtools}
\usepackage{longdata}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,decorations.markings,arrows}
\usepackage{bm}
\usepackage{qtree}
\usepackage{graphicx}
\usepackage{slashbox}
\usepackage{qtree}
\usepackage{fancybox}
\pagestyle{plain}
\usepackage{latexsym}
\usepackage[resetfonts]{cmap}
\usepackage{adjustbox}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{qtree}
\usepackage{xcolor}

\newif\ifsolns \solnsfalse

\input{11g.dbtex} \input{2005it.dbtex}

\begin{document}
\begin{enumerate}
\DTLforeach[\DTLisclosedbetween{\seq}{1}{100}]% {finitemath}%
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}%
{\DTLifstringeq{\sub}{DM}{ {\DTLifstringeq{\top}{logic}{ \item \qus }{}} }{}}
\end{enumerate} \end{document}

但编译后,它显示的结果对应于 2005it.dbtex(最后加载的数据库)。我尝试了许多组合,但每次它都显示对应于最后加载的数据库的结果。是否可以得到所有数据库文件组合的结果?

答案1

每个数据库都.dbtex包含一个带有唯一标签的数据库。你之前的问题,我根据文件得出以下结论11g.tex

\DTLnewdb{finitemath}
\long\def\newproblem#1#2#3#4#5#6#7#8#9{%
 \DTLnewrow{finitemath}%
 \DTLnewdbentry{finitemath}{seq}{#1}%
 \DTLnewdbentry{finitemath}{yr}{#2}%
 \DTLnewdbentry{finitemath}{sub}{#3}%
 \DTLnewdbentry{finitemath}{top}{#4}%
 \DTLnewdbentry{finitemath}{mar}{#5}%
 \DTLnewdbentry{finitemath}{qus}{#6}%
 \DTLnewdbentry{finitemath}{url}{#7}%
 \DTLnewdbentry{finitemath}{exp}{#8}%
 \DTLnewdbentry{finitemath}{ans}{#9}%
}

\newproblem{1}{2018}{DM}{comb}{1}{question 1}{url 1}{exp 1}{ans 1}
% lots more \newproblem commands

但是文件呢2005it.tex?你没有提供足够的信息。它是否以相同的方式启动?像这样:

\DTLnewdb{finitemath}
\long\def\newproblem#1#2#3#4#5#6#7#8#9{%
 \DTLnewrow{finitemath}%
 \DTLnewdbentry{finitemath}{seq}{#1}%
 \DTLnewdbentry{finitemath}{yr}{#2}%
 \DTLnewdbentry{finitemath}{sub}{#3}%
 \DTLnewdbentry{finitemath}{top}{#4}%
 \DTLnewdbentry{finitemath}{mar}{#5}%
 \DTLnewdbentry{finitemath}{qus}{#6}%
 \DTLnewdbentry{finitemath}{url}{#7}%
 \DTLnewdbentry{finitemath}{exp}{#8}%
 \DTLnewdbentry{finitemath}{ans}{#9}%
}

\newproblem{2}{2018}{DM}{comb}{1}{question 2}{url 2}{exp 2}{ans 2}

如果是这种情况,那么您就不能同时输入11g.tex和,2005it.tex因为这\DTLnewdb{finitemath}会产生冲突。所以我假设情况并非如此。也许2005it.tex更像这样:

\DTLnewdb{somethingelse}
\long\def\newproblem#1#2#3#4#5#6#7#8#9{%
 \DTLnewrow{somethingelse}%
 \DTLnewdbentry{somethingelse}{seq}{#1}%
 \DTLnewdbentry{somethingelse}{yr}{#2}%
 \DTLnewdbentry{somethingelse}{sub}{#3}%
 \DTLnewdbentry{somethingelse}{top}{#4}%
 \DTLnewdbentry{somethingelse}{mar}{#5}%
 \DTLnewdbentry{somethingelse}{qus}{#6}%
 \DTLnewdbentry{somethingelse}{url}{#7}%
 \DTLnewdbentry{somethingelse}{exp}{#8}%
 \DTLnewdbentry{somethingelse}{ans}{#9}%
}

\newproblem{2}{2018}{DM}{comb}{1}{question 2}{url 2}{exp 2}{ans 2}

或者您是否在一个文件中有一个在整个文档中使用的单一定义\newproblem和一个单一实例?\DTLnewdb.tex

第二种情况似乎最有可能。在这种情况下,我猜你是.dbtex先将文件更改\long\def\newproblem#1#2#3#4#5#6#7#8#9.tex\providecommand{\newproblem}[9]然后使用以下方法获取文件的:

datatooltk --in 11g.tex --output 11g.dbtex 
datatooltk --in 2005it.tex --output 2005it.dbtex

这将创建11g.dbtex包含从 中提取的数据库的定义11g.tex(由标签 标识)finitemath,并且2005it.dbtex包含从 中提取的数据库的定义2005it.tex(由该文件中使用的标签 标识)(somethingelse)。

这意味着在文档中,如果您想引用中的数据,11g.dbtex那么您需要通过以下方式来识别它finitemath,如果您想引用中的数据,2005it.dbtex那么您需要通过关联的标签(somethingelse)来识别它。

\documentclass{article}

\usepackage{datatool}

\input{11g.dbtex}
\input{2005it.dbtex}

\begin{document}
\DTLforeach{finitemath}% data from 11g.dbtex
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\DTLforeach{somethingelse}% data from 2005it.dbtex
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\end{document}

如果您不想跟踪标签,您可以使用\DTLloaddbtex它,它允许您分配一个命令来存储标签:

\documentclass{article}

\usepackage{datatool}

\DTLloaddbtex{\dataI}{11g.dbtex}
\DTLloaddbtex{\dataII}{2005it.dbtex}

\begin{document}
\DTLforeach{\dataI}% data from 11g.dbtex
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\DTLforeach{\dataII}% data from 2005it.dbtex
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\end{document}

您可以遍历第二个数据库并将其附加到第一个数据库,但这违背了用于datatooltk改进文档构建的目的。

\DTLnewdb一个更简单的解决方案是将的定义移动\newproblem至一个新文件,例如problems.tex

\newcommand{\databaselabel}{finitemath}

\DTLnewdb{\databaselabel}
\providecommand{\newproblem}[9]{%
 \DTLnewrow{\databaselabel}%
 \DTLnewdbentry{\databaselabel}{seq}{#1}%
 \DTLnewdbentry{\databaselabel}{yr}{#2}%
 \DTLnewdbentry{\databaselabel}{sub}{#3}%
 \DTLnewdbentry{\databaselabel}{top}{#4}%
 \DTLnewdbentry{\databaselabel}{mar}{#5}%
 \DTLnewdbentry{\databaselabel}{qus}{#6}%
 \DTLnewdbentry{\databaselabel}{url}{#7}%
 \DTLnewdbentry{\databaselabel}{exp}{#8}%
 \DTLnewdbentry{\databaselabel}{ans}{#9}%
}

\input{11g.tex}
\input{2005it.tex}

11g.tex并从和中删除这些行2005it.tex

修改后的内容如下11g.tex

\newproblem{1}{2018}{DM}{comb}{1}{question 1}{url 1}{exp 1}{ans 1}
% lots more \newproblem

修改后的内容如下2005it.tex

\newproblem{2}{2018}{DM}{comb}{1}{question 2}{url 2}{exp 2}{ans 2}
% lots more \newproblem

现在,您只需更改 的第一行problems.tex以更改数据库标签,并添加或删除\input行以合并额外的文件(假设它们都只包含 的多个实例)。这意味着只需要\newproblem调用 一次:datatooltk

datatooltk --in problems.tex --output problems.dbtex

这将创建一个包含所有问题的数据库。由于您正在使用,因此datatooltk此时应用过滤比使用可选参数更有效\DTLforeach

datatooltk --in problems.tex --output problems.dbtex --filter-and --filter seq ge 1 --filter seq le 100 --filter sub eq DM --filter top eq logic

datatooltk您只需在数据或条件发生变化时运行即可。现在,当problems.dbtex在文档中输入时,它仅包含经过筛选的选择。这使得循环速度更快(如果您使用带星号的只读版本,速度会更快\DTLforeach):

\documentclass{article}

\usepackage{datatool}

\DTLloaddbtex{\problemdb}{problems.dbtex}

\begin{document}
\DTLforeach*{\problemdb}% 
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\end{document}

如果你有另一个具有不同条件的循环,则只需再datatooltk调用一次。例如:

datatooltk --name problems1 --in problems.tex --output problems1.dbtex --filter-and --filter seq ge 1 --filter seq le 100 --filter sub eq DM --filter top eq logic
datatooltk --name problems2 --in problems.tex --output problems2.dbtex --filter-and --filter seq ge 1 --filter seq le 100 --filter sub eq DM --filter top eq algebra

交换机--name分配一个新的标签,可以用来避免标签冲突。

修改后的文档:

\documentclass{article}

\usepackage{datatool}

\DTLloaddbtex{\problemIdb}{problems1.dbtex}
\DTLloaddbtex{\problemIIdb}{problems2.dbtex}

\begin{document}
\DTLforeach*{\problemIdb}% 
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\DTLforeach*{\problemIIdb}% 
{\seq=seq,\yr=yr,\sub=sub, \top=top, \mar=mar,\qus=qus, \ans=ans}
{%
 %... whatever
}

\end{document}

相关内容