我想在里面实现甘特图功能pgfplots
。为了绘制任务,我有一个宏来计算任务的开始和结束时间。但是,当我使用多个任务时,里面的值会被覆盖,因此它只显示单个任务。
\documentclass[10pt]{article}
\usepackage{pgfplots}
\begin{document}
\newcommand{\task}[7]{
\pgfmathparse{#1/365+#2/12+#3}
\edef\taskstart{\pgfmathresult}
\pgfmathparse{#4/365+#5/12+#6}
\edef\taskfinish{\pgfmathresult}
\pgfmathparse{#7-0.4}
\edef\bottom{\pgfmathresult}
\pgfmathparse{#7+0.4}
\edef\top{\pgfmathresult}
\draw[blue,fill=blue!50!white] (axis cs:\taskstart,\bottom) rectangle (axis cs:\taskfinish,\top);
}
\begin{tikzpicture}
\begin{axis}[xmin=2011,xmax=2013,ymin=0,ymax=10]
\task{26}{1}{2011}{23}{6}{2011}{1} % this is not drawn
\task{26}{1}{2012}{23}{6}{2012}{3} % only this is drawn
\end{axis}
\end{tikzpicture}
\end{document}
我知道这是一个扩展的问题,但是我必须承认我不知道如何在范围内处理它axis
。
答案1
正如您所注意到的,问题是由于变量的扩展而产生的。pgfplots
收集所有语句直到\end{axis}
然后执行它们。因此,您需要确保包含数据的命令包含正确的数据!您的问题是数据、和\taskstart
被\bottom
定义为最后一个值。那是从。\taskfinish
\top
\task<2>
记住考虑所有命令TikZ
或pgfplots
术语已经充分扩展以便您获得正确的情节。
你可以使用这个来解决这个问题\newcommand
:
\newcommand{\task}[7]{
\pgfmathparse{#1/365+#2/12+#3}
\edef\taskstart{\pgfmathresult}
\pgfmathparse{#4/365+#5/12+#6}
\edef\taskfinish{\pgfmathresult}
\pgfmathparse{#7-0.4}
\edef\bottom{\pgfmathresult}
\pgfmathparse{#7+0.4}
\edef\top{\pgfmathresult}
\edef\tmp{%
\noexpand\draw[blue,fill=blue!50!white] (axis cs:\taskstart,\bottom) rectangle
(axis cs:\taskfinish,\top);}
\tmp
}
生成的图像将是: