使用包 datatool 获取不区分大小写的数据(DTLfetch)

使用包 datatool 获取不区分大小写的数据(DTLfetch)

在我的某个设置中,我为用户做了简单的设置,这意味着大多数字符串都保存在数据工具数据库中,他们可以通过激活命令来检索它。

因此,我在定义的数据库中创建了简单的硬编码键值模型。现在我遇到了 Datatool 的问题,因为我希望我的“键”不区分大小写。我不想在用户选择“sp”或“Sp”而不是“SP”的情况下进行调试。这对我来说更简单,可以花一些时间进行输入验证。

但是,我的 MWE belo 抛出了一堆错误(其中包括“未定义序列”)。我做错了什么?

\documentclass{article}
\usepackage{datatool}

\DTLnewdb{dbSemester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SP}
\DTLnewdbentry{dbSemester}{value}{Spring semester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SA}
\DTLnewdbentry{dbSemester}{value}{Autumn semester}

\newcommand{\getSemester}[1]{%
    \DTLfetch{dbSemester}{key}{\MakeUppercase{#1}}{value}
}


\begin{document}
    \getSemester{sa}
    \getSemester{SP}
\end{document}

更新 20/08/2018

我找到了一些答案这里那里,关于 DTLfetch 生成的输出的一些格式,但没有涉及将不可扩展的参数传递给 DTLfetch 命令。我开始相信这是不可能实现的。

否则,我想到了一个可能的解决方法,那就是在表中添加大写版本并复制条目

答案1

问题是 LaTeX 中的典型大写宏不可扩展。

可扩展地更改字母大小写并在 \csname 内使用,无需包

\documentclass{article}
\usepackage{datatool,stringstrings}

\DTLnewdb{dbSemester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SP}
\DTLnewdbentry{dbSemester}{value}{Spring semester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SA}
\DTLnewdbentry{dbSemester}{value}{Autumn semester}

\newcommand{\getSemester}[1]{%
    \caseupper[q]{#1}%
    \def\tmpA{\DTLfetch{dbSemester}{key}}%
    \expandafter\tmpA\expandafter{\thestring}{value}
}
\begin{document}
    \getSemester{sa}
    \getSemester{SP}
\end{document}

在此处输入图片描述

这是一个不使用的版本stringstrings,基于所引用的问题中提供的方法:

\documentclass{article}
\usepackage{datatool}

\def\expupperchar#1{%
  \ifcase\numexpr`#1-`a\relax
   A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or
   N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else
   #1\fi
}

\def\expupper#1{%
  \doexpupperchar#1\relax
}

\def\doexpupperchar#1{%
  \ifx#1\relax
  \else
    \expupperchar{#1}\expandafter\doexpupperchar
  \fi
}

\DTLnewdb{dbSemester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SP}
\DTLnewdbentry{dbSemester}{value}{Spring semester}
\DTLnewrow{dbSemester}
\DTLnewdbentry{dbSemester}{key}{SA}
\DTLnewdbentry{dbSemester}{value}{Autumn semester}

\newcommand{\getSemester}[1]{%
    \edef\thestring{\expupper{#1}}%
    \def\tmpA{\DTLfetch{dbSemester}{key}}%
    \expandafter\tmpA\expandafter{\thestring}{value}
}
\begin{document}
    \getSemester{sa}
    \getSemester{SP}
\end{document}

相关内容