如何创建具有固定宽度单元格的表格并使用 cellcolor 和 multicolumn 创建时间条?或者:如何用 tabular 替代 ganttbar?

如何创建具有固定宽度单元格的表格并使用 cellcolor 和 multicolumn 创建时间条?或者:如何用 tabular 替代 ganttbar?

未能将甘特图与表格相结合我现在尝试避免使用甘特图,而是使用表格环境。不过,我喜欢保留甘特图的一些简洁功能。-package,我遇到了一些问题。

想法

我正在创建一个表格,其中包含一列行名称。然后是 24 列,宽度完全相同。在标题中,我使用两次多列,每列 12 列,以获得2017 年和 2018 年。下面有 8 个多列,每列 3 列,用于模拟宿舍每年。最后,我尝试使用它cellcolor 来获取一种跨越一定数量的月份的时间栏。它应该看起来像这样:

在此处输入图片描述

我包含一个时间条(宏见下文),其中包括 6 个空白月份、12 个灰色填充月份以及 6 个空白月份。

\timebar{title}{6}{12}{6}

第一个问题

由于我的季度宽度都相同,我实际上希望以下 MWE 能够按预期工作。它显示不同的时间栏,月份数相同,但有所偏移。但正如您所见,它很乱。

\documentclass{article}

\usepackage{xcolor}
\usepackage{booktabs,array}
\usepackage[colorlinks=true,linkcolor={black}]{hyperref}

\newcolumntype{C}{>{\centering}m{0.03\textwidth}}

\usepackage{colortbl}
\newcommand{\Year}[1]{  \multicolumn{12}{c|}{#1} }
\newcommand{\Quarter}[1]{\multicolumn{3}{C|}{#1}}
\newcommand{\FourQuarters}{\Quarter{I} & \Quarter{II} & \Quarter{III} & \Quarter{IV} }
\newcommand{\timebar}[4]{ #1 & \multicolumn{ #2 }{c}{} & \multicolumn{#3}{c}{{\cellcolor{black!20!white}}} & \multicolumn{#4}{c|}{}  }

\begin{document}

\section{sectiontitle}\label{sec:sectiontitle}

\begin{table}[h]
\caption{table}
\centering
\begin{tabular}{c | cccccccccccc | cccccccccccc | }
\toprule
\multicolumn{1}{l|}{Title} & \Year{2017} & \Year{2018} \\
\multicolumn{1}{l|}{Subtitle} & \FourQuarters & \FourQuarters \\
\hline
\timebar{A}{1}{12}{11} \\
\timebar{A}{2}{12}{10} \\
\timebar{A}{3}{12}{9} \\
\timebar{A}{4}{12}{8} \\
\timebar{A}{5}{12}{7} \\
\timebar{A}{6}{12}{6} \\
\timebar{A}{7}{12}{5} \\
\timebar{A}{8}{12}{4} \\
\timebar{A}{9}{12}{3} \\
\timebar{A}{10}{12}{2} \\
\timebar{A}{11}{12}{1} \\
\timebar{A}{1}{12}{11} \\
\bottomrule
\end{tabular}
\end{table}

\end{document}

每行的每个条形图应移动一个月,但长度相同。这就是我得到的结果:

在此处输入图片描述

为什么会这样?我该如何解决?


第二个问题

我的计划是模仿 ganttbar 包,它提供了如下栏目:

\ganttbar{Title}{7}{22} %\\ Title, First month, last month

我的新时间栏命令如下:

\timebar{Title}{6}{15}{3} %\\ Title, number months before timebar, 
                          %\\        number months of timebar, 
                          %\\        number months after timebar

为了使时间条实现与甘特图相同的格式,我需要在宏中做一些简单的计算:

\newcommand{\timebar}[4]{ \ref{#1} & \nameref{#1} 
                             & \multicolumn{#2 % should be Startmonth - 1
                             }{c}{}  
                             & \multicolumn{#3 % should be Endmonth - Startmonth
                             }{c}{{\cellcolor{black!20!white}}} 
                             & \multicolumn{#4 % should be Totalmonths - Endmonth + 1
                             }{c|}{}  }

所以从外部来说我想要两个数字参数:

  • #2- 酒吧的第一个月
  • #3- 酒吧的最后一个月

宏内部需要三个参数:

  • #2 - 1- 第一个多列单元格数
  • #3 - #2- 第二个多列的单元格数量
  • 24 - #3 + 1- 第三个多列单元格数

进一步的情况\timebar{A}{0}{12}{12}\timebar{A}{12}{12}{0}不可能发生的,因为对齐标签太多了。有简单的解决方案吗?

我该如何进行这些计算?那么最终我的时间条具有与上面的甘特图相同的参数吗?


参考:甘特图

甘特图如下所示:

\documentclass{scrreprt}

\usepackage[top=25mm, bottom=20mm, left=20mm, right=20mm, foot=20mm]{geometry}
\usepackage{booktabs}

\usepackage{translator}
\usepackage{pgfgantt}

\ganttset{
vgrid = dotted,
hgrid = dotted,
newline shortcut=true,
%
y unit title = 15pt,
title height = 1,
y unit chart = 15pt,
x unit=0.014\textwidth,
%
canvas/.style={
    shape=rectangle, 
    draw=black,
    line width = 0.4pt,
    },
group peaks tip position=0,
group label node/.append style={align=right},
%
bar label node/.append style={align=right},
bar/.append style={fill=gray!20!white},
bar height=0.3,
bar top shift=0.3,
group top shift=0.5,
%
group peaks width=2,
%
milestone left shift=-1,
milestone right shift=2}


\begin{document}
\begin{table}[h]
\setlength{\tabcolsep}{0pt}
\caption{my gantt chartt}
\label{tab:gantt}
\centering
\begin{tabular}{@{}c@{}}
\toprule
\begin{ganttchart}{1}{24}
\gantttitle[]{2017}{12} \gantttitle[]{2018}{12}  \\
\gantttitle{I}{3}\gantttitle{II}{3}\gantttitle{III}{3}\gantttitle{IV}{3}
\gantttitle{I}{3}\gantttitle{II}{3}\gantttitle{III}{3}\gantttitle{IV}{3} \\
\ganttbar{A}{1}{12}\\
\ganttbar{A}{2}{13}\\
\ganttbar{A}{3}{14}\\
\ganttbar{A}{4}{15}\\
\ganttbar{A}{5}{16}\\
\ganttbar{A}{6}{17}\\
\ganttbar{A}{7}{18}\\
\ganttbar{A}{8}{19}\\
\ganttbar{A}{9}{20}\\
\ganttbar{A}{10}{21}\\
\ganttbar{A}{11}{22}\\
\ganttbar{A}{12}{23}\\
\ganttbar{A}{13}{24}
\end{ganttchart}%
\end{tabular}
\end{table}
\end{document}

这应该是最终结果,只是没有使用 ganttbar 包,因为它缺少很多我需要的功能。 在此处输入图片描述

这个问题会尽快得到悬赏。

答案1

更好的版本:

\documentclass{article}

\usepackage{xcolor}
\usepackage{booktabs}
\usepackage[colorlinks=true,linkcolor={black}]{hyperref}

\usepackage{colortbl}
\newcommand{\TotalMonths}{24}
\newcommand{\Year}[1]{  \multicolumn{12}{c|}{#1} }
\newcommand{\Quarter}[1]{\multicolumn{3}{c|}{#1}}
\newcommand{\FourQuarters}{\Quarter{I} & \Quarter{II} & \Quarter{III} & \Quarter{IV} }
\newcommand{\timebar}[3]{%
  \ref{#1} &
  \nameref{#1} & 
  \multicolumn{\the\numexpr#2-1}{c}{} & 
  \multicolumn{\the\numexpr#3-#2}{c}{{\cellcolor{black!20!white}}} 
  & \multicolumn{\the\numexpr\TotalMonths-#3+1}{c|}{}  
}

\begin{document}

\section{sectiontitle}\label{sec:sectiontitle}

\begin{table}[h]
\caption{table}
\centering
\begin{tabular}{cc | *{12}{c} | *{12}{c} | }
\toprule
\multicolumn{2}{l|}{Title} & \Year{2017} & \Year{2018} \\
\multicolumn{2}{l|}{Subtitle} & \FourQuarters & \FourQuarters \\
\hline
\timebar{sec:sectiontitle}{7}{22} \\
\timebar{sec:sectiontitle}{3}{16} \\
\bottomrule
\end{tabular}
\end{table}

\end{document}

答案2

受到一些启发这个答案我想出了以下使用循环的解决方案:

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{booktabs,array,multicol}

\newcommand*\TAB{&}

\long\def\gloop #1\grepeat 
    {\gdef \giterate {#1\expandafter \giterate \grepeat }\giterate  }
\let\grepeat\fi

\newcounter{n}
\newcounter{m}
\newcounter{TotalMonths}

\newlength{\colwidth}
\setlength{\colwidth}{2mm}

\newcommand{\TotalMonths}{24}
\newcommand{\Year}[1]{  \multicolumn{12}{|c|}{#1}}
\newcommand{\Quarter}[1]{\multicolumn{3}{|c|}{#1}}
\newcommand{\FourQuarters}{\Quarter{I} & \Quarter{II} & \Quarter{III} & \Quarter{IV}}

\newcommand{\timebar}[3]{ 
    \setcounter{TotalMonths}{\TotalMonths}%
    \setcounter{n}{1}
    \setcounter{m}{-1}
    \stepcounter{TotalMonths}%
    #1 & B 
    \gloop 
        \stepcounter{n}% 
        \stepcounter{m}% 
        \TAB
            \ifnum #2<\value{n} \ifnum #3>\value{m}%
              {\cellcolor{black!20!white}}\hspace*{\colwidth}%
            \else
              \hspace*{\colwidth}%
            \fi
        \else
            \hspace*{\colwidth}%
        \fi
        \ifnum \value{TotalMonths}>\value{n} 
    \grepeat
}

\begin{document}

\begin{table}[h]
\caption{table}
\centering
\setlength{\tabcolsep}{0pt}
\begin{tabular}{ p{2cm}p{2cm} | *{12}{c}  *{12}{c} | c  }
\toprule
\multicolumn{2}{l}{Title} & \Year{2017} & \Year{2018} \\
\multicolumn{2}{l}{Subtitle} & \FourQuarters & \FourQuarters \\
\hline
\timebar{Hello World}{1}{10} \\
\timebar{Hello World}{2}{11} \\
\timebar{Hello World}{3}{12} \\
\timebar{Hello World}{4}{24} \\
\bottomrule
\end{tabular}
\end{table}

\end{document}

在此处输入图片描述

相关内容