矩阵破碎 - 括号内有缺口

矩阵破碎 - 括号内有缺口

这是我的最小工作示例。

\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文件)。

我稍后会贴出代码,首先我想展示一下结果。下面是一个矩阵的矩阵。每一行都是一个特定的类型(bmatrixpmatrix等)。每行中的第一个都有 TikZ分隔符。第二个让 TikZ 使用“标准”分隔符。第三个是来自 AMS 包的相应矩阵命令。

TikZ 矩阵替代品

代码如下。

\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可以被bracecalligraphic curved parenthesis取代bent

这种方法的一个优点是它允许分隔符有更多变化。我们可以定义新的装饰,并可以用各种不同的方式来设计路径。

答案2

那只是查看器的问题,而不是字体的问题!但是,我无法使用 200% 的 Adob​​e 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}

在此处输入图片描述

相关内容