![表格单元格中通过连接宏连接的节点链](https://linux22.com/image/461921/%E8%A1%A8%E6%A0%BC%E5%8D%95%E5%85%83%E6%A0%BC%E4%B8%AD%E9%80%9A%E8%BF%87%E8%BF%9E%E6%8E%A5%E5%AE%8F%E8%BF%9E%E6%8E%A5%E7%9A%84%E8%8A%82%E7%82%B9%E9%93%BE.png)
梅威瑟:
\documentclass{article}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
positioning}
\begin{document}
\tikzset{
node distance = 0mm and 5mm,
start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain, join=by -Straight Barb}
}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[baseline=(N.base)]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\end{document}
如您所见,结果是错误的。是什么产生了第一个箭头?我在 MWE 中遇到了一些错误还是我错过了什么?有人知道解决方法吗?
编辑:tabularx
表中也 得到同样的结果:
\documentclass{article}
\usepackage{tabularx}
\UseTblrLibrary{count}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
chains,
positioning}
\begin{document}
\tikzset{
node distance = 0mm and 5mm,
start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain,join=by -Straight Barb}
}
\begin{tabularx}{\linewidth}{l X}
DE & \tikz[baseline=(N.base), on chain,join=by -Straight Barb]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tabularx}
\end{document}
答案1
tblr
在将其实际放到页面上之前,显然要对其内容进行至少三次排版(为了测量)。- 该链从 TikZ 图片之外开始,因此所有这些 4×2 节点都被视为同一条链的一部分。
- PGF/TikZ 实际上并不检查引用的节点是否是同一张图的一部分。
您最终在页面上看到的“D”节点也不位于(0, 0)
此处,而是位于上一张图片的right
最后一个节点。N
看一下下面的例子。tblr
基本上是做同样的事情,四次相同的图表:
\tikzset{
node distance = 0mm and 5mm,
start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain, join=by -Straight Barb}
}
\tikzset{every picture/.append style={
execute at end picture={
\node[circle, draw, label=$O$] at (0,0) {};
\draw[help lines] (-1.25,0|-N.south west) grid (N.north east);}}}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz[baseline=(N.base)]{
\node[N=red]{D \pgfpictureid\ \tikzchaincount};
\node[N=blue]{E \pgfpictureid\ \tikzchaincount};}
\tikz % this picture doesn't have a node N but it still finds it.
\draw foreach \ang in {0, 15, ..., 359} { (N.\ang) -- ++(\ang:5pt)};
我已经在所有图表中添加了原点和网格,以便您可以更清楚地看到实际发生的情况。
手册中指出start chain
:
此键应该(但不必)作为包含链中所有节点的范围的选项提供。通常,这将是一个
scope
或整个tikzpicture
,但它可能只是一条路径,链中的所有节点都位于该路径上。如果没有链名称chain
给出时,将使用默认值。
这并不太清楚,但暗示了它可能只应该在每张图片的基础上使用。不过,它肯定没有预见到一张图片被排版四次。
无论如何,我建议将其放在图片start chain
上\tikz
或至少放在tblr
单元格中。图片之间的链接实际上没有任何意义。
我添加了一个reset chain
重置给定链(或活动链,如果未指定值)的键,我们可以添加它,every picture
但我不会使用它。(它还缺少检查给定链是否存在的功能。)
代码
\documentclass{article}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, chains, positioning}
\makeatletter
\tikzset{
reset chain/.code=%
\expandafter\gdef\csname tikz@lib@chain@count@#1\endcsname{0},
reset chain/.default=\tikz@lib@current@chain}
\makeatother
\begin{document}
\tikzset{
node distance = 0mm and 5mm,
% start chain = going right,
N/.style = {fill=#1!20, name=N,
inner ysep=4mm, inner xsep=0mm, minimum width=22mm,
on chain, join=by -Straight Barb}
}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[start chain=going right, baseline=(N.base)]{
\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\hrule
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikzset{start chain=going right}
\tikz[baseline=(N.base)]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\hrule
\tikzset{start chain=going right, every picture/.append style=reset chain}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[baseline=(N.base)]{\node[N=red] {D}; \node[N=blue] {E};}
\end{tblr}
\end{document}
输出
您还可以使用该graphs
库,以便预先设置放置和连接策略。(不过,我会将其指定为或的一部分,\tikz
而\graph
不是全局的。)
由于节点D
和E
不通过或相似连接--
,它们被视为兄弟节点,因此branch right sep
不使用grow right sep
。
\documentclass{article}
\usepackage{tabularray}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, graphs}
\begin{document}
\tikzset{
N/.style={
fill=#1!20, inner ysep=4mm, inner xsep=0mm, minimum width=22mm, alias=N}}
\tikzgraphsset{branch right sep=5mm,
every graph/.append style={path, ->, /tikz/>=Straight Barb}}
\begin{tblr}{colspec = {Q[l,m] X[l,m]}}
DE & \tikz[baseline=(N.base)]\graph{D[N=red], E[N=blue]};
\end{tblr}
\end{document}