Combine datetime2 e csvsimple

Combine datetime2 e csvsimple

Como posso compilar o seguinte código:

\documentclass{standalone} 
\usepackage{csvsimple}
\usepackage{datetime2}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
a,b
2019,00:00:00
2019,00:00:01
2020,00:00:02
2018,00:00:03
2018,00:00:04
\end{filecontents*}
\begin{document}
\csvreader[head to column names,tabular=llllll]{test.csv}{}
{\a&\DTMtime{\b}}
\end{document}

Observe que ele compila se eu substituir \bpor00:00:01

Responder1

O problema é que \DTMtimeespera que seu argumento já esteja ampliado. Você pode ver o problema se disser:

\def\test{00:00:00}
\DTMtime{\test}

isso já gera um erro. Você precisa expandir primeiro \teste depois executá \DTMtime-lo. Uma maneira de fazer isso é dizendo

\edef\temp{\noexpand\DTMtime{\test}}\temp

O comando \edefdefine uma nova macro expandindo recursivamente o corpo da macro. O comando \noexpanddeixa \DTMtimede ser expandido, para que \tempseja definido como \DTMtime{00:00:00}o que funciona conforme o esperado.

Gosto de definir isso dentro de uma macro, digamos chamada \eval:

\def\eval#1{\edef\temp{#1}\temp}
\eval{\noexpand\DTMtime{\test}}

Outra opção é fazer isso usando Latex3. Latex3 define a macro \exp_args:Nxque \edefé o argumento de uma macro antes de chamá-la, então \exp_args:Nx\DTMtime{\test}irá expandir \testprimeiro e depois executar \DTMtimenela. Você pode definir uma macro wrapper para \DTMtimeque sempre expanda seu argumento primeiro. Aqui está um exemplo de código para isso:

\documentclass{standalone} 
\usepackage{expl3}
\usepackage{datetime2}
\ExplSyntaxOn
\cs_new:Npn\DTMtimex { \exp_args:Nx\DTMtime }
\ExplSyntaxOff

\begin{document}
\def\test{00:00:00}
\DTMtimex{\test}
\end{document}

Aqui está o código completo:

\documentclass{standalone} 
\usepackage{csvsimple}
\usepackage{datetime2}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
a,b
2019,00:00:00
2019,00:00:01
2020,00:00:02
2018,00:00:03
2018,00:00:04
\end{filecontents*}

\def\eval#1{\edef\temp{#1}\temp}
\def\DTMtimex#1{\eval{\noexpand\DTMtime{#1}}}

\begin{document}
\csvreader[head to column names,tabular=llllll]{test.csv}{}
{\a&\DTMtimex{\b}}
\end{document}

informação relacionada