Kette von Knoten, die durch Join-Makro in Tabellenzelle verbunden sind

Kette von Knoten, die durch Join-Makro in Tabellenzelle verbunden sind

MWE:

\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}

Bildbeschreibung hier eingeben

Wie Sie sehen, ist das Ergebnis falsch. Was erzeugt den ersten Pfeil? Habe ich einen Fehler in MWE oder übersehe ich etwas? Kennt jemand eine Problemumgehung?

Bearbeiten: Das gleiche Ergebnis ergibt sich tabularxauch aus der Tabelle:

\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}

Antwort1

  1. tblrsetzt seinen Inhalt offenbar mindestens dreimal (zur Messung), bevor er tatsächlich auf die Seite gesetzt wird.
  2. Die Kette beginnt außerhalb Ihres TikZ-Bildes, daher werden alle diese 4 × 2-Knoten als Teil ein und derselben Kette betrachtet.
  3. PGF/TikZ prüft nicht wirklich, ob ein referenzierter Knoten Teil desselben Bildes ist.

Der „D“-Knoten, den Sie schließlich auf der Seite sehen, ist (0, 0)auch nicht hier platziert, sondern rightam letzten NKnoten des vorherigen Bildes.

Schauen Sie sich das folgende Beispiel an. tblrEs macht im Grunde dasselbe, nur viermal dasselbe Diagramm:

\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)};

Das gibt:
Bildbeschreibung hier eingeben

Ich habe allen Diagrammen den Ursprung und ein Raster hinzugefügt, damit Sie klarer erkennen können, was tatsächlich passiert.

Im Handbuch steht dazu start chain:

Dieser Schlüssel sollte, muss aber nicht, als Option für einen Bereich angegeben werden, der alle Knoten der Kette umfasst. Normalerweise ist dies ein scopeoder das Ganze tikzpicture, aber es kann auch nur ein Pfad sein, auf dem alle Knoten der Kette gefunden werden. Wenn keinKettennamechainangegeben ist, wird stattdessen der Standardwert verwendet.

Das ist zwar nicht ganz klar, deutet aber darauf hin, dass es vielleicht nur für einzelne Bilder verwendet werden sollte. Allerdings war es sicher nicht dafür gedacht, dass ein Bild viermal gesetzt wird.

Ich würde aber trotzdem empfehlen, es start chainauf das \tikzBild oder zumindest in die tblrZelle zu setzen. Eine Kette zwischen den Bildern macht eh nicht wirklich Sinn.

Ich habe einen reset chainSchlüssel hinzugefügt, der die angegebene Kette (oder die aktive Kette, wenn kein Wert angegeben ist) zurücksetzt. Wir könnten ihn ergänzen, every pictureaber ich würde ihn nicht verwenden. (Es fehlt auch eine Prüfung, ob die angegebene Kette überhaupt existiert.)

Code

\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}

Ausgabe

Bildbeschreibung hier eingeben


Sie können auch die Bibliothek verwenden, graphsin der Sie die Platzierungs- und Verbindungsstrategie im Voraus festlegen können. (Allerdings würde ich dies als Teil von „ \tikzoder“ \graphstatt „global“ angeben.)

Da die Knoten Dund Enicht durch verbunden --oder ähnlich sind, werden diese als Geschwister betrachtet und somit branch right sepwird nicht verwendet 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}

verwandte Informationen