pgfgantt:如何创建带有“额外”标签的条形图并指定额外标签的位置?

pgfgantt:如何创建带有“额外”标签的条形图并指定额外标签的位置?

基于之前的方法贡萨洛·梅迪纳,我想修改一个简单的甘特图,将项目工作人员的职责添加到所属关系中\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=tmpbar样式,然后用作tmp坐标来完成的。

第一个是最不灵活的。它的作用是测量工人姓名的长度,如果比栏的长度长,则将姓名放在栏的上方。

第二个更灵活,因为它有第二个可选参数,用于指定节点的样式。我还定义了两个附加样式,above barbelow 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}

相关内容