![矩阵破碎 - 括号内有缺口](https://linux22.com/image/238953/%E7%9F%A9%E9%98%B5%E7%A0%B4%E7%A2%8E%20-%20%E6%8B%AC%E5%8F%B7%E5%86%85%E6%9C%89%E7%BC%BA%E5%8F%A3.png)
这是我的最小工作示例。
\documentclass[12pt,a4paper]{mwrep}
%\usepackage{amsfonts}
\usepackage{amsmath}
%\renewcommand\baselinestretch{1.5}
\begin{document}
\chapter{Example}
\begin{equation}
P=
\begin{bmatrix} p_{11} & p_{12} & \cdots & p_{1r} \\
p_{21} & p_{22} & \cdots & p_{2r} \\
\vdots & \vdots & \ddots & \vdots \\
p_{r1} & p_{r2} & \cdots & p_{rr}
\end{bmatrix}
\end{equation}
\end{document}
这是第 2 行和第 4 行被注释掉时的矩阵视图(200%)
这是取消注释后得到的结果(200%)
如您所见,括号变细了,大小也不同。我不介意。但我不喜欢括号中的间隙。我该如何去掉它们?
我该如何让bmatrix
第 2 行和第 4 行看起来像是保留了注释,而文档的其余部分就像是取消了注释?
答案1
虽然我同意这些评论,认为这很可能是由于查看者,但这仍然令人恼火。我相信当打印这种影响并不明显,但由于 TeX 如今在演示中被广泛使用,因此它在特定查看器中的外观变得比以前更加重要。因此,尽管这可能是查看器的问题,但它仍然是一个值得解决的问题。
问题在于 TeX 用碎片构建分隔符,而查看器以非最佳方式渲染这些碎片并显示它们之间的空格。(不幸的是,我也不喜欢它做相反的事情并使碎片重叠,因为我可以看到重叠部分是特别厚的碎片!)。
解决这个问题的一个简单方法是使用具有适当可缩放分隔符的字体,如接受的答案中所述尖括号中的垂直向量。
解决这个问题的另一种方法是将分隔符绘制为单个实体,而不是逐个构建它们。我们有一个关于用 TikZ 矩阵替换 AMS 矩阵的问题:使用 TiKZ 数学节点矩阵模拟 amsmath 矩阵的障碍。在回答这个问题时,我找到了使用 TikZ 矩阵替代标准 AMS 矩阵环境的直接方法。但是,对于分隔符,它使用标准分隔符,因此无法解决这个问题。
但修改那里的代码以使其使用 TikZ 代码绘制分隔符并不太难。通过使用我的calligraphy
包,我甚至可以在括号和圆括号版本上获得很好的锥度。在撰写本文时,书法包不在 CTAN 上,但您可以从http://bazaar.launchpad.net/~tex-sx/tex-sx/development/files(您还需要该spath.dtx
文件)。
我稍后会贴出代码,首先我想展示一下结果。下面是一个矩阵的矩阵。每一行都是一个特定的类型(bmatrix
、pmatrix
等)。每行中的第一个都有 TikZ画分隔符。第二个让 TikZ 使用“标准”分隔符。第三个是来自 AMS 包的相应矩阵命令。
代码如下。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/26866/86}
\usepackage{amsmath,tikz}
\usetikzlibrary{matrix,decorations}
\usepackage{calligraphy}
\newlength\mtxrowsep
\setlength\mtxrowsep{1.5ex}
\newlength\mtxcolsep
\setlength\mtxcolsep{2\arraycolsep}
\makeatletter
\pgfdeclaredecoration{doubled lineto}{brace}
{
\state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
{
\pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}}
\pgfpathmoveto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}
\pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{\pgfdecorationsegmentamplitude}}
}
\state{final}{}%
}
\pgfdeclaredecoration{bracket}{brace}
{
\state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
{
\pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfqpoint{0pt}{\pgfdecorationsegmentamplitude}}
\pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{\pgfdecorationsegmentamplitude}}
\pgfpathlineto{\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}}
}
\state{final}{}%
}
\makeatother
\expandafter\def\csname delimiter \string\lbrace\endcsname{calligraphic brace}
\expandafter\def\csname delimiter \string(\endcsname{calligraphic curved parenthesis}
\expandafter\def\csname delimiter \string|\endcsname{lineto}
\expandafter\def\csname delimiter \string\|\endcsname{doubled lineto}
\expandafter\def\csname delimiter \string[\endcsname{bracket}
\expandafter\def\csname delimiter \string\rbrace\endcsname{calligraphic brace}
\expandafter\def\csname delimiter \string)\endcsname{calligraphic curved parenthesis}
\expandafter\def\csname delimiter \string]\endcsname{bracket}
\tikzset{
ams/.style={
baseline=-.7ex,
every delimiter/.style={yshift=-1pt},
every left delimiter/.style={xshift=2pt},
every right delimiter/.style={xshift=-2pt},
every node/.style={inner sep=0pt},
execute at end picture={
\path (current bounding box.east) ++(\pgfkeysvalueof{/tikz/ams matrix xsep},0) (current bounding box.west) ++(-\pgfkeysvalueof{/tikz/ams matrix xsep},0);
},
},
ams matrix xsep/.initial={.5ex},
ams matrix/.style={
inner sep=1pt,
column sep=\mtxcolsep,
row sep=\mtxrowsep,
% ampersand replacement=\&,
matrix of math nodes,
},
ams delimiters/.style args={#1,#2}{
left delimiter={#1},
right delimiter={#2},
},
delimiters/.style args={#1,#2}{
\pgfkeysvalueof{/tikz/matrix delimiter type} delimiters={{#1},{#2}},
},
matrix delimiter type/.initial={tikz},
tikz delimiter style/.style={
thick,
},
tikz delimiters/.style args={#1,#2}{
left tikz delimiter={#1},
right tikz delimiter={#2},
},
left tikz delimiter/.style={
render left tikz delimiter/.expand once={\csname delimiter \string#1\endcsname}
},
render left tikz delimiter/.style={
append after command={(\tikzlastnode.north west) edge[tikz delimiter style,decorate,decoration={mirror,#1}] (\tikzlastnode.south west)}
},
right tikz delimiter/.style={
render right tikz delimiter/.expand once={\csname delimiter \string#1\endcsname}
},
render right tikz delimiter/.style={
append after command={(\tikzlastnode.north east) edge[tikz delimiter style,decorate,decoration={#1}] (\tikzlastnode.south east)}
},
bmatrix/.style={
ams,
every matrix/.style={
ams matrix,
delimiters={[,]},
}
},
Bmatrix/.style={
ams,
every matrix/.style={
ams matrix,
delimiters={\lbrace,\rbrace},
}
},
pmatrix/.style={
ams,
every matrix/.style={
ams matrix,
delimiters={(,)},
}
},
vmatrix/.style={
ams,
every matrix/.style={
ams matrix,
delimiters={|,|},
}
},
Vmatrix/.style={
ams,
every matrix/.style={
ams matrix,
delimiters={\|,\|},
}
},
}
\let\matamp=&
\catcode`\&=13
\makeatletter
\def&{\iftikz@is@matrix
\pgfmatrixnextcell
\else
\matamp
\fi}
\makeatother
%\usepackage{environ}
\def\endtikzmatrix{\\\egroup;\end{tikzpicture}}
\foreach \mtype in {b,B,p,v,V} {
\expandafter\xdef\csname tikz\mtype matrix\endcsname{%
\noexpand\begin{tikzpicture}[\mtype matrix,matrix delimiter type={tikz}]
\noexpand\matrix \noexpand\bgroup}
\expandafter\xdef\csname ams\mtype matrix\endcsname{%
\noexpand\begin{tikzpicture}[\mtype matrix,matrix delimiter type={ams}]
\noexpand\matrix \noexpand\bgroup}
\expandafter\global\expandafter\let\csname endtikz\mtype matrix\endcsname=\endtikzmatrix
\expandafter\global\expandafter\let\csname endams\mtype matrix\endcsname=\endtikzmatrix
}
\begin{document}
\foreach \mtype in {b,B,p,v,V} {
\edef\metype{\mtype matrix}
\edef\tmetype{tikz\mtype matrix}
\edef\ametype{ams\mtype matrix}
\begin{gather*}
\begin{\tmetype} a & b \\ c & d \end{\tmetype}
\begin{\ametype} a & b \\ c & d \end{\ametype}
\begin{\metype} a & b \\ c & d \end{\metype}
\end{gather*}
}
\end{document}
代码的变化如下使用 TiKZ 数学节点矩阵模拟 amsmath 矩阵的障碍是在渲染矩阵后,我们在每条边上画一条线。但是我们根据所选的分隔符类型来装饰路径。如果我们不使用书法包,我们就必须在开头附近的列表中更改一些装饰选择:
\expandafter\def\csname delimiter \string\lbrace\endcsname{calligraphic brace}
\expandafter\def\csname delimiter \string(\endcsname{calligraphic curved parenthesis}
\expandafter\def\csname delimiter \string\rbrace\endcsname{calligraphic brace}
\expandafter\def\csname delimiter \string)\endcsname{calligraphic curved parenthesis}
calligraphic brace
可以被brace
和calligraphic curved parenthesis
取代bent
。
这种方法的一个优点是它允许分隔符有更多变化。我们可以定义新的装饰,并可以用各种不同的方式来设计路径。
答案2
那只是查看器的问题,而不是字体的问题!但是,我无法使用 200% 的 Adobe Reader 和\left[...\right]
矩阵序列来查看它:
\documentclass{article}
\usepackage{amsmath,amsfonts}
\begin{document}
\[\def\arraystretch{2} \left[\begin{matrix} a & b \\ c & d \end{matrix}\right]
\]
\end{document}