这个问题是一个确认和后续问题这个问题的代码
我正在准备一个模板,它依赖于一些将在 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}
问题
- 我注意到我的代码编译时不需要包
xparse
&etoolbox
。这有必要吗? - 抱歉,我说得太笼统,但我是否遗漏了一些可能破坏此代码或导致神秘错误的重要警告?