Cadeia de nós conectados por macro de junção na célula da tabela

Cadeia de nós conectados por macro de junção na célula da tabela

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}

insira a descrição da imagem aqui

Como você pode ver, o resultado está errado. O que gera a primeira flecha? Tenho algum erro no MWE ou perdi alguma coisa? Alguém conhece uma solução alternativa?

Editar: O mesmo resultado tabularxtambém é obtido na tabela:

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

Responder1

  1. tblraparentemente compõe seu conteúdo pelo menos três vezes (para medição) antes de ser realmente colocado na página.
  2. A cadeia começa fora da sua imagem TikZ, então todos esses nós 4×2 são considerados parte de uma mesma cadeia.
  3. O PGF/TikZ realmente não verifica se um nó referenciado faz parte da mesma imagem.

O nó “D” que você finalmente vê na página (0, 0)também não está colocado, ele está localizado rightno último Nnó da imagem anterior.

Dê uma olhada no exemplo a seguir. tblrestá basicamente fazendo o mesmo, quatro vezes o mesmo 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)};

Isto dá:
insira a descrição da imagem aqui

Adicionei a origem e uma grade a todos os diagramas para que você possa ver mais claramente o que realmente está acontecendo.

O manual indica para start chain:

Esta chave deve, mas não precisa, ser fornecida como uma opção para um escopo que abrange todos os nós da cadeia. Normalmente, será um scopeou o todo tikzpicture, mas pode ser apenas um caminho no qual todos os nós da cadeia são encontrados. Se nãonome da cadeiafor fornecido, o valor padrão chainserá usado.

o que não é muito claro, mas dá uma dica de que talvez deva ser usado apenas por imagem. Porém, certamente não previu que uma imagem fosse composta quatro vezes.

De qualquer forma, recomendo colocar start chainna \tikzfoto ou pelo menos na tblrcela. De qualquer forma, uma cadeia entre imagens não faz sentido.

Adicionei uma reset chainchave que redefine a cadeia fornecida (ou a cadeia ativa se nenhum valor for fornecido), à qual poderíamos adicionar, every picturemas eu não a usaria. (Também falta verificar se a cadeia fornecida 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}

Saída

insira a descrição da imagem aqui


Você também pode usar a graphsbiblioteca onde também pode configurar a estratégia de posicionamento e conexão de antemão. (Embora eu especificaria isso como parte de \tikzou \graphem vez de global.)

Como os nós De Enão estão conectados --ou semelhantes, eles são considerados irmãos e, portanto, branch right sepnão são usados 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}

informação relacionada