Цепочка узлов, соединенных макросом join в ячейке таблицы

Цепочка узлов, соединенных макросом join в ячейке таблицы

МВЭ:

\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

  1. tblrнабирает свой контент, по-видимому, по крайней мере три раза (для измерения), прежде чем он будет фактически размещен на странице.
  2. Цепочка начинается за пределами вашего изображения TikZ, поэтому все эти узлы 4×2 считаются частью одной и той же цепи.
  3. 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библиотеку, в которой вы также можете заранее настроить стратегию размещения и подключения. (Хотя я бы указал это как часть \tikzor \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}

Связанный контент