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}
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 tabularx
auch 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
tblr
setzt seinen Inhalt offenbar mindestens dreimal (zur Messung), bevor er tatsächlich auf die Seite gesetzt wird.- Die Kette beginnt außerhalb Ihres TikZ-Bildes, daher werden alle diese 4 × 2-Knoten als Teil ein und derselben Kette betrachtet.
- 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 right
am letzten N
Knoten des vorherigen Bildes.
Schauen Sie sich das folgende Beispiel an. tblr
Es 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)};
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
scope
oder das Ganzetikzpicture
, aber es kann auch nur ein Pfad sein, auf dem alle Knoten der Kette gefunden werden. Wenn keinKettennamechain
angegeben 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 chain
auf das \tikz
Bild oder zumindest in die tblr
Zelle zu setzen. Eine Kette zwischen den Bildern macht eh nicht wirklich Sinn.
Ich habe einen reset chain
Schlü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 picture
aber 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
Sie können auch die Bibliothek verwenden, graphs
in der Sie die Platzierungs- und Verbindungsstrategie im Voraus festlegen können. (Allerdings würde ich dies als Teil von „ \tikz
oder“ \graph
statt „global“ angeben.)
Da die Knoten D
und E
nicht durch verbunden --
oder ähnlich sind, werden diese als Geschwister betrachtet und somit branch right sep
wird 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}