テーブルセル内の結合マクロによって接続されたノードのチェーン

テーブルセル内の結合マクロによって接続されたノードのチェーン

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}

ここに画像の説明を入力してください

ご覧のとおり、結果が間違っています。最初の矢印を生成するのは何ですか? MWE にエラーがあるのでしょうか、それとも何か見落としているのでしょうか? 回避策を知っている人はいますか?

編集: 表でも同じ結果が得られますtabularx:

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

答え1

  1. tblr実際にページに掲載される前に、その内容は少なくとも 3 回 (測定のため) タイプセットされるようです。
  2. チェーンは TikZ 画像の外側から始まるため、4×2 ノードはすべて 1 つの同じチェーンの一部であると見なされます。
  3. PGF/TikZ は、参照されたノードが同じ画像の一部であるかどうかを実際にはチェックしません。

ページに最終的に表示される「D」ノードはどちらにも配置されておらず、前の画像の最後のノードに(0, 0)配置されています。rightN

次の例を見てください。tblr基本的に同じことを、同じ図を 4 回繰り返しています。

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

これは与える:
ここに画像の説明を入力してください

実際に何が起こっているかをより明確に確認できるように、すべての図に原点とグリッドを追加しました。

マニュアルには次のように記載されていますstart chain:

scopeこのキーは、チェーンのすべてのノードを囲むスコープのオプションとして指定する必要がありますが、必ずしもそうする必要はありません。通常、これはまたは 全体になりますtikzpictureが、チェーンのすべてのノードが見つかるパスになることもあります。チェーン名が指定されている場合は、代わりにデフォルト値chainが使用されます。

これはあまり明確ではありませんが、おそらく画像ごとにのみ使用すべきであるというヒントを与えています。ただし、画像が 4 回タイプセットされることは確かに予見されていません。

start chainとにかく、画像\tikzまたは少なくともセルに配置することをお勧めしますtblr。画像間のチェーンは、あまり意味がありません。

reset chain指定されたチェーン (値が指定されていない場合はアクティブ チェーン) をリセットするキーを追加しました。これを追加することはできますevery pictureが、使用しません。(指定されたチェーンが存在するかどうかのチェックも欠落しています。)

コード

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

出力

ここに画像の説明を入力してください


graphs配置と接続戦略を事前に設定できるライブラリを使用することもできます。(ただし、これをグローバルではなく、\tikzまたはの一部として指定します。)\graph

ノードDと はまたは によってE接続されていないため--、これらは兄弟と見なされ、 ではなくbranch right sepが使用されます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}

関連情報