基于之前的方法贡萨洛·梅迪纳,我想修改一个简单的甘特图,将项目工作人员的职责添加到所属关系中\ganttbar
。
当前状态截图:
挑战
根据插入文本的长度,该栏可能看起来非常丑陋(例如“Sandra、Michael、Thomas”的情况)。现在我的想法是提供额外的定位选项来指定这些“额外标签”在其所属栏上方或下方的位置。
由于progress
常规条形图有可用的 -option,因此将所有选项组合在一个命令中会非常好。理想的结果可能是这样的:
\textganttbar[progress=00, name=test1]{Text in outside label}{Text in bar}{3}{8}
我怎么会有这样的行为?
不同的选择奎伯比尔贝尔不幸的是,它没有提供必要的与progress
标签无关的独立性。
最小工作示例(MWE):
\documentclass{standalone}
\usepackage{pgfgantt}
\newcommand\textganttbar[4]{%
\ganttbar{#1}{#3}{#4}
\ganttbar[inline,bar label font=\footnotesize]
{#2}{#3}{#4}
}
\begin{document}
\begin{ganttchart}{1}{12}
\gantttitle{2011}{12} \\
\gantttitlelist{1,...,12}{1} \\
\textganttbar{Task 1}{Lisa, Harry}{1}{5} \\
\textganttbar{Task 2}{Jenny, George}{2}{6} \\
\textganttbar{Task 3}{Lindy, Rob}{8}{12}\\
\textganttbar{Task 4}{Sandra, Michael, Thomas}{7}{10}\\
\ganttbar[progress=40]{Task 4}{3}{8}\\
% Dream solution:
% \textganttbar[progress=00, name=element1]{Task 4}{Worker names}{3}{8}
\end{ganttchart}
\end{document}
答案1
以下是 的两种可能定义\textganttbar
。在这两种情况下,名称都是在节点而不是栏中设置的inline
。并且在这两种情况下,(第一个)可选参数都转到\ganttbar
,因此您可以progress=X,name=Y
照常使用。不过,我不能说节点的放置做得非常优雅。它是通过附加alias=tmp
到bar
样式,然后用作tmp
坐标来完成的。
第一个是最不灵活的。它的作用是测量工人姓名的长度,如果比栏的长度长,则将姓名放在栏的上方。
第二个更灵活,因为它有第二个可选参数,用于指定节点的样式。我还定义了两个附加样式,above bar
和below bar
,旨在完全按照它们的名称执行操作。它们利用了alias
对条形的定义。
\documentclass{standalone}
\usepackage{pgfgantt}
\usepackage{xparse}
\newcommand\textganttbar[5][]{%
\ganttbar[#1,bar/.append style={alias=tmp}]{#2}{#4}{#5}
\path
let
\p1=(tmp.west),\p2=(tmp.east),
\n1={\x2-\x1},\n2={width("#3")},
\n3={ifthenelse(\n1>\n2,90,270)}
in
node [anchor=\n3,font=\footnotesize] at (tmp.north) {#3};
}
\NewDocumentCommand\textganttbarB{O{} O{} mmmm}{%
\ganttbar[#1,bar/.append style={alias=tmp}]{#3}{#5}{#6}
\node [font=\footnotesize,at={(tmp)},#2] {#4};
}
\tikzset{
above bar/.style={
at={(tmp.north)},anchor=south
},
below bar/.style={
at={(tmp.south)},anchor=north
}
}
\begin{document}
\begin{ganttchart}{1}{12}
\gantttitle{2011}{12} \\
\gantttitlelist{1,...,12}{1} \\
% if you only supply one optional argument to \textganttbarB, that goes to
% the \ganttbar. Hence, if you only want to pass arguments to the node,
% you need an empty set of brackets
\textganttbarB[][above bar,blue,fill=red]{Task 1}{Lisa, Harry}{1}{5} \\
\textganttbarB[name=t2,progress=50]{Task 2}{Jenny, George}{2}{6} \\
\textganttbar[name=t3]{Task 3}{Lindy, Rob}{8}{12}\\
\textganttbar[progress=20]{Task 4}{Sandra, Michael, Thomas}{7}{10}\\
\ganttbar[progress=40]{Task 4}{3}{8}\\
\end{ganttchart}
\end{document}