pgfgantt:将进度标签移动到栏的左侧

pgfgantt:将进度标签移动到栏的左侧

我正在用 pgfgantt 制作甘特图。我想使用进度标签来注释任务的资源(像往常一样使用图表左侧的标准条形标签)。这种方法效果很好,但对于图表的最后任务,标签远远超出了图表的右边缘,甚至超出了页面的边缘。当然,我可以尝试缩小图表,但这会使图表难以阅读。因此,我希望将进度标签移到这些条形的条形左侧。

阅读了 pgfgantt 文档的相关部分和一些在线文章后,我得出了以下代码(仅显示相关的 ganttbar 命令):

\ganttbar[progress label text={Resource 7},
          bar progress label anchor=west]%
         {Task Label}{12}{15}

这会将进度标签的开头恰好移到进度条的左侧,但标签的文本现在与进度条重叠。相反,我想将文本完全移到进度条的左侧。然后我尝试了以下各种变体,但我显然误解了这里的东西,因为这些更改都没有任何区别:

\ganttbar[progress label text={Resource 7},
          bar progress label node /.append style={anchor=east,left=.5cm},
          bar progress label anchor=west]%
         {Task Label}{12}{15}

这里的文档不是特别有用,而且我对 PGF/TikZ 了解不够,无法从源代码中弄清楚这一点。

有什么建议么?

编辑

下面是一个 MWE,可以使我的问题更加明确:

\documentclass{article}

\usepackage[utf8]{inputenc}

\usepackage{pdflscape}
\usepackage{pgfgantt}

\begin{document}
    \begin{landscape}
        \begin{ganttchart}%
                    [hgrid,
                     vgrid={draw=none, draw=none, dotted},
                     progress=100,
                     progress label text={}]%
                    {1}{36}
            \gantttitle{Y1}{12} \gantttitle{Y2}{12} \gantttitle{Y3}{12} \\
            \gantttitlelist{1,...,36}{1} \\
            \ganttbar[progress label text={Resource1}]{Task1}{32}{36} \\
            \ganttbar[progress label text={Resource2},
                      bar progress label anchor=west]{Task2}{32}{36} \\
            \ganttbar[progress label text={Resource3},
                      bar progress label node /.append style={anchor=east,left=.5cm},
                      bar progress label anchor=west]{Task3}{32}{36}
        \end{ganttchart}
    \end{landscape}
\end{document}

这将产生以下图表:

带有资源注释的简单甘特图

任务 1 显示了正常进度注释的情况。在我的原始文档中,这些注释超出了页边距。任务 2 和 3 显示了我将该标签移到栏左侧的尝试,但没有成功。

下面的图片显示了我想要实现的模型(忽略标签部分隐藏网格线的事实;这是我创建模型的意外效果)。

简单甘特图,条形图左侧有资源注释

答案1

此答案使用宏设置了两个新的甘特图元素\newganttchartelement*。它需要一个可选参数和两个强制参数<label>以及时间段。<tss>它的运行方式与\milestone宏相同。newgantchartelement命名的资源可以用来在任务左边设置一个节点来定义对应的资源。tss可以给出一个小于相应任务的 tss 的值 >=1。对于左侧放置的资源,必须在任务之前指定资源。同样的逻辑适用于资源newganttchartelement,不同之处在于它将资源设置在相应任务的右侧。在这种情况下,必须在任务之后指定资源。

关于 OP 关于[inline=false]全局设置 的问题ganttbar,这可能是不可能的。手册在第 2.2 节中说:

由于 pgfgantt 使用 pgfkeys 包进行密钥管理,因此其所有密钥都位于 /pgfgantt/ 路径中。

我对这句话的解释是,inline=true我对这资源资源ganttbar,该设置全局运行,直到通过写入专门重置它ganttbar[inline=false]

结果如下ganttbar[inline=false]

在此处输入图片描述

以下是 MWE,代码中有一些额外的注释:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pdflscape}
\usepackage{pgfgantt}
\pagestyle{empty}

\newganttchartelement*{lresource}{ % The starred version mimics a milestone element with 2 options
    lresource/.style={}, % Don't draw the node
    inline=true,
    lresource inline label node/.style={anchor=east,font=\bfseries\itshape\color{blue}},
    lresource left shift=0ex,
    lresource right shift=0ex
}
\newganttchartelement*{rresource}{
    rresource/.style={},
    inline=true,
    rresource inline label node/.style={anchor=west,font=\bfseries\itshape\color{blue}},
    rresource left shift=0ex,
    rresource right shift=0ex
}

\begin{document}
\begin{landscape}
\begin{ganttchart}[
    hgrid,
    vgrid={draw=none, draw=none, dotted},
    progress=100,
    progress label text={}]%
    {1}{36}
    \gantttitle{Y1}{12} \gantttitle{Y2}{12} \gantttitle{Y3}{12} \\
    \gantttitlelist{1,...,36}{1} \\
    \ganttlresource{resource}{5} % Make the tss value one less than the start of Task 1
    \ganttbar[inline=false]{Task1}{6}{10} \\
    \ganttlresource{resource}{31} % Make the tss value one less than the start of Task 2
    \ganttbar[inline=false]{Task2}{32}{36} \\
    \ganttbar[inline=false]{Task3}{15}{19}
    \ganttrresource{resource}{20} % Make the tss value one more than the end of Task 3
\end{ganttchart}
\end{landscape}
\end{document}

相关内容