pgfgantt:如何按月间隔创建 vgrid?

pgfgantt:如何按月间隔创建 vgrid?

考虑以下最小工作示例(MWE)

\documentclass{standalone}
\usepackage{tikz,pgfgantt}

\begin{document}
    \begin{ganttchart}[%
        time slot format    = isodate,
        vgrid               = { *6{dotted}, *1{dashed} },
        ]%
        {2019-01-01}{2019-02-15}
        \gantttitlecalendar{year, month=shortname}\\
    \end{ganttchart}
\end{document}

结果截图:

结果截图


问题:

如何为vgrid每个月添加额外的行(如下一个屏幕截图所示)?由于月份长度不规则(有些是 28 天,而有些是 31 天),因此无法只为每个第 31 天添加行。:-)

所需状态的屏幕截图

此外,还应在保留vgrid周历的同时,额外添加月历。vgrid

答案1

vgrid采用样式列表。 A样式列表只是一系列与需要绘制的每条线的规格相对应的指令。一周从星期一开始。2019 年 1 月 1 日是星期二。日期用灰色虚线分隔,星期用黑色虚线分隔,月份末尾用宽度为 3pt 的红线分隔。

因此,序列是 5 条虚线,后面跟着一条虚线,以结束第一周:*5{dotted},*1{dashed}。接下来是三个完整的星期,所以我们重复*6{dotted},*1{dashed}三次。月底是在下一周,所以我们写:*3{dotted},{red,line width=3pt},*2{dotted},*1{dashed}以完成图表中的第 5 周。然后我们再添加 2 周的点划线格式以完善图表。

为了清楚起见,我添加了星期名称和周数。

在此处输入图片描述

\documentclass[tikz]{standalone}
\usepackage{pgfgantt}

\def\pgfcalendarweekdayletter#1{%
\ifcase#1M\or T\or W\or T\or F\or S\or S\fi%
}

\begin{document}
    \begin{ganttchart}[%
        time slot format = isodate,
        vgrid = { *5{dotted}, *1{dashed}, % week 1
                  *6{dotted}, *1{dashed}, % week 2
                  *6{dotted}, *1{dashed}, % week 3
                  *6{dotted}, *1{dashed}, % week 4
                  *3{dotted},{red,line width=3pt},*2{dotted}, *1{dashed}, % week 5
                  *6{dotted}, *1{dashed}, % week 6
                  *4{dotted}}]            % week 7
        {2019-01-01}{2019-02-15}
        \gantttitlecalendar{year, month=shortname,week,day,weekday=letter}\\
    \end{ganttchart}
\end{document} 

相关内容