以下 LaTeX 代码已保存在文件中~/test.tex
。
\documentclass[tikz,border=1cm]{standalone}
\newcommand{\grid}
{%
\foreach \x in {1,2}
\foreach \y in {1,2}
\draw (\x,\y) rectangle ++(1,1);%
}
\begin{document}
\begin{tikzpicture}
\matrix
{
\grid & \grid \\
\grid & \grid \\
};
\end{tikzpicture}
\end{document}
该代码创建了一个 TikZ 图片,其中包含四个 2x2 的方格网格,以 2x2 矩阵排列。
然后在终端中执行以下命令。
> cd ~
> lualatex test
因此,文件~/test.pdf
已创建。在 PDF 查看器中打开时,文件显示如下。
为什么矩阵的行之间会有间隙,尽管TikZ 与 PGF手册(当前版本 3.1.9a)描述了矩阵单元格图片的对齐方式(第 20.3.1 节细胞图片对齐,第 320 页)?
第二行位于第一行下方,使得第一行的底部与第二行的顶部相接(除非使用行分隔符来增加一点空间)。然后第二行的底部接触第三行的顶部,依此类推。
(重点是我加上的。)
如何删除空格?我尝试将
row sep=0pt
选项传递给矩阵,但无济于事。
答案1
PGF 将每个矩阵单元视为一个 TeX 框,它们具有高度(基线之上)和深度(基线之下)。
与类似
\raisebox{1em}{Foo}\par
Bar
第二段仅Bar
没有向上移动到下面的正常垂直空间Foo
。
类似的事情也发生在你的细胞中。基线(是=0) 将以某种方式成为矩阵行的一部分。
我的建议是不要是= 0 位于细胞边界框之外。
在您的示例中,您可以将其添加shift=(down:1)
到所有单元格,以便原始是= 0 再次成为单元格边界框的一部分。
(我使用和(down:1)
,而不是yshift=-1cm
因为你的\grid
宏也使用了坐标坐标系而不是画布坐标系。
\documentclass[tikz,border=1cm]{standalone}
\newcommand{\grid}{%
\foreach \x in {1,2}
\foreach \y in {1,2}
\draw (\x,\y) rectangle ++(1,1);%
}
\begin{document}
\begin{tikzpicture}
\matrix[cells={shift=(down:1)}]{
\grid & \grid \\
\grid & \grid \\
};
\end{tikzpicture}
\end{document}
如果您喜欢冒险:
这里有一个修复程序,应用一些补丁,以便可能有一半的情况可以再次起作用。
首先,\pgf@matrix@init@row
我用 初始化每一行的高度为 −32000 pt(16000pt
PGF/TikZ 中所有行都用 进行了类似的初始化,尽管 TeX 允许的高度稍高一些)。最初,它们都有0pt
。
其次,我将修补\pgf@matrix@finish@line
现在检查最小是行的值高于0pt
,这意味着您有一个“负深度”(类似于Foo
示例中的)。此深度从当前行和下一行之间的行间距中减去。
\pgf@end@matrix
最后,在收集所有单元到实际放置矩阵节点和管理一些事物之后做大量工作的宏需要另一个补丁,以便在最后一行之后不会再次出现同样的问题。
由于某种原因,只需要删除一半的垂直空间。
注意事项:
- 不要使用空行。
- 这与“负高度”无关,即是= 0 是多于边界框。
- 不要相信这个答案不会引发其他问题。
代码
\documentclass[tikz,border=1cm]{standalone}
\makeatletter
\def\pgf@matrix@init@row{%
\relax%
\global\advance\pgfmatrixcurrentrow by 1\relax%
\global\pgfmatrixcurrentcolumn=0\relax%
\expandafter\gdef\csname pgf@matrix@maxy\the\pgfmatrixcurrentrow\endcsname{-16000pt}% ← almost mindimen
\expandafter\gdef\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname{16000pt}% ← almost maxdimen
}%
\usepackage{etoolbox}
\preto{\pgf@matrix@finish@line}{% row has negative depth, remove that from column seperation
\ifdim\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname>0pt
\pgf@matrix@addtolength\pgf@y{-\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname}%
\fi}
\patchcmd{\pgf@end@matrix}{\egroup\egroup}{%
\egroup % last row has negative depth? remove that (why .5?)
\ifdim\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname>0pt
\vskip-.5\dimexpr\csname pgf@matrix@miny\the\pgfmatrixcurrentrow\endcsname\relax
\fi
\egroup}{}{}
\makeatother
\newcommand{\grid}{%
\foreach \x in {1,2}
\foreach \y in {1,2}
\draw (\x,\y) rectangle ++(1,1);%
}
\begin{document}
\tikz
\matrix[draw=red, cells=black]{
\grid & \grid \\
\grid & \grid \\
% & \\ % empty lines are bad!
\grid \\
};
\end{document}