[Tex/LaTex] Table with rounded corners

tablestikz-pgf

I've taken an example of a very cool table from here and I've made some changes to suit my needs, the problem is that the table it's not correctly rounded:
enter image description here

Unfortunately it doesn't seem to exist a rectagle element when you can only round some corners.
Here's MWE:

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[top=2.5cm, bottom=4cm, inner=2.5cm, outer=3.5cm]{geometry}

\usepackage{times}
\renewcommand{\rmdefault}{phv} % Arial
\renewcommand{\sfdefault}{phv} % Arial
\usepackage[T1]{fontenc}
\usepackage{textcomp} % necesario para el símbolo €

\usepackage[usenames,dvipsnames]{xcolor}
\usepackage[pdftex]{graphicx}
\usepackage{caption,subcaption}
\setlength\textfloatsep{1.7\baselineskip plus 0.2\baselineskip minus 0.5\baselineskip}
\setlength\intextsep{2\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip}

\usepackage{environ} %lo usaré para crear el environ de tabla colorida

\usepackage{tabularx}
\usepackage{booktabs} % Contiene el comando \midrule
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{patterns}
\usetikzlibrary{backgrounds,fit,calc}
\usetikzlibrary{%
   decorations.fractals%
  ,decorations.pathmorphing%
  ,shadows%
}
\usetikzlibrary{decorations.pathmorphing}
\usetikzlibrary{decorations.text}
\usetikzlibrary{decorations.shapes} %para curvar texto
\usetikzlibrary{shapes,positioning} %para los flow charts
\usetikzlibrary{shapes,arrows,chains}
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\usetikzlibrary{intersections}



\colorlet{TablaBordeSuperior}{BurntOrange} %\definecolor{TablaBordeSuperior}{cmyk}{0,0.51,1,0} % BurntOrange
\colorlet{TablaBordeInferior}{Bittersweet} %\definecolor{TablaBordeInferior}{cmyk}{0,0.75,1,0.24} % Bittersweet
\colorlet{TablaCentroSuperior}{blue!1}
\colorlet{TablaCentroInferior}{blue!20}
\colorlet{FuenteCabeceraTabla}{white}
\newcommand{\fuentecabecera}[1]{\textcolor{FuenteCabeceraTabla}{\textbf{#1}}}

\newcommand{\encabezadoUnaLineaSuperior}{0.8}
\newcommand{\encabezadoUnaLineaInferior}{0.8}
\newcommand{\espaciadoCabeceraCuerpoUnaLinea}{0.5em}
\newcommand{\encabezadoDosLineasSuperior}{1.3}
\newcommand{\encabezadoDosLineasInferior}{1.2}
%\newcommand{\espaciadoCabeceraCuerpoDosLineas}{1.5em} %hay que aumentar el valor de 0.5 a 1.5 puesto que la cabecera ocupa dos líneas
\newcommand{\espaciadoCabeceraCuerpoDosLineas}{2em}
\newcommand{\encabezadoTresLineasSuperior}{1.8}
\newcommand{\encabezadoTresLineasInferior}{1.8}
\newcommand{\espaciadoCabeceraCuerpoTresLineas}{0.5em}
\newcommand{\encabezadoSuperior}{\encabezadoUnaLineaSuperior} %por defecto una línea
\newcommand{\encabezadoInferior}{\encabezadoUnaLineaInferior} %por defecto una línea
\newcommand{\espaciadoCabeceraCuerpo}{\espaciadoCabeceraCuerpoUnaLinea} %por defecto el de una línea

\newcommand{\encabezadoUnaLinea}{
    \renewcommand{\encabezadoSuperior}{\encabezadoUnaLineaSuperior}
    \renewcommand{\encabezadoInferior}{\encabezadoUnaLineaInferior}
    \renewcommand{\espaciadoCabeceraCuerpo}{\espaciadoCabeceraCuerpoUnaLinea}}
\newcommand{\encabezadoDosLineas}{
    \renewcommand{\encabezadoSuperior}{\encabezadoDosLineasSuperior}
    \renewcommand{\encabezadoUnaLineaInferior}{\encabezadoDosLineasInferior}
    \renewcommand{\espaciadoCabeceraCuerpo}{\espaciadoCabeceraCuerpoDosLineas}}
\newcommand{\encabezadoTresLineas}{
    \renewcommand{\encabezadoSuperior}{\encabezadoTresLineasSuperior}
    \renewcommand{\encabezadoUnaLineaInferior}{\encabezadoTresLineasInferior}
    \renewcommand{\espaciadoCabeceraCuerpo}{\espaciadoCabeceraCuerpoTresLineas}}
%estos tres últimos comandos gestionan si el encabezado será de una línea, de dos o de tres

\newif\iflineaResaltado
\lineaResaltadofalse
\newcommand{\pieInferiorUno}{-5.2}
\newcommand{\pieInferiorDos}{3.45}
\newcommand{\resaltarPie}[2]{\lineaResaltadotrue\renewcommand{\pieInferiorUno}{#1}\renewcommand{\pieInferiorDos}{#2}}

\NewEnviron{tablacolorida}[2]{%
%  \vspace*{-2em}
    \begin{center}
        \captionsetup{type=table} %para que no me de error el posterior comando \captionof
        \begin{tikzpicture}
            \node (tbl) {

            \BODY

            };
            \begin{pgfonlayer}{background}
                \draw[rounded corners,top color=TablaBordeSuperior,bottom color=TablaBordeInferior, draw=white] ($(tbl.north west)+(0.14,0)$)
                    rectangle ($(tbl.north east)-(0.13,\encabezadoSuperior)$); %el top color indica el color principal de la línea de cabecera %para tener encabezado de dos líneas (0.13,1.3)
                \draw[rounded corners,top color=white,bottom color=TablaBordeInferior,
                    middle color=TablaBordeSuperior,draw=white!20] ($(tbl.south west)
                    +(0.13,0.5)$) rectangle ($(tbl.south east)-(0.13,0)$);
                \draw[top color=TablaCentroSuperior,bottom color=TablaCentroInferior,draw=white] %el top color indica el color de inicio de las filas del medio, el "white" hace que el borde externo de las filas no se pinte
                    ($(tbl.north east)-(0.13,\encabezadoInferior)$) %con el parámetro 0.8 controlamos la altura de la línea de cabecera  %para tener encabezado de dos líneas (0.13,1.2)
                    rectangle ($(tbl.south west)+(0.13,0.2)$); %el 0.2 controla el grosor de la línea decorativa inferior

                \iflineaResaltado
                \draw[top color=TablaBordeSuperior,bottom color=TablaBordeSuperior, draw=white] ($(0,\pieInferiorUno)+(7.5,2)$)
                    rectangle ($(-0.5,1)-(7,\pieInferiorDos)$); 
                % ($(0,-4.8)+(7.5,2)$) ($(-0.5,1)-(7,3.1)$)
                % ($(0,-5.2)+(7.5,2)$) ($(-0.5,1)-(7,3.45)$) %una fila más abajo
                \fi
            \end{pgfonlayer}
        \end{tikzpicture}
        \captionof{table}{#1} \label{tab:#2} 
    \end{center}
    %\vspace*{-1em}
}

\begin{document}

\begin{tablacolorida}{Hitos del proyecto}{hitosProyecto}
    \begin{tabularx}{1\textwidth}{m{0.10\linewidth} m{0.34\linewidth} m{0.48\linewidth}}
        \arrayrulecolor{purple}
        \centering\fuentecabecera{Hito} & \centering\fuentecabecera{Fecha} & \centering\arraybackslash\raisebox{-0.3em}{\fuentecabecera{Descripción}} \\[+\espaciadoCabeceraCuerpo]
        \centering\textbf{H1} & \centering Mes 0 & \centering\arraybackslash Comienzo del proyecto \\ \midrule
        \centering\textbf{H2} & \centering 2 meses y 3 semanas & \centering\arraybackslash Fin del estudio del arte \\ \midrule
        \centering\textbf{H3}  & \centering 6 meses y 1 semana & \centering\arraybackslash Finalización de la plataforma de virtualización \\ \midrule
        \centering\textbf{H4}  & \centering 9 meses & \centering\arraybackslash Finalización de lo concerniente a DTN \\ \midrule
        \centering\textbf{H5}  & \centering 10 meses y 1 semana & \centering\arraybackslash Finalización de lo concerniente a CDN \\ \midrule
        \centering\textbf{H6}  & \centering 12 meses & \centering\arraybackslash Fin del Proyecto Fin de Carrera (PFC) \\[0.5ex]
    \end{tabularx}
\end{tablacolorida}

\resaltarPie{-9.7}{7.95}
\newcounter{paqueteTrabajo}
\newcounter{tarea}
\setcounter{paqueteTrabajo}{-1}
\newcommand{\filaRHpt}[7]{\addtocounter{paqueteTrabajo}{1}\setcounter{tarea}{1}\centering \bfseries{PT.\arabic{paqueteTrabajo}.}   & \centering \bfseries{#1} & \centering \bfseries{#2} €  & \centering \bfseries{#3} & \centering \bfseries{#4 €}  & \centering \bfseries{#5} & \centering \bfseries{#6 €} & \centering\arraybackslash \bfseries{#7 €} \\ \midrule}
\newcommand{\filaRHt}[7]{\centering T.\arabic{paqueteTrabajo}\arabic{tarea}.   & \centering #1 & \centering #2 €  & \centering #3 & \centering #4 €  & \centering #5 & \centering #6 € & \centering\arraybackslash #7 € \\ \midrule\addtocounter{tarea}{1}}
\newcommand{\filaRHTOTAL}[7]{\centering \fuentecabecera{Total}   & \centering \fuentecabecera{#1} & \centering \fuentecabecera{#2 €} & \centering \fuentecabecera{#3} & \centering \fuentecabecera{#4 €}  & \centering \fuentecabecera{#5} & \centering \fuentecabecera{#6 €} & \centering\arraybackslash \raisebox{-0.15em}{\fuentecabecera{#7 €}} \\}
\encabezadoTresLineas
\begin{tablacolorida}{Presupuesto de recursos humanos}{presupuestoRH}
    \begin{tabularx}{1\textwidth}{m{0.08\linewidth} m{0.08\linewidth} m{0.11\linewidth} m{0.08\linewidth} m{0.11\linewidth} m{0.08\linewidth} m{0.11\linewidth} m{0.11\linewidth}}
        \arrayrulecolor{purple}
        \centering\fuentecabecera{\underline{Tarea}} & \multicolumn{7}{c}{\fuentecabecera{\underline{Recurso}}} \\ %[+\espaciadoCabeceraCuerpo]
        & \multicolumn{2}{c}{\fuentecabecera{FL}} & \multicolumn{2}{c}{\fuentecabecera{JMC}} & \multicolumn{2}{c}{\fuentecabecera{AM}} & \centering\arraybackslash\fuentecabecera{Coste} \\
        & \centering\fuentecabecera{CT}  & \centering\fuentecabecera{Coste} & \centering\fuentecabecera{CT}  & \centering\fuentecabecera{Coste} & \centering\fuentecabecera{CT}  & \centering\fuentecabecera{Coste} & \\ [+\espaciadoCabeceraCuerpo] %Para añadir un último elemento sería \centering\arraybackslash\raisebox{-0.25em}{\fuentecabecera{Total}} 
        \filaRHpt{7}{0}{0}{0}{312}{0}{0} %PRIMER PAQUETE DE TRABAJO
        \filaRHt{2}{0}{0}{0}{120}{0}{0}
        \filaRHt{1}{0}{0}{0}{72}{0}{0}
        \filaRHt{2}{0}{0}{0}{88}{0}{0}
        \filaRHt{2}{0}{0}{0}{32}{0}{0}
        \filaRHpt{8}{480}{1}{60}{408}{14688}{15228} %SEGUNDO PAQUETE DE TRABAJO
        \filaRHt{1}{60}{0}{0}{88}{3168}{3228}
        \filaRHt{1}{60}{0}{0}{72}{2592}{2652}
        \filaRHt{3}{180}{0}{0}{88}{3168}{3348}
        \filaRHt{3}{180}{1}{60}{160}{5760}{6000}
        \filaRHpt{9}{540}{2}{120}{336}{12096}{12756} %TERCER PAQUETE DE TRABAJO
        \filaRHt{2}{120}{0}{0}{72}{2592}{2712}
        \filaRHt{2}{120}{0}{0}{88}{3168}{3288}
        \filaRHt{1}{60}{0}{0}{88}{3168}{3228}
        \filaRHt{4}{240}{2}{120}{88}{3168}{3528}
        \filaRHpt{26}{1560}{1}{60}{192}{6912}{8532} %CUARTO PAQUETE DE TRABAJO
        \filaRHt{24}{1440}{0}{0}{160}{5760}{7200}
        \filaRHt{2}{120}{1}{60}{32}{1152}{1332}
        \filaRHTOTAL{50}{2580}{4}{240}{1248}{33696}{36516}[0.5ex] 
    \end{tabularx}
\end{tablacolorida}
\encabezadoUnaLinea

\end{document}

Best Answer

One possibility using tcolorbox and its built-in interaction with tabularx:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage[most]{tcolorbox}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{times}

\renewcommand\rmdefault{phv} % Arial
\renewcommand\sfdefault{phv} % Arial

\colorlet{TablaBordeSuperior}{BurntOrange}
\colorlet{TablaBordeInferior}{Bittersweet}
\colorlet{TablaCentroSuperior}{blue!1}
\colorlet{TablaCentroInferior}{blue!20}
\colorlet{FuenteCabeceraTabla}{white}

\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}

\tcbset{rtab/.style={
freelance,
frame code={
  \path[top color=BurntOrange,bottom color=Bittersweet] 
    ([yshift=-#1*(\baselineskip+2pt)]interior.north west) --
    ([yshift=-#1*(\baselineskip+2pt)]interior.north east) {[rounded corners]--
    ([yshift=3pt]interior.north east) --
    ([yshift=3pt]interior.north west)} -- cycle;
  \path[top color=TablaCentroSuperior,bottom color=TablaCentroInferior] 
    ([yshift=-#1*(\baselineskip+2pt)]interior.north west) --
    ([yshift=-#1*(\baselineskip+2pt)]interior.north east) --
    (interior.south east) --
    (interior.south west) -- cycle;
  \path[top color=TablaBordeInferior,bottom color=TablaBordeSuperior] 
    (interior.south west) --
    (interior.south east) {[rounded corners]--
    ([yshift=-5pt]interior.south east) --
    ([yshift=-5pt]interior.south west)} -- cycle;
  },
interior code={},
 }
}

\newcommand\fuentecabecera[1]{\textcolor{FuenteCabeceraTabla}{\textbf{#1}}}

\begin{document}

\begin{tcolorbox}[
  rtab=1,
  tabularx*={\arrayrulecolor{purple}}%
    {>{\bfseries}M{0.10\linewidth} M{0.33\linewidth}M{0.46\linewidth}}
]
\fuentecabecera{Hito} & \fuentecabecera{Fecha} & \fuentecabecera{Descripción} \\
\\[-1.7ex]
H1 &  Mes 0 & Comienzo del proyecto \\ 
\midrule
H2 & 2 meses y 3 semanas & Fin del estudio del arte \\ 
\midrule
H3 & 6 meses y 1 semana & Finalización de la plataforma de virtualización \\ 
\midrule
H4 & 9 meses & Finalización de lo concerniente a DTN \\ 
\midrule
H5 & 10 meses y 1 semana & Finalización de lo concerniente a CDN \\ 
\midrule
H6 & 12 meses & Fin del Proyecto Fin de Carrera (PFC) \\ 
\end{tcolorbox}

\vspace{1cm}% just for the example

\begin{tcolorbox}[
  rtab=2,
  tabularx*={\arrayrulecolor{purple}}%
    {>{\bfseries}M{0.10\linewidth} M{0.33\linewidth}M{0.46\linewidth}}
]
\fuentecabecera{Lin1} & \fuentecabecera{Lin1} & \fuentecabecera{Lin1} \\
\fuentecabecera{Lin2} & \fuentecabecera{Lin2} & \fuentecabecera{Lin2} \\
\\[-1.7ex]
H1 &  Mes 0 & Comienzo del proyecto \\ 
\midrule
H2 & 2 meses y 3 semanas & Fin del estudio del arte \\ 
\midrule
H3 & 6 meses y 1 semana & Finalización de la plataforma de virtualización \\ 
\midrule
H4 & 9 meses & Finalización de lo concerniente a DTN \\ 
\midrule
H5 & 10 meses y 1 semana & Finalización de lo concerniente a CDN \\ 
\midrule
H6 & 12 meses & Fin del Proyecto Fin de Carrera (PFC) \\ 
\end{tcolorbox}

\end{document}

enter image description here

The argument for the rtab style is used to control the number of lines that the table header will have.

In comments, it has been requested to have the possibility to provide a caption and label for the tables; here's one possibility:

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage[most]{tcolorbox}
\usepackage{tabularx}
\usepackage{booktabs}
\usepackage{environ}
\usepackage{times}

\renewcommand\rmdefault{phv} % Arial
\renewcommand\sfdefault{phv} % Arial

\colorlet{TablaBordeSuperior}{BurntOrange}
\colorlet{TablaBordeInferior}{Bittersweet}
\colorlet{TablaCentroSuperior}{blue!1}
\colorlet{TablaCentroInferior}{blue!20}
\colorlet{FuenteCabeceraTabla}{white}

\newcolumntype{M}[1]{>{\centering\arraybackslash}m{#1}}

\tcbset{rtab/.style={
freelance,
frame code={
  \path[top color=BurntOrange,bottom color=Bittersweet] 
    ([yshift=-#1*(\baselineskip+2pt)]interior.north west) --
    ([yshift=-#1*(\baselineskip+2pt)]interior.north east) {[rounded corners]--
    ([yshift=3pt]interior.north east) --
    ([yshift=3pt]interior.north west)} -- cycle;
  \path[top color=TablaCentroSuperior,bottom color=TablaCentroInferior] 
    ([yshift=-#1*(\baselineskip+2pt)]interior.north west) --
    ([yshift=-#1*(\baselineskip+2pt)]interior.north east) --
    (interior.south east) --
    (interior.south west) -- cycle;
  \path[top color=TablaBordeInferior,bottom color=TablaBordeSuperior] 
    (interior.south west) --
    (interior.south east) {[rounded corners]--
    ([yshift=-5pt]interior.south east) --
    ([yshift=-5pt]interior.south west)} -- cycle;
  },
interior code={},
 }
}

\newcommand\fuentecabecera[1]{\textcolor{FuenteCabeceraTabla}{\textbf{#1}}}

\NewEnviron{RCtable}[4][htbp]
  {%
    \begin{table}[#1]
    \begin{tcolorbox}[#2]\BODY\end{tcolorbox}%
    \caption{#3}
    \label{tab:#4}
    \end{table}
  }

\begin{document}

Como vemos en los cuadros~\ref{tab:pruebaa} y ~\ref{tab:pruebab}...
\begin{RCtable}{
  rtab=1,
  tabularx*={\arrayrulecolor{purple}}%
    {>{\bfseries}M{0.10\linewidth} M{0.33\linewidth}M{0.46\linewidth}}
}{Primer cuadro de prueba}{pruebaa}
\fuentecabecera{Hito} & \fuentecabecera{Fecha} & \fuentecabecera{Descripción} \\
\\[-1.7ex]
H1 &  Mes 0 & Comienzo del proyecto \\ 
\midrule
H2 & 2 meses y 3 semanas & Fin del estudio del arte \\ 
\midrule
H3 & 6 meses y 1 semana & Finalización de la plataforma de virtualización \\ 
\midrule
H4 & 9 meses & Finalización de lo concerniente a DTN \\ 
\midrule
H5 & 10 meses y 1 semana & Finalización de lo concerniente a CDN \\ 
\midrule
H6 & 12 meses & Fin del Proyecto Fin de Carrera (PFC) \\ 
\end{RCtable}


\begin{RCtable}{
  rtab=2,
  tabularx*={\arrayrulecolor{purple}}%
    {>{\bfseries}M{0.10\linewidth} M{0.33\linewidth}M{0.46\linewidth}}
}{Segundo cuadro de prueba}{pruebab}
\fuentecabecera{Lin1} & \fuentecabecera{Lin1} & \fuentecabecera{Lin1} \\
\fuentecabecera{Lin2} & \fuentecabecera{Lin2} & \fuentecabecera{Lin2} \\
\\[-1.7ex]
H1 &  Mes 0 & Comienzo del proyecto \\ 
\midrule
H2 & 2 meses y 3 semanas & Fin del estudio del arte \\ 
\midrule
H3 & 6 meses y 1 semana & Finalización de la plataforma de virtualización \\ 
\midrule
H6 & 12 meses & Fin del Proyecto Fin de Carrera (PFC) \\ 
\end{RCtable}

\end{document}

enter image description here

The RCtable environment has one optional argument that can be used to specify the placement options (similar to the optional argument of the standard table environment), and three mandatory arguments: the first one, used for the options that build the table from the tcolorbox, the second one for the caption, and the third one to build the label (the label will have the form tab:text, where text is the string used in the third mandatory argument for RCtable.)