对于那些在所有这些扩展问题方面有一定经验的人来说,这很可能是微不足道的,但我有一个关于 pgfplots 的简单问题。我想稍微修改一下它的解析行为。(是的,我知道这个dateplot
库,但我没有成功地根据我的需要调整那里的技巧。)这个问题的动机是这个问题。我只是想将一些数据(特别是这里的时间)转换为数字。这是我的尝试。
\documentclass[11pt, twoside, a4paper]{report}
\usepackage{pgfplots}
%\usepgfplotslibrary{dateplot}
\pgfplotsset{compat=1.16}
\usepackage{filecontents}
\begin{filecontents*}{somedata.csv}
Time;AC
00:00:00;-0.4442
00:01:00;-0.4445
\end{filecontents*}
\makeatletter
\def\myparse#1:#2:#3 #4{%
\pgf@xa=#1pt
\pgf@xb=#2pt
\divide\pgf@xb by60
\advance\pgf@xa by\pgf@xb
\pgf@xb=#3pt
\divide\pgf@xb by3600
\advance\pgf@xa by\pgf@xb
\ifdim\pgf@xa<0pt
\pgf@xa=0pt
\fi
\edef#4{\pgf@sys@tonumber\pgf@xa}%
}%
\newcommand\TimeParse[1]{\myparse#1 \tmp%
\tmp
}
\makeatother
\begin{document}
\TimeParse{00:01:00}
\begin{tikzpicture}
\begin{axis}
%\addplot table [x expr=\TimeParse{\thisrow{Time}}, y=AC, col sep=semicolon] {somedata.csv};
\end{axis}
\end{tikzpicture}
\end{document}
不出所料,\TimeParse{00:01:00}
返回一个数字。但是,一旦我尝试用 将其添加到坐标前面x expr=\TimeParse{\thisrow{Time}}
,这个“解析器”就会失败并出现错误! Argument of \myparse has an extra }.
,我无法修复它。(如果这个问题的答案可以包含一些解释,那就太好了……这可能使解析更一般类型的数据成为可能。;-)
答案1
嗯,首先,\thisrow{Time}
您的 \myparse 命令的格式不正确。您似乎希望它在插入 \TimeParse 命令的定义主体之前会神奇地扩展。
其次,创建一个可扩展的命令可能是一个好主意。这意味着定义中没有 \edef 和赋值。这似乎有效:
\documentclass[11pt, twoside, a4paper]{report}
\usepackage{pgfplots}
%\usepgfplotslibrary{dateplot}
\pgfplotsset{compat=1.16}
\usepackage{filecontents}
\begin{filecontents*}{somedata.csv}
Time;AC
00:00:00;-0.4442
00:01:00;-0.4445
\end{filecontents*}
\usepackage{xfp}
%no idea how to define a command with : in the delimited argument in expl3 ...
\def\marmottimeparseaux#1:#2:#3xxx{\fpeval{#2 / 60 + #1 +(#3/3600)}}
\ExplSyntaxOn
\cs_new:Nn \marmot_timeparse:n { \marmottimeparseaux #1xxx }
\newcommand\TimeParse[1]{\exp_args:Nf\marmot_timeparse:n {#1}}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot table [x expr=\TimeParse{\thisrow{Time}}, y=AC, col sep=semicolon] {somedata.csv};
\end{axis}
\end{tikzpicture}
\end{document}