![如何在表格行的边缘使用 \noalign 设置 tikzmarks](https://linux22.com/image/275716/%E5%A6%82%E4%BD%95%E5%9C%A8%E8%A1%A8%E6%A0%BC%E8%A1%8C%E7%9A%84%E8%BE%B9%E7%BC%98%E4%BD%BF%E7%94%A8%20%5Cnoalign%20%E8%AE%BE%E7%BD%AE%20tikzmarks.png)
我正在尝试通过在创建行本身后重新绘制行上方的线条来改进带有彩色行的表格中的线条(在某些缩放级别下,彩色行上方的线条可能会在 Adobe Reader 中消失)。我有 p 列,所以我不能在这里使用 David 的解决方案https://tex.stackexchange.com/a/129835/2388。
因此我想使用 tikzmark(或其他标记),但无法弄清楚[1]如何找到正确的边缘。无论我做什么,正确的标记都在页面的右侧:
\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\renewcommand\arrayrulewidth{4pt}
\begin{tabular}{l}
abc \\\noalign{\hrule height \arrayrulewidth}
blub \\\noalign{\pgfmark{testa}\hfill\pgfmark{testb}}
abc\tikz [remember picture] \draw [overlay,->] (pic cs:testa)--(pic cs:testb);
\end{tabular}
\end{document}
有没有办法将标记放在 \noalign 中,以便它们能够像表格框一样适应大小\hrule
?
[1] 我可以自然地通过在某个单元格的右端放置标记来找到边缘,然后计算交点,但这是作弊;-)。
答案1
正如 egreg 所说,但正如你暗示你正在使用colortbl
它已经在单元格下方放置了彩色规则,因此你可以让它在规则的每一端粘贴一个 tikzmark,这样你就知道它在哪里了:
\documentclass[]{article}
\usepackage{colortbl}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\makeatletter
\newcount\U@CT@
\def\CT@@do@color{%
\U@tm
\global\let\CT@do@color\relax
\@tempdima\wd\z@
\advance\@tempdima\@tempdimb
\advance\@tempdima\@tempdimc
\kern-\@tempdimb
\leaders\vrule
%^^A \@height\p@\@depth\p@
\hskip\@tempdima\@plus 1fill
\U@tm
\kern-\@tempdimc
\hskip-\wd\z@ \@plus -1fill }
\def\U@tm{%
\global\advance\U@CT@\@ne
\tikzmark{test\the\U@CT@}}
%
\makeatother
\begin{document}
\renewcommand\arrayrulewidth{4pt}
\begin{tabular}{l}
\rowcolor{yellow}abc \\
blub \\
abc\tikz [remember picture] \draw [overlay,->] (pic cs:test1)--(pic cs:test2);
\end{tabular}
\end{document}
如果您希望箭头的左边缘成为颜色的左边缘而不是单元格内容的左边缘,请将第一个箭头\U@tm
向下移动几行,直到\kern-\@tempdimb
答案2
的内容\noalign
将附加到指定点的封闭垂直列表;封闭的垂直列表是\vbox
,\vtop
或者\vcenter
取决于可选参数tabular
(默认值\vcenter
)。
您\hfill
开始一个段落,它将使用当前的\hsize
,因此您会得到不需要的垂直空间,并且箭头将与一样宽\linewidth
。
\halign
直到将 解包为水平框列表时,封闭框的宽度才为人所知。为了测量它,可以使用技巧\endtabular
在\crcr\egroup
完成之后将 挂钩。\halign
\lastbox
例如,
\def\endtabular{\crcr\egroup\tabularhook\egroup$\egroup}
\newdimen\tabularwidth
\def\tabularhook{%
\setbox0=\lastbox
\global\tabularwidth=\wd0
\nointerlineskip\box0 }
将存储在\tabularwidth
刚刚结束的宽度中tabular
。但对于您的目的来说已经太晚了。
插入一条“幻影线”就可以完成这个工作:
\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\makeatletter
\newcommand{\measureit}[3]{%
\\[-\ht\@arstrutbox]
\multicolumn{#1}{@{}c@{}}{%
\pgfmark{#2}\hfill\pgfmark{#3}}%
\\[-\dp\@arstrutbox]}
\makeatother
\begin{document}
\renewcommand\arrayrulewidth{4pt}
\begin{tabular}{l}
abc \\\noalign{\hrule height \arrayrulewidth}
blub \measureit{1}{testa}{testb}
abc\tikz [remember picture] \draw [overlay,->] (pic cs:testa)--(pic cs:testb);
\end{tabular}%
\begin{tabular}{l}
abc \\\noalign{\hrule height \arrayrulewidth}
blub \\
abc
\end{tabular}
\end{document}
语法不太好,可能需要改进。
答案3
{NiceTabular}
该包的环境nicematrix
创建了与潜在水平和垂直规则的位置相对应的 PGF/Tikz 节点。
在下面的例子中,我们使用这些节点(使用 Tikz)绘制一个带有粗红线的矩形。
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
\begin{NiceTabular}{cccc}
\hline
one & two & three & four \\
\hline
five & six & seven & eight \\
\hline
nine & ten & eleven & twelve \\
\hline
\CodeAfter
\tikz \draw [thick, red] (2-|2) rectangle (3-|4) ;
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。