未能将甘特图与表格相结合我现在尝试避免使用甘特图,而是使用表格环境。不过,我喜欢保留甘特图的一些简洁功能。普格夫甘特-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}