使用 tikz 框架突出显示 tabularx 中的多行居中单元格:设置框架的点

使用 tikz 框架突出显示 tabularx 中的多行居中单元格:设置框架的点

因此,我关注了这个例子突出显示 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是表格的名称(使用环境的可选参数), 和ij行数和列数。

唯一的缺点是它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}

在此处输入图片描述

顺便说一句,需要多次编译代码才能获得正确的结果。

相关内容