
다음 코드를 컴파일하려면 어떻게 해야 합니까?
\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
\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}