问题描述
我在 pgfgantt 中遇到了 vgrid 的偏移问题。
我希望每周都有一条网格线。
如果我从一周的第一天(星期一,六月的最后一天)开始一周,我也会得到六月的标题,我并不想在那里出现,但这样 vgrid 就会正确地调整到周数。如果我从 8 月 1 日开始,我的 vgrid 需要偏移一天。
我已经在 Google 上搜索了两个小时,但没有找到任何真正的解决方案。
我可以为 vgrid 编写一个长样式列表,但是这个列表会很长,因为我需要将它作为非重复列表编写 5 年。
基本上我的情况与此线程相同,只是我需要答案中提到但没有解释的偏移量: 关联
梅威瑟:
\documentclass[]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{pgfgantt} %Für Gantt-Chart
\ganttset{calendar week text={\currentweek}}
\begin{document}
\begin{ganttchart}[time slot format=little-endian, x unit=0.06cm,y unit title = 0.8cm, y unit chart = 0.8cm, vgrid={*6{draw=none}, dotted} ]{31.07.17}{31.08.18}
\gantttitlecalendar{year, month=name, week}{}\ganttnewline
\ganttgroup[progress=0]{Element 1}{01.08.17}{31.08.18} \\
\ganttbar{Task 2}{01.08.17}{01.09.17}\\
\ganttbar{Task 3}{01.08.17}{01.10.17}
\end{ganttchart}
\end{document}
答案1
五年后,我又遇到了同样的问题,下面是我如何实现所需的每周甘特图:
vgrid
可以接受列表采用重复标记的样式,然后按顺序应用,循环到开头并重复,直到图表周期结束。具体来说,语法如下所示
vgrid={*{<n>}{<style>}, *{<n>}{<style>}, ...}
其中n
是相应 的重复次数style
。具体来说,如果off
是所需的偏移量,则以下方法可实现我们的目标:
vgrid={*{off}{draw=none}, <style>, *{<6-off>}{draw=none}}
它应该定义一个恰好包含 7 种样式的列表,其中style
sitting 位于星期一的位置。但请注意,6-off
算术不能直接在括号中执行,因此对于一次性解决方案,您可以简单地对值进行硬编码。
- 利用datetime2包自动计算偏移量。
\usepackage{datetime2,datetime2-calc}
...
\DTMcomputedayofweekindex{<starting date>}{\startdow}
\newcount\off\off\startdow\multiply\off -1\advance\off 6 % \off == 6-\startdow
将 的星期几的数字放入<starting date>
中startdow
,并使用该值计算 中的偏移量off
。
- 使用从上述变量中
\ganttset
进行设置。vgrid
不幸的是,如果在的可选参数中直接提供,\off
和将不会扩展,但我们可以通过以下方式以编程方式设置该属性:\startdow
\begin{ganttchart}[...]
ganttset
\ganttset{vgrid={*{\the\off}{draw=none}, dotted, *{\startdow}{draw=none}}
然而,有一个问题。事实证明,重复次数0
并不像预期的那样有效,所以我们必须分别处理\startdow
或\off
的情况0
。特别是,
- 我把上面的内容封装在一个宏中:
\def\gantchartweekly#1#2{
\DTMcomputedayofweekindex{#1}{\startdow}
\newcount\off\off\startdow\multiply\off -1\advance\off 6
\begin{ganttchart}[<formatting>]{#1}{#2}
\ifnum\off=0
\ganttset{vgrid={dotted, *{\the\off}{draw=none}}}
\else\if\startdow=0
\ganttset{vgrid={*{\startdow}{draw=none}, dotted}}
\else
\ganttset{vgrid={*{\the\off}{draw=none}, dotted, *{\startdow}{draw=none}}}
\fi\fi
\gantttitlecalendar{year,month,week}
}