TikZ: имя узлов матрицы неизвестно после обновления

TikZ: имя узлов матрицы неизвестно после обновления

Я только что обновил Fedora версии 32 до версии 33. Поэтому Tikz был обновлен (с 3.1.4b до 3.1.5b). После этого изменения эта фигура больше не компилируется (я использую Lualatex):

\documentclass{minimal}

\usepackage[french]{babel}

\usepackage{xcolor}
\definecolor{RdBu-9-1}{RGB}{178,24,43}
\definecolor{RdBu-9-2}{RGB}{214,96,77}
\definecolor{RdBu-9-8}{RGB}{67,147,195}
\definecolor{RdBu-9-9}{RGB}{33,102,172}

\usepackage{tikz}  
\usetikzlibrary{patterns}
\usetikzlibrary{fadings}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{arrows}
\usetikzlibrary{matrix}
\usetikzlibrary{decorations.pathreplacing}

\tikzset{%
  ffa/.style={%
    pattern=north west lines,
    pattern color=RdBu-9-2, 
    draw=none
  },
  ffc/.style={%
    draw=RdBu-9-1, 
    line width=1}
}

\usepackage[babel, autostyle]{csquotes}

\begin{document}

\begin{tikzpicture}
  \matrix [matrix of nodes,
  anchor=west,
  nodes={minimum size=.75cm}
  ] (zla0) at (0,0)
  {
    \draw[ffa,ffc] (0,0) circle (.3cm);&
    \draw[ffa,ffc] (0,0) circle (.3cm);\\
  };

  \matrix [matrix of nodes,
  anchor=north,
  nodes={minimum size=.75cm},
  below=2cm of zla0] (zlb0)
  {
    \draw[ffa,ffc] (0,0) circle (.3cm);\\
  };

  \foreach \m in {0} {
    \draw (zla\m.south west) |- ($(zla\m.south west)!0.5!(zla\m.south
    east) + (0,-.1)$) -| (zla\m.south east)  node[pos=0, yshift=.2]
    (zla\m-g) {};
    % 
    \draw (zlb\m.north west) |- ($(zlb\m.north west)!0.5!(zlb\m.north
    east) + (0,.1)$) -| (zlb\m.north east)  node[pos=0, yshift=.2]
    (zlb\m-g) {};
    % 
    \draw[->>, black,] ([yshift=-.2cm]zla\m.south) -- ([yshift=.2cm]zlb\m.north);
  }

  \draw[|-, black] ([yshift=1.25cm]zla0-1-2.north) -- (zla0-1-2.north)
  node[pos=.6,fill=white, minimum size=.75cm]{};

  \node[above=0cm of zla0-1-1.north, anchor=south, align=center,
  font=\tiny, text width=1.75cm]{\enquote{Je suis proche du \emph{Pic
        Jean Ray}}};

  \node[above=1.25cm of zla0-1-2.north, anchor=south, align=center,
  font=\tiny, text width=1.75cm]{\enquote{Je suis sous une \emph{crête}}};

  \node[below=0cm of zlb0.south, anchor=north, align=center,
  font=\tiny, text width=4cm]{\enquote{Je suis proche du \emph{Pic
        Jean Ray} et sous une crête}};

  \node[fill=white,align=center, font=\large\sffamily] at ($(zla0.south east)!0.5!(zlb0.north
  west)$){\emph{Fusion} des \emph{indices de localisation}};
\end{tikzpicture}

\end{document}

При компиляции возникают такие ошибки:

ERROR: Package pgf Error: No shape named `zla0-1-2' is known.

С помощью поиска в репозитории tikz я выявил проблему: ячейки a, matrix of nodesсодержащие \pathпроизводную (например \draw, ), обрабатываются напрямую, а не добавляются в a node(источник). Но я так и не выяснил, почему этот код, который работал на ferora 32, больше не работает (я не смог найти никакой информации в tikzжурнал измененийили что-то еще).

Какое лучшее решение, чтобы заставить эту фигурку снова работать? Зная, что у меня есть несколько фигурок, которые построены по этой схеме (эта самая простая, для примера) и что у меня мало времени, чтобы сделать эти модификации.

Было бы лучше, если бы была возможность переключиться на старый способ работы, но я не нашел ничего похожего в документации.

P.S.: Я задал тот же вопрос на французскомздесь, если у меня есть ответ там, я бы опубликовал его здесь и наоборот.

решение1

Ячейки в матрицах TikZ, которые не являются просто узлами, не имеют имени. (Даже узлы, которые помещены в ячейки с , matrix of nodesне \nodeимеют имени, если вы им его не дадите.)

Помимо использования реальных узлов, подобных этому

\matrix [
  matrix of nodes,
  anchor=west,
  nodes in empty cells,
  nodes={ffa, ffc, circle, minimum size=.6cm}
] (zla0) at (0,0) { & \\};

что поместит тот же круг в ячейку, что и ваш \drawвы можете позволить TikZ установить плотный прямоугольный узел вокруг ограничивающего прямоугольника каждой ячейки. Конечно, вы по-прежнему не сможете ссылаться на фактические элементы внутри ячейки. (Если только они не являются узлами и вы не даете им имена.)

Ключ install fitted node at end cellустановит необходимое \nodeв конце каждой ячейки. \path[every node/.code]Часть гарантирует, что мы не унаследуем никаких стилей от every nodeключа. Эти узлы названы <matrix name>-<row>-<column>'(обратите внимание на '), чтобы не было конфликта с фактическими узлами в matrix of node.

Я также пробовал давать current bounding boxпсевдоним или устанавливать local bounding boxдля каждой ячейки, но все это требует больше работы, поскольку фактические узлы (которые будут использоваться позже) должны быть установлены в специальном матричном хуке, чтобы их положение было известно после матрицы, — и даже в этом случае ширина линии не учитывалась.

Код

\documentclass[tikz]{standalone}
\usepackage[french]{babel}
\definecolor{RdBu-9-1}{RGB}{178,24,43}
\definecolor{RdBu-9-2}{RGB}{214,96,77}
\definecolor{RdBu-9-8}{RGB}{67,147,195}
\definecolor{RdBu-9-9}{RGB}{33,102,172}
\usetikzlibrary{patterns, calc, positioning, arrows, matrix, fit}
\tikzset{% This is the new key.
  install fitted node at end cell/.style={
    execute at end cell={%
      \path[every node/.code=] node[shape=rectangle, fit=(current bounding box),
        inner sep=+0pt, minimum size=+0pt, outer sep=+0pt, name=\tikzmatrixname-%
          \the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn']{};}}}
\tikzset{
  ffa/.style={pattern=north west lines, pattern color=RdBu-9-2,  draw=none},
  ffc/.style={draw=RdBu-9-1, line width=1}}
\usepackage[babel, autostyle]{csquotes}

\begin{document}
\begin{tikzpicture}[radius=.3cm]
\matrix [
  install fitted node at end cell, % ← Here's the new key used.
  anchor=west] (zla0) at (0,0) {
  \draw[ffa,ffc] (0,0) circle []; &
  \draw[ffa,ffc] (0,0) circle []; \\};
\matrix [below=2cm of zla0] (zlb0) {\draw[ffa,ffc] (0,0) circle [];\\};
\foreach \m in {0} {
  \draw (zla\m.south west)
    |- ($(zla\m.south west)!0.5!(zla\m.south east) + (0,-.1)$)
    -| (zla\m.south east) node[pos=0, yshift=.2] (zla\m-g) {};
  \draw (zlb\m.north west)
    |- ($(zlb\m.north west)!0.5!(zlb\m.north east) + (0,.1)$)
    -| (zlb\m.north east)  node[pos=0, yshift=.2] (zlb\m-g) {};
  \draw[->>, black,] ([yshift=-.2cm]zla\m.south) -- ([yshift=.2cm]zlb\m.north);
}
\draw[|-, black] ([yshift=1.25cm]zla0-1-2'.north) -- (zla0-1-2')
  node[pos=.6,fill=white, minimum size=.75cm]{};
\node[above=0cm of zla0-1-1'.north, anchor=south, align=center, font=\tiny,
  text width=1.75cm]{\enquote{Je suis proche du \emph{Pic Jean Ray}}};
\node[above=1.25cm of zla0-1-2'.north, anchor=south, align=center, font=\tiny,
  text width=1.75cm]{\enquote{Je suis sous une \emph{crête}}};
\node[below=0cm of zlb0.south, anchor=north, align=center, font=\tiny,
  text width=4cm]{
    \enquote{Je suis proche du \emph{Pic Jean Ray} et sous une crête}};
\node[fill=white, align=center, font=\large\sffamily]
  at ($(zla0.south east)!0.5!(zlb0.north west)$)
  {\emph{Fusion} des \emph{indices de localisation}};
\end{tikzpicture}
\end{document}

Выход

введите описание изображения здесь

Связанный контент