LaTex:可以在 pgfgantt 中使用 vgrid 偏移吗?

LaTex:可以在 pgfgantt 中使用 vgrid 偏移吗?

问题描述

我在 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

五年后,我又遇到了同样的问题,下面是我如何实现所需的每周甘特图:

  1. vgrid可以接受列表采用重复标记的样式,然后按顺序应用,循环到开头并重复,直到图表周期结束。具体来说,语法如下所示
vgrid={*{<n>}{<style>}, *{<n>}{<style>}, ...}

其中n是相应 的重复次数style。具体来说,如果off是所需的偏移量,则以下方法可实现我们的目标:

vgrid={*{off}{draw=none}, <style>, *{<6-off>}{draw=none}}

它应该定义一个恰好包含 7 种样式的列表,其中stylesitting 位于星期一的位置。但请注意,6-off算术不能直接在括号中执行,因此对于一次性解决方案,您可以简单地对值进行硬编码。

  1. 利用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

  1. 使用从上述变量中\ganttset​​进行设置。vgrid

不幸的是,如果在的可选参数中直接提供,\off和将不会扩展,但我们可以通过以下方式以编程方式设置该属性:\startdow\begin{ganttchart}[...]ganttset

\ganttset{vgrid={*{\the\off}{draw=none}, dotted, *{\startdow}{draw=none}}

然而,有一个问题。事实证明,重复次数0并不像预期的那样有效,所以我们必须分别处理\startdow\off的情况0。特别是,

  1. 我把上面的内容封装在一个宏中:
\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}
}

相关内容