我想提取数据库中以 ISO 8601 格式存储的日期的年份(或日期或月份)。
我的 MWE 如下所示:
\documentclass{article}
\usepackage{xstring}
\usepackage{datatool}
\newcommand{\myload}[3][1]{%
\DTLgetvalue
{\thevalue}
{#2}
{#1}
{\dtlcolumnindex
{#2}
{#3}}%
}
%\get{<DATABASE>}{<FIELD>}
\newcommand{\get}[3][1]{%
\myload[#1]{#2}{#3}
\thevalue%
}
% https://tex.stackexchange.com/a/42027/98739
\newcommand*{\dfgExtractYear}[1]{\StrBefore[1]{#1}{-}}%
\newcommand*{\dfgExtractMonth}[1]{\StrBetween[1,2]{#1}{-}{-}}%
\newcommand*{\dfgExtractDay}[1]{\StrBehind[2]{#1}{-}}%
% database
\DTLnewdb{name}
\DTLnewrow{name}
\DTLnewdbentry{name}{dateBirth}{1980-12-04}
\begin{document}
date: \get{name}{dateBirth}\\ % works
Year: \dfgExtractYear{YYYY-MM-DD}\\% works
Day: \dfgExtractDay{YYYY-MM-DD}\\% works
Month: \dfgExtractMonth{YYYY-MM-DD}\\% works
Only Year: \dfgExtractMonth{\get{name}{dateBirth}}% does not work
\end{document}
结果如下:
如何将日期部分的提取代码与数据库的条目结合起来?
答案1
解释可以参见例如https://tex.stackexchange.com/a/632508/250119或我的答案https://tex.stackexchange.com/a/646000/250119(情况 2.1.1),即您的定义\get
不是完全可扩展的。
要解决这个特殊情况,你必须移到\myload
外面:
\documentclass{article}
\usepackage{xstring}
\usepackage{datatool}
\newcommand{\myload}[3][1]{%
\DTLgetvalue
{\thevalue}
{#2}
{#1}
{\dtlcolumnindex
{#2}
{#3}}%
}
%\get{<DATABASE>}{<FIELD>}
\newcommand{\get}[3][1]{%
\myload[#1]{#2}{#3}
\thevalue%
}
% https://tex.stackexchange.com/a/42027/98739
\newcommand*{\dfgExtractYear}[1]{\StrBefore[1]{#1}{-}}%
\newcommand*{\dfgExtractMonth}[1]{\StrBetween[1,2]{#1}{-}{-}}%
\newcommand*{\dfgExtractDay}[1]{\StrBehind[2]{#1}{-}}%
% database
\DTLnewdb{name}
\DTLnewrow{name}
\DTLnewdbentry{name}{dateBirth}{1980-12-04}
\begin{document}
date: \get{name}{dateBirth}\\ % works
Year: \dfgExtractYear{YYYY-MM-DD}\\% works
Day: \dfgExtractDay{YYYY-MM-DD}\\% works
Month: \dfgExtractMonth{YYYY-MM-DD}\\% works
Only Year: \myload{name}{dateBirth}\dfgExtractMonth{\thevalue}
\end{document}
(只改了倒数第二行),比较不方便。
或者,为了方便起见,使用functional
包来定义\get
和\dfgExtractMonth
,这样你就可以\get
在参数中使用\dfgExtractMonth
使用,但目前它不支持可选参数(请参阅将 \input 与 siunitx 的 \num 结合使用 并且有一些解决方法)