我正在用 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}