我正在创建重新链接双向链表的分步示意图。我的直觉是使用分割矩形表示节点(分别表示指针和值),然后使用矩阵排列这些矩形。
由于最终的图形将有许多重复的箭头(有些箭头在行之间有所不同,但这是后面的问题),我想使用节点矩阵和语法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
:-)中的空白行
猜猜会发生什么:Ti钾Z代码扫描条目开头的matrix
特殊语法时,看到(从空白行生成)并在此停止,得出单元格中没有的结论。然后排版为单元格内容,并在输出中变为“—”,因为您的文档使用字体编码(这是默认设置),这就是它在(插槽用于 em 破折号, 参见|...|
\par
|...|
|
OT1
OT1
"7C
texdoc 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}