为什么在这个矩阵中出现样式说明符而不是分割矩形?

为什么在这个矩阵中出现样式说明符而不是分割矩形?

我正在创建重新链接双向链表的分步示意图。我的直觉是使用分割矩形表示节点(分别表示指针和值),然后使用矩阵排列这些矩形。

由于最终的图形将有许多重复的箭头(有些箭头在行之间有所不同,但这是后面的问题),我想使用节点矩阵和语法M-i-j。但是,有了这个,我不能使用nodes=somestyle矩阵选项,至少如果我想在分割的矩形中使用不同的文本,就不能使用矩阵选项,正如讨论的那样这里。似乎我应该|[stylename]|在每个节点前使用语法,但我从以下 MWE 中得到了一个相当奇怪的行为:矩形不会出现,而是显示样式说明符(或称其为什么)!令人讨厌的是,它只发生在第 2 行和第 3 行的第一列,而不会发生在其他地方。参见附带的图片。

一个简单的解决方案是在每行的开头添加一个空节点(例如,在{} &A1、A2 和 A3 之前添加),但这看起来有点愚蠢,我想了解发生了什么。

这里出了什么问题? 有没有更好的方法?

在此处输入图片描述

\documentclass[crop,tikz]{standalone}
\usetikzlibrary{shapes.multipart, matrix}

\begin{document}

\begin{tikzpicture}[triple/.style={rectangle split, rectangle split parts=3,
    draw, rectangle split horizontal, minimum size=5mm}]

\matrix (M) [matrix of nodes, row sep=0.5cm, column sep=0.5cm] {    
  |[triple]| \nodepart{two} A1 &
  |[triple]| \nodepart{two} B1 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C1 &
  |[triple]| \nodepart{two} D1 &
  |[triple]| \nodepart{two} E1 \\
  
  |[triple]| \nodepart{two} A2 &
  |[triple]| \nodepart{two} B2 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C2 &
  |[triple]| \nodepart{two} D2 &
  |[triple]| \nodepart{two} E2 \\
  
  |[triple]| \nodepart{two} A3 &
  |[triple]| \nodepart{two} B3 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C3 &
  |[triple]| \nodepart{two} D3 &
  |[triple]| \nodepart{two} E3 \\
  };

  
\end{tikzpicture}
\end{document}

答案1

只需删除(或注释掉)\matrix :-)中的空白行

猜猜会发生什么:TiZ代码扫描条目开头的matrix特殊语法时,看到(从空白行生成)并在此停止,得出单元格中没有的结论。然后排版为单元格内容,并在输出中变为“—”,因为您的文档使用字体编码(这是默认设置),这就是它在(插槽用于 em 破折号, 参见|...|\par|...||OT1OT1"7Ctexdoc encguide指南.pdf,第 19 页)。使用T1编码后,输出中会显示“|”(texdoc encguide第 22 页)。

顺便问一下,为什么要"7C使用当前字体的 char?因为它|的 catcode 是 12(这是标准),并且它的 TeX 内部代码(~ ASCII)是"7C

\documentclass[crop,tikz]{standalone}
\usetikzlibrary{shapes.multipart, matrix}

\begin{document}
\begin{tikzpicture}[triple/.style={rectangle split, rectangle split parts=3,
    draw, rectangle split horizontal, minimum size=5mm}]

\matrix (M) [matrix of nodes, row sep=0.5cm, column sep=0.5cm] {
  |[triple]| \nodepart{two} A1 &
  |[triple]| \nodepart{two} B1 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C1 &
  |[triple]| \nodepart{two} D1 &
  |[triple]| \nodepart{two} E1 \\
  % <----------------- Here
  |[triple]| \nodepart{two} A2 &
  |[triple]| \nodepart{two} B2 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C2 &
  |[triple]| \nodepart{two} D2 &
  |[triple]| \nodepart{two} E2 \\
  % <----------------- Here
  |[triple]| \nodepart{two} A3 &
  |[triple]| \nodepart{two} B3 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C3 &
  |[triple]| \nodepart{two} D3 &
  |[triple]| \nodepart{two} E3 \\
  };
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

什么@frougon 猜测是正确的:当matrix of nodes使用时,\par令牌不会被忽略并会停止对的检测|

在下面的例子中,\tikz@lib@matrix@start@cell已进行了修补,因此当\par遇到令牌时,它会被跳过(但不会被忽略)并且检测|继续:

\documentclass[crop,tikz]{standalone}
\usetikzlibrary{shapes.multipart, matrix}

\makeatletter
% originally defined in tikzlibrarymatrix.code.tex
\def\tikz@lib@matrix@start@cell{%
  % skip possible \par
  \pgfutil@ifnextchar\par
    {\par\expandafter\tikz@lib@matrix@start@@cell\pgfutil@gobble}
    {\tikz@lib@matrix@start@@cell}%
}
\def\tikz@lib@matrix@start@@cell{%
  \pgfutil@ifnextchar|%
    {\tikz@lib@matrix@with@options}{\tikz@lib@matrix@normal@start@cell}%
}
\makeatother

\begin{document}

\begin{tikzpicture}[every label/.style={align=center, font=\scriptsize\ttfamily}]
  \matrix[label={normal\\ no blank line}] {
    \node{a}; & \node{b}; \\
    \node{c}; & \node{d}; \\
  };

  \matrix[label={normal\\ blank line}] at (2,0) {
    \node{a}; & \node{b}; \\

    \node{c}; & \node{d}; \\
  };

  \matrix[matrix of nodes, label={matrix of nodes\\ no blank line}] at (4,0) {
   |[red]| a & b \\
   |[red]| c & d \\
  };

  \matrix[matrix of nodes, label={matrix of nodes\\ blank line}] at (6,0) {
   |[red]| a & b \\
   
   |[red]| c & d \\
  };
\end{tikzpicture}

\begin{tikzpicture}[triple/.style={rectangle split, rectangle split parts=3,
    draw, rectangle split horizontal, minimum size=5mm}]

\matrix (M) [matrix of nodes, row sep=0.5cm, column sep=0.5cm] {    
  |[triple]| \nodepart{two} A1 &
  |[triple]| \nodepart{two} B1 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C1 &
  |[triple]| \nodepart{two} D1 &
  |[triple]| \nodepart{two} E1 \\
  
  |[triple]| \nodepart{two} A2 &
  |[triple]| \nodepart{two} B2 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C2 &
  |[triple]| \nodepart{two} D2 &
  |[triple]| \nodepart{two} E2 \\
  
  |[triple]| \nodepart{two} A3 &
  |[triple]| \nodepart{two} B3 &
  {$\ldots$} &
  |[triple]| \nodepart{two} C3 &
  |[triple]| \nodepart{two} D3 &
  |[triple]| \nodepart{two} E3 \\
  };
  
\end{tikzpicture}
\end{document}

在此处输入图片描述 在此处输入图片描述

相关内容