pmatrix 渲染不正确——可能是 wileySix 的问题

pmatrix 渲染不正确——可能是 wileySix 的问题

以下是原帖 有几个人要求提供完整文档:

\documentclass{wileySix}
\usepackage{amsmath}   
\usepackage{amsfonts}
\usepackage{amssymb}

\begin{document}
 \[
 \mathbf{y}=
 \begin{pmatrix}
y_1 \\
y_2
\end{pmatrix}\mbox{ and }
\boldsymbol{\mu}=\begin{pmatrix}
\mu_1 \\
\mu_2
\end{pmatrix}
\]

\end{document}

当 documentclass 从 更改为 时,此问题便会消失wileySixarticle我会进行调查。

原始帖子 你好,我想用 LaTeX 编写以下表达式pmatrix 在此处输入图片描述

我可以用标准的旧 TeX 来做到这一点:

\mathbf{y}=\left(\begin{array}{c} y_1 \\ y_2
\end{array} \right)  \mbox{ and }  \boldsymbol{\mu}=
\left(\begin{array}{c} \mu_1\\ \mu_2
\end{array} \right)

不过,我认为我应该能够通过使用包更巧妙地做到这pmatrix一点amsmath

\mathbf{y}=
\begin{pmatrix}
y_1 \\ y_2
\end{pmatrix}\mbox{ and }
\boldsymbol{\mu}=\begin{pmatrix}
\mu_1 \\ \mu_2
\end{pmatrix}

我最终在渲染的文档中得到的是

在此处输入图片描述

这显然有问题。我在 MacTeX 上运行,但这从未在其他地方给我带来问题。任何建议都将不胜感激

答案1

wileysix课程\@array在一个很小但具有决定性的细节中重新定义:

LaTeX 内核定义

\def\@array[#1]#2{%
  \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
  \bgroup
  \setbox\@arstrutbox\hbox{%
    \vrule \@height\arraystretch\ht\strutbox
           \@depth\arraystretch \dp\strutbox
           \@width\z@}%
  \@mkpream{#2}%
  \edef\@preamble{%
    \ialign \noexpand\@halignto
      \bgroup \@arstrut \@preamble \tabskip\z@skip \cr}%
  \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
  \let\tabularnewline\\%
    \let\par\@empty
    \let\@sharp##%
    \set@typeset@protect
    \lineskip\z@skip\baselineskip\z@skip
    \ifhmode \@preamerr\z@ \@@par\fi
    \@preamble}

wileysix.cls定义

\def\@array[#1]#2{%
  \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
  \bgroup
  \setbox\@arstrutbox\hbox{%
    \vrule \@height\arraystretch\ht\strutbox
           \@depth\arraystretch \dp\strutbox
           \@width\z@}%
  \@mkpream{@{}#2@{}}%
  \edef\@preamble{%
    \ialign \noexpand\@halignto
      \bgroup \@arstrut \@preamble \tabskip\z@skip \cr}%
  \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
  \let\tabularnewline\\%
    \let\par\@empty
    \let\@sharp##%
    \set@typeset@protect
    \lineskip\z@skip\baselineskip\z@skip
    \ifhmode \@preamerr\z@ \@@par\fi
    \@preamble}

不同之处在于

  \@mkpream{#2}%

即成为

  \@mkpream{@{}#2@{}}%

这样就不会在 的左侧和右侧添加填充array。另一方面,amsmath通过在栅栏和矩阵之间添加负空间来手动修复矩阵中的填充:

\renewenvironment{matrix}{%
  \matrix@check\matrix\env@matrix
}{%
  \endarray \hskip -\arraycolsep
}
\def\env@matrix{\hskip -\arraycolsep
  \let\@ifnextchar\new@ifnextchar
  \array{*\c@MaxMatrixCols c}}
\renewenvironment{pmatrix}{%
  \left(%
  \matrix@check\pmatrix\env@matrix
}{
  \endmatrix\right)%
}

\hskip -\arraycolsep正是我所说的负空间。右边的那个有它的效果,因为 a 的标准前导码matrix是指定的,直到矩阵有列时才到达最后一列\MaxMatrixCols

我发现课堂上的重新定义非常愚蠢:它已经完成了确切地目的相同amsmath,即栅栏和矩阵系数之间不存在间隙。但治疗比疾病更糟糕。

我认为将 的含义修正为\@array内核含义没有什么问题。只需记住在使用具有非标准中心对齐的特殊矩阵环境时,@{}在列规范的两侧手动添加即可。array

\documentclass{wileysix}
\usepackage{amsmath}   
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{etoolbox}

\makeatletter
\patchcmd{\@array}{\@mkpream{@{}#2@{}}}{\@mkpream{#2}}{}{}
\makeatother

\begin{document}
 \[
 \mathbf{y}=
 \begin{pmatrix}
y_1 \\
y_2
\end{pmatrix}\mbox{ and }
\boldsymbol{\mu}=\begin{pmatrix}
\mu_1 \\
\mu_2
\end{pmatrix}
\]
\end{document}

在此处输入图片描述

相关内容