
Quiero agregar un cuadro en una tabla tabularx que enmarque varias celdas verticalmente. Hay esta publicación que muestra cómo enmarcar celdas horizontalmente (Enmarcar celdas en una tabla), pero no sé cómo hacer para que el cuadro se extienda en varias filas. Esto es lo que me gustaría conseguir aproximadamente (pero con una bonita caja):
Column 1 & Column 2 & Column 3
+-----+
bla & bla & |bla |
| |
bla & bla & |bla |
+-----+
¿Alguna idea de cómo podría hacer eso?
Editar: las soluciones propuestas a continuación son muy buenas. Pero al parecer solo son compatibles con el entorno tabular, y no con tabularx y booktabs. A continuación se muestra el código que he utilizado. ¿Alguien tiene una idea de cómo extender estas soluciones al estilo tabularx? Si no, simplemente reescribiré todas mis tablas usando el estilo tabular simple.
\documentclass{article}
\usepackage{tabularx, booktabs}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[1][]{%
\tikz[overlay,remember picture]{
\draw[black,#1]
($(left)+(-0.5em,2.0ex)$) rectangle
($(right)+(0.75em,-0.75ex)$);}
}
\begin{document}
\begin{table}[H]
\centering
\begin{tabularx}{0.3\textwidth}{Y*{4}{c}}
\toprule
& Masc & Fem & Neut\\
\midrule \cline{4-4}
Nom & hic & haec & \multicolumn{1}{|c|}{hoc} \\
Acc & hunc & hanc & \multicolumn{1}{|c|}{hoc} \\ \cline{4-4}
\bottomrule
\end{tabularx}
\end{table}
\begin{table}[H]
\centering
\begin{tabularx}{0.3\textwidth}{Y*{4}{c}}
\toprule
& Masc & Fem & Neut\\
\midrule
Nom & hic & haec & \tikzmark{left}hoc \\
Acc & hunc & hanc & hoc\tikzmark{right} \\
\bottomrule
\end{tabularx}
\end{table}
\end{document}
Respuesta1
\documentclass{article}
\begin{document}
\begin{tabular}{*6{c}}\hline
Col 1 & Col 2 & Col 3 & Col 4 & Col 5 & Col 6 \\\cline{1-1}
\multicolumn{1}{|c|}{bla} & bla & bla & bla & bla & bla \\
\multicolumn{1}{|c|}{bla} & bla & bla & bla & bla & bla \\
\multicolumn{1}{|c|}{ble} & ble & ble & bla & bla & bla \\ \cline{1-1}
bla & bla & bla & bla & bla & bla \\ \hline
\end{tabular}
\end{document}
Con tabularx
y booktabs
:
\documentclass{article}
\usepackage{tabularx, booktabs}
\begin{document}
\begin{table}[H]
\centering
\begin{tabularx}{0.4\textwidth}{X*{4}{c}} %% 0.3\textwidth too narrow
%% and Y column type not known
\toprule
& Masc & Fem & Neut\\
\midrule \cline{4-4}
Nom & hic & haec & \multicolumn{1}{|c|}{hoc} \\
Acc & hunc & hanc & \multicolumn{1}{|c|}{hoc} \\ \cline{4-4}
\bottomrule
\end{tabularx}
\end{table}
\end{document}
Respuesta2
Siempre existe la tikz
solución. Aquí hay uno que usa básicamente el mismo código de
Resaltar elementos en la matriz.pero con una \DrawBox
macro más flexible. Y como es así, tikz
obtienes toda la flexibilidad adicional que esto conlleva:
Uso:
- Se utiliza
\tikzmark{<name>}
para "marcar" una ubicación particular con<name>
. - Estas ubicaciones con nombre se pasan a las
\DrawMacro
que utilizan estos límites del dibujo. Necesitas una\DrawBox
llamada paracadacuadro que desea dibujar.
Nota:
Esto requiere dos ejecuciones. El primero para determinar las ubicaciones y el segundo para hacer el dibujo.
el
\tikzmark
es deAgregar una llave grande al lado de un cuerpo de texto.
Código:
\documentclass{article}
\usepackage{tikz}
\usepackage{booktabs}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[3][]{%
\tikz[overlay,remember picture]{
\draw[black,#1]
($(#2)+(-0.5em,2.0ex)$) rectangle
($(#3)+(0.75em,-0.75ex)$);}
}
\begin{document}
\begin{tabular}{*{7}{c}}\toprule
Col 1 & Col 2 & Col 3 & Col 4 & Col 5 & Col 6 & Col 7 \\
\cmidrule(lr){2-6}
0 & 1 & \tikzmark{top left 1}abcd & 0 & 0 & 0 & 1 \\
1 & \tikzmark{top left 3}0 & www & 0 & 0 & 0 & 1 \\
0 & 1 & xyz\tikzmark{bottom right 1} & \tikzmark{top left 2}1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0\tikzmark{bottom right 3} & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 0\tikzmark{bottom right 2} \\
0 & 0 & 1 & 0 & 0 & 0 & 0 \\
\bottomrule
\end{tabular}
\DrawBox[ultra thick, red]{top left 1}{bottom right 1}
\DrawBox[ultra thick, blue]{top left 2}{bottom right 2}
\DrawBox[ultra thick, draw=green, dotted, fill=yellow!15, fill opacity=0.3]{top left 3}{bottom right 3}
\end{document}
Respuesta3
En el entorno {NiceTabular}
de nicematrix
, tiene un comando \Block
que puede fusionar celdas pero que también puede usarse para dibujar un marco alrededor de un rectángulo de celdas.
\documentclass{article}
\usepackage{nicematrix}
\begin{document}
\begin{NiceTabular}{ccc}
Column 1 & Column 2 & Column 3 \\
bla & bla & \Block[draw=red,rounded-corners]{2-1}{} bla \\
bla & bla & bla
\end{NiceTabular}
\end{document}
Necesita varias compilaciones (porque nicematrix
utiliza nodos PGF/Tikz bajo el capó).
Si prefiere un marco ajustado al contenido de las celdas, puede hacerlo con Tikz en el \CodeAfter
utilizando los nodos PGF/Tikz creados debajo nicematrix
de las celdas, filas y columnas.
\documentclass{article}
\usepackage{nicematrix,tikz}
\usetikzlibrary{fit}
\begin{document}
\begin{NiceTabular}{ccc}
Column 1 & Column 2 & Column 3 \\
bla & bla & bla \\
bla & bla & bla
\CodeAfter
\tikz \node [draw=red,rounded corners,fit=(2-3)(3-3)] {} ;
\end{NiceTabular}
\end{document}