МВЭ:
\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
or \graph
вместо global.)
Поскольку узлы D
и E
не соединены --
или не похожи, они считаются родственными и, таким образом, branch right sep
используется not 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}