結合 datetime2 和 csvsimple

結合 datetime2 和 csvsimple

我怎麼能編譯以下程式碼:

\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}

\b請注意,如果我替換為,它會編譯00:00:01

答案1

問題是它\DTMtime期望它的論點已經擴展。如果你說:

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

這已經引發了一個錯誤。你需要先擴展\test,然後再運行\DTMtime。做到這一點的一種方法是說

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

此指令\edef透過遞歸擴展宏體來定義新的巨集。該命令\noexpand停止\DTMtime擴展,因此\temp被定義為\DTMtime{00:00:00}然後按預期工作。

我喜歡在巨集內部定義它,例如\eval

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

另一個選擇是使用 Latex3 來完成此操作。 Latex3 在呼叫巨集之前定義了宏\exp_args:Nx,該\edef宏是宏的參數,因此 then\exp_args:Nx\DTMtime{\test}將首先展開\test,然後\DTMtime在其上運行。您可以定義一個包裝宏,\DTMtime它始終首先擴展其參數。這是範例程式碼:

\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}

這是完整的程式碼:

\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}

相關內容