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。これを行う1つの方法は、次のようにすることです。

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

もう 1 つのオプションは、Latex3 を使用してこれを行うことです。Latex3 は、マクロを呼び出す前にマクロの引数を定義するため、\exp_args:Nx最初に展開してから実行されます。常に最初に引数を展開するラッパー マクロを定義できます。次に、そのサンプル コードを示します。\edef\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}

関連情報