Cadena de nodos conectados mediante macro de unión en la celda de la tabla

Cadena de nodos conectados mediante macro de unión en la celda de la tabla

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}

ingrese la descripción de la imagen aquí

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 tabularxtambié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

  1. tblrescribe su contenido aparentemente al menos tres veces (para medirlo) antes de publicarlo en la página.
  2. 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.
  3. 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 righten el último Nnodo de la imagen anterior.

Eche un vistazo al siguiente ejemplo. tblrBá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)};

Esto da:
ingrese la descripción de la imagen aquí

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 scopeo el todo tikzpicture, pero podría ser simplemente una ruta en la que se encuentran todos los nodos de la cadena. Si nonombre de la cadenase proporciona, chainse 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 chainen la \tikzfoto o al menos en el tblrcelular. De todos modos, una cadena entre imágenes no tiene mucho sentido.

Agregué una reset chainclave que restablece la cadena dada (o la cadena activa si no se proporciona ningún valor), a la que podríamos agregar every picturepero 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

ingrese la descripción de la imagen aquí


También puede utilizar la graphsbiblioteca donde también puede configurar la estrategia de ubicación y conexión de antemano. (Sin embargo, especificaría esto como parte de \tikzo \graphen lugar de global).

Dado que los nodos Dy Eno están conectados por --ni son similares, estos se consideran hermanos y, por lo tanto, branch right sepse 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}

información relacionada