根据数据工具中键/值对的存在情况进行条件执行

根据数据工具中键/值对的存在情况进行条件执行

这个问题是一个确认和后续问题这个问题的代码

我正在准备一个模板,它依赖于一些将在 CSV 文件中提供的文本(例如,免责声明文本、大段文本)。也许我想得太多了,但我的想法是使用 Latex 自动化我文档的某些部分制作。

在其他一些要求中,代码

  • 如果某些文本不存在,则不得抛出错误,并且
  • 必须足够聪明来处理一些条件,例如如果 DB 包含“disclaimer2”则显示它,否则尝试显示“disclaimer”(默认)。

上面链接中的代码不处理二维数组的情况,但似乎只包含一维列表。所以我尝试扩展它。好观点,我的代码在 Sharelatex 上编译得很好,但我仍然有一些疑问,因为比我更专业的用户进行了健全性检查

\documentclass{article}
\usepackage{datatool}
\usepackage{lipsum}

\makeatletter
% Patch \DTLgetlocation to gobble the error
\let\ErrorFreeDTLgetlocation\DTLgetlocation%
\patchcmd{\ErrorFreeDTLgetlocation}{\PackageError}{\@gobbletwo}{}{}%
\def\@@dtlnovalue{\@dtlnovalue}%
% Conditional on Existence of entry in DB
\newcommand*{\IfIsInDB}[4]{
    % #1 = DB name, #2 = member to check for
    % #3 = code to execute if member is in DB
    % #4 = code to execute if member is not in DB
    \ErrorFreeDTLgetlocation{\RowIndex}{\ColIndex}{#1}{#2}
    \ifx\RowIndex\@@dtlnovalue
        #4%
    \else
        #3
    \fi
}
\makeatother

\DTLnewdb{dbDocOptions}
\DTLnewrow{dbDocOptions}
\DTLnewdbentry{dbDocOptions}{key}{disclaimer}
\DTLnewdbentry{dbDocOptions}{value}{\lipsum[1]}
\DTLnewrow{dbDocOptions}
\DTLnewdbentry{dbDocOptions}{key}{disclaimer2}
\DTLnewdbentry{dbDocOptions}{value}{\lipsum[2]}

\newcommand{\disclaimerFormatted}{%
    \IfIsInDB{dbDocOptions}{disclaimer}{\begin{center}%
        \begin{tabular}{l}%
        \multicolumn{1}{c}{\Large{\textbf{Disclaimer}}\vspace*{0.5cm}}\\%
        \begin{minipage}[t]{0.9\textwidth}
        \DTLfetch{dbDocOptions}{key}{disclaimer}{value}%
        \end{minipage}\\
        \end{tabular}%
    \end{center}%
    }{}%
}

\newcommand{\disclaimerTwoFormatted}{%
    \IfIsInDB{dbDocOptions}{disclaimer2}{\begin{center}%
        \begin{tabular}{ll}%
        \multicolumn{1}{c}{\Large{\textbf{Second Disclaimer}}\vspace*{0.5cm}} \\ \hline
        \textit{highlights} & \begin{minipage}[t]{0.45\textwidth}\DTLfetch{dbDocOptions}{key}{disclaimer2}{value}\end{minipage} \\ \hline
        \end{tabular}%
    \end{center}%
    }{}%
}

\begin{document}
\disclaimerFormatted
\noindent\lipsum[3]
\disclaimerTwoFormatted

\end{document}

问题

  1. 我注意到我的代码编译时不需要包xparse& etoolbox。这有必要吗?
  2. 抱歉,我说得太笼统,但我是否遗漏了一些可能破坏此代码或导致神秘错误的重要警告?

相关内容