因此,我关注了这个例子突出显示 tabularx 表中的单元格。这对于单个“项目”单元格非常有效,并且对于某些\hfill
不规则多行单元格也非常有效。
但是,对于多行居中单元格,这种方法根本不起作用,因为参考点是由第一个单词和最后一个单词设置的,从而绘制了一个贯穿文本的框架:
一些换行符的玩弄产生了这个结果,这是可以的,但是“完整”的行并不是很好:
那么,我该如何改进呢?我尝试获取单元格范围(或至少\TX@col@width
,但对我来说不起作用);\hphantom
名义上应该可以做我想要的事情,但我认为它在表格中实际上不起作用。
MWE(换行符/hfill注释给出了“ok”的解决方案。:
\documentclass{standalone}
\usepackage{tabularx}
\usepackage{multirow}
\usepackage{tikz}
\usetikzlibrary{fit}
\usetikzlibrary{shapes}
\newcommand{\tabxmulticol}[3]
{\multicolumn{#1}
{>{\centering\hsize=\dimexpr#1\hsize+#1\tabcolsep+\arrayrulewidth\relax}#2}
{#3}}
\newcommand\marktopleft[1]{%
\tikz[overlay,remember picture]%
\coordinate (marker-#1-a) at (0,1.5ex) {};%
\hspace*{\fill}\newline%
}
\newcommand\markbottomright[1]{%
\newline \hspace*{\fill}
\pgfsetcornersarced{\pgfpoint{3mm}{3mm}}
\tikz[overlay,remember picture]
\coordinate (marker-#1-b) at (0,-0.5ex) {};%
\tikz[overlay,remember picture,thick,dashed,inner sep=0pt]
\node[draw,rectangle,fit=(marker-#1-a.center) (marker-#1-b.center)] {};%
}
\begin{document}
\renewcommand{\tabularxcolumn}[1]{>{\centering\arraybackslash}m{#1}}
\begin{tabularx}{\textwidth}{p{0.24\textwidth}XX}
First row & & \marktopleft{cella} bla bla bla bla bla bla bla bla bla \markbottomright{cella} \\
Second row & 2a & \\
Third row & & 3b \\
Fourth row & \tabxmulticol{2}{X}{\marktopleft{cellb} he he he he he he he he he he he he he he he he he he he he he he he he he he he he \markbottomright{cellb}} \\
\end{tabularx}
\end{document}
答案1
使用该包就可以实现您想要的目标nicematrix
。
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
\begin{NiceTabularX}{\textwidth}{p{0.24\textwidth}X[c]X[c]}[name=MyTbl]
\RowStyle[cell-space-limits=3mm]{}
First row & & bla bla bla bla bla bla bla bla bla \\
Second row & 2a & \\
Third row & & 3b \\
\RowStyle[cell-space-limits=3mm]{}
Fourth row & \Block{1-2}{\parbox{8.5cm}{\centering he he he he he he he he he he he he he he he he he he he he he he he he he he he he}} &\\
\CodeAfter
\tikz \node[draw, dashed, rounded corners, inner ysep=-1mm,rectangle, fit=(MyTbl-1-3)] {};
\tikz \node[draw, dashed, rounded corners, inner ysep=-1 mm,rectangle, fit=(MyTbl-4-3) (MyTbl-4-2)] {};
\end{NiceTabularX}
\end{document}
nicematrix
将表格的每个单元格与一个 tikz 节点关联,并且可以将这些节点与 tikz 一起使用。这让您更容易实现目标。可以使用名称访问节点,name-i-j
其中name
是表格的名称(使用环境的可选参数), 和i
是j
行数和列数。
唯一的缺点是它nicematrix
还不支持在多单元格块中自动换行。因此,要实现这一点,需要parbox
在块中插入。
编辑:
如果每行周围增加更多空间,我认为看起来会更好。
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
{\NiceMatrixOptions{cell-space-limits = 2mm}
\begin{NiceTabularX}{\textwidth}{p{0.24\textwidth}X[c]X[c]}[name=MyTbl2]
% \RowStyle[cell-space-limits=3mm]{}
First row & & bla bla bla bla bla bla bla bla bla \\
Second row & 2a & \\
Third row & & 3b \\
% \RowStyle[cell-space-limits=3mm]{}
Fourth row & \Block{1-2}{\parbox{8.5cm}{\centering he he he he he he he he he he he he he he he he he he he he he he he he he he he he}} &\\
\CodeAfter
\tikz \node[draw, dashed, rounded corners, inner ysep=0mm, rectangle, fit=(MyTbl2-1-3)] {};
\tikz \node[draw, dashed, rounded corners, inner ysep=0mm, rectangle, fit=(MyTbl2-4-3) (MyTbl2-4-2)] {};
\end{NiceTabularX}
}
\end{document}
顺便说一句,需要多次编译代码才能获得正确的结果。