
Quero adicionar uma caixa em uma tabela tabularx que enquadre várias células verticalmente. Existe este post que mostra como enquadrar células horizontalmente (Enquadrando células em uma tabela), mas não consigo descobrir como fazer para que a caixa se estenda por várias linhas. Aqui está o que eu gostaria de receber (mas com uma bela caixa):
Column 1 & Column 2 & Column 3
+-----+
bla & bla & |bla |
| |
bla & bla & |bla |
+-----+
Alguma ideia de como eu poderia fazer isso?
Editar: as soluções propostas abaixo são muito boas. Mas eles são compatíveis apenas com o ambiente tabular, ao que parece, e não com tabularx e booktabs. Abaixo está o código que usei. Alguém tem ideia de como estender essas soluções para o estilo tabularx? Caso contrário, simplesmente reescreverei todas as minhas tabelas usando o estilo tabular simples.
\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}
Responder1
\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}
Com tabularx
e 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}
Responder2
Sempre existe a tikz
solução. Aqui está um que usa basicamente o mesmo código de
Destacar elementos na matrizmas com uma \DrawBox
macro mais flexível. E como tikz
você obtém toda a flexibilidade adicional que vem com isso:
Uso:
- Você usa
\tikzmark{<name>}
para "marcar" um local específico com<name>
. - Esses locais nomeados são passados para o
\DrawMacro
qual os utiliza como limite do desenho. Você precisa de uma\DrawBox
ligação paracadacaixa que você deseja desenhar.
Observação:
Isso requer duas execuções. O primeiro para determinar os locais e o segundo para fazer o desenho.
O
\tikzmark
é deAdicionando uma chave grande ao lado do corpo do 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}
Responder3
No ambiente {NiceTabular}
de nicematrix
, você tem um comando \Block
que pode mesclar células, mas que também pode ser usado para desenhar uma moldura em torno de um retângulo de células.
\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}
Você precisa de várias compilações (porque nicematrix
usa nós PGF/Tikz nos bastidores).
Se preferir um quadro ajustado ao conteúdo das células, você pode fazer isso com o Tikz no \CodeAfter
usando os nós PGF/Tikz criados por nicematrix
sob as células, linhas e colunas.
\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}