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}
Como puede ver, el resultado es incorrecto. ¿Qué genera la primera flecha? ¿Tengo algún error en MWE o me olvido de algo? ¿Alguien sabe una solución alternativa?
Editar:
El mismo resultado se obtiene tabularx
también en la tabla:
\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}
Respuesta1
tblr
escribe su contenido aparentemente al menos tres veces (para medirlo) antes de publicarlo en la página.- La cadena comienza fuera de tu imagen de TikZ, por lo que todos esos nodos de 4×2 se consideran parte de una misma cadena.
- PGF/TikZ realmente no comprueba si un nodo al que se hace referencia es parte de la misma imagen.
El nodo "D" que finalmente ves en la página no está ubicado en (0, 0)
ninguno de los dos, está ubicado right
en el último N
nodo de la imagen anterior.
Eche un vistazo al siguiente ejemplo. tblr
Básicamente está haciendo lo mismo, cuatro veces el mismo diagrama:
\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)};
Agregué el origen y una cuadrícula a todos los diagramas para que puedas ver más claramente lo que realmente está sucediendo.
El manual indica para start chain
:
Esta clave debe, aunque no es necesario, darse como una opción para un alcance que incluya todos los nodos de la cadena. Normalmente, será un
scope
o el todotikzpicture
, pero podría ser simplemente una ruta en la que se encuentran todos los nodos de la cadena. Si nonombre de la cadenase proporciona,chain
se utilizará el valor predeterminado en su lugar.
lo cual no está muy claro, pero da una pista de que tal vez solo debería usarse según las imágenes. Sin embargo, seguramente no preveía que una imagen fuera compuesta cuatro veces.
De todos modos, recomendaría ponerlo start chain
en la \tikz
foto o al menos en el tblr
celular. De todos modos, una cadena entre imágenes no tiene mucho sentido.
Agregué una reset chain
clave que restablece la cadena dada (o la cadena activa si no se proporciona ningún valor), a la que podríamos agregar every picture
pero no la usaría. (También falta comprobar si la cadena dada existe).
Código
\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}
Producción
También puede utilizar la graphs
biblioteca donde también puede configurar la estrategia de ubicación y conexión de antemano. (Sin embargo, especificaría esto como parte de \tikz
o \graph
en lugar de global).
Dado que los nodos D
y E
no están conectados por --
ni son similares, estos se consideran hermanos y, por lo tanto, branch right sep
se utilizan no 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}