我正在使用 TikZ 编写一个用于标记矩阵的自定义包。我注意到 TikZ 中存在不一致。以下 MWE 可以最好地说明这一点:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black,
left delimiter=[,right delimiter={]}, matrix of math nodes]
{ 1 & 1 \\ };
\end{tikzpicture}
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black,
left delimiter=[,right delimiter={]}, matrix of math nodes]
{ 1 & 1 \\ 2 & 2 \\ };
\end{tikzpicture}
\begin{tikzpicture}[baseline=(m.west)]
\matrix (m) [draw=white!80!black,
left delimiter=[,right delimiter={]}, matrix of math nodes]
{ 1 & 1 \\ 2 & 2 \\ 3 & 3 \\ };
\end{tikzpicture}
\end{document}
令人惊讶的是(至少对我来说),它呈现如下:
显然,单行矩阵的括号与多行矩阵的对齐方式不同。我期望所有情况下的括号都比灰色框略小。
为什么会这样?更重要的是,我该如何补救?
更新 1:根据下面@percusse的评论,补救措施似乎是添加outer sep=0pt
到每个矩阵的选项中。现在我遇到了下一个问题:我想控制行之间的空间量。当添加row sep=0.1em
到每个矩阵时(除了outer sep=0pt
),这再次令人惊讶地呈现为:
答案1
我在 @percusse 的提示下发现了这个问题。问题的原因是 TeX 对分隔符的高度进行了某种舍入。以下代码说明了这一点:
\documentclass{standalone}
\begin{document}
$\left[\vcenter{\vbox to 33pt {}}\right]$
$\left[\vcenter{\vbox to 34pt {}}\right]$
$\left[\vcenter{\vbox to 35pt {}}\right]$
$\left[\vcenter{\vbox to 36pt {}}\right]$
$\left[\vcenter{\vbox to 37pt {}}\right]$
$\left[\vcenter{\vbox to 38pt {}}\right]$
$\left[\vcenter{\vbox to 39pt {}}\right]$
$\left[\vcenter{\vbox to 40pt {}}\right]$
\end{document}
其呈现形式如下:
PGF 中的违规代码位于文件中
texmf/tex/generic/pgf/frontendlayer/tikz/libraries/tikzlibrarymatrix.code.tex,
定义如下宏:
\def\tikz@delimiter#1#2#3#4#5#6#7#8{%
\bgroup
\pgfextra{\let\tikz@save@last@fig@name=\tikz@last@fig@name}%
node[outer sep=0pt,inner sep=0pt,draw=none,draw=none,fill=none,anchor=#1,at=(\tikz@last@fig@name.#2),#3]
{%
{\nullfont\pgf@process{\pgfpointdiff{\pgfpointanchor{\tikz@last@fig@name}{#4}}{\pgfpointanchor{\tikz@last@fig@name}{#5}}}}%
$\left#6\vcenter{\hrule height .5#8 depth .5#8 width0pt}\right#7$%
}
\pgfextra{\global\let\tikz@last@fig@name=\tikz@save@last@fig@name}%
\egroup%
}
节点主体内的第一行计算分隔符的所需高度。第二行创建一个具有左分隔符和右分隔符的数学环境,内部主体(\vcenter{\hrule height .5#8 depth .5#8 width0pt}
)是一个具有所需高度的空框。但是,放置在此框周围的分隔符大小不正确。因此:为了正确绘制括号,我想我们应该使用 TikZ 来绘制括号(即“手动”绘制线条),而不是让 TeX 完成这项工作。
但也许更好的方法是稍微缩放 TeX 生成的括号以匹配正确的大小。Martin Scharrer 已经实现了这一点。他的代码可以在以下位置找到:TikZ 中正确的分隔符高度