覆盖矩阵以在对齐内工作(使用 mtpro2 括号和大括号)

覆盖矩阵以在对齐内工作(使用 mtpro2 括号和大括号)

要使用 MathTime Pro 2 字体提供的大圆括号和大花括号,我使用的代码来自这个答案@BrunoLeFloch 重新定义pmatrix和。Bmatrix但是,当矩阵(或案例)位于(和朋友)环境cases内时,此实现不起作用。align

\documentclass{article}
\usepackage{amsmath}
\usepackage{newtxtext}
\usepackage[lite]{mtpro2}
% in case you don't have mtpro2, use the following
%\usepackage{newtxmath}
%\providecommand*\PARENS[1]{\left(#1\right)}
%\providecommand*\LEFTRIGHT[3]{\left#1#3\right#2}
\usepackage{environ}
% from https://tex.stackexchange.com/a/9785/164314
\newcommand{\OverwriteEnviron}[1]{%
  \expandafter\let\csname #1\endcsname\relax%
  \expandafter\let\csname end#1\endcsname\relax%
  \expandafter\let\csname env@#1@parse\endcsname\relax%
  \expandafter\let\csname env@#1@save@env\endcsname\relax%
  \expandafter\let\csname env@#1@process\endcsname\relax%
  \NewEnviron{#1}%
}
\OverwriteEnviron{pmatrix}{\PARENS{%
  \begin{matrix}\BODY\end{matrix}}}
\OverwriteEnviron{Bmatrix}{\LEFTRIGHT\{\}{%
  \begin{matrix}\BODY\end{matrix}}}
\OverwriteEnviron{cases}{\LEFTRIGHT\lbrace.{\def\arraystretch{1.2}%
  \begin{array}{@{\,}l@{\quad}l@{}}\BODY\end{array}}}

\begin{document}
\section{Works!}
\[
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix} \quad
\begin{Bmatrix}
a & b \\
c & d \\
\end{Bmatrix} \quad
\begin{cases}
a & b \\
c & d \\
\end{cases}
\]

\section{Do not work}
\begin{align*}
%\begin{pmatrix}
%a & b \\
%c & d \\
%\end{pmatrix} \quad
%\begin{Bmatrix}
%a & b \\
%c & d \\
%\end{Bmatrix} \quad
%\begin{cases}
%a & b \\
%c & d \\
%\end{cases}
\end{align*}
\end{document}

矩阵和案例的新定义

一个非常类似的问题之前问过,但没有提供任何答案。我认为问题在于嵌套表格,其中 TeX 被对齐标签混淆 &。我也知道“肮脏的伎俩 \ifnum`{=0\fi” \ifnum`}=0\fi。但我不知道如何实现这些技巧。有什么想法吗?

答案1

没有 你也可以做到environ

\documentclass{article}
\usepackage{amsmath}
\usepackage{newtxtext}
\usepackage[lite]{mtpro2}
\usepackage{environ}

\newsavebox{\matrixbox}

\renewenvironment{pmatrix}
 {\setbox\matrixbox=\hbox\bgroup$\begin{matrix}}
 {\end{matrix}$\egroup\PARENS{\copy\matrixbox}}
\renewenvironment{Bmatrix}
 {\setbox\matrixbox=\hbox\bgroup$\begin{matrix}}
 {\end{matrix}$\egroup\LEFTRIGHT\{\}{\copy\matrixbox}}
\renewenvironment{cases}
 {\setbox\matrixbox=\hbox\bgroup$\def\arraystretch{1.2}%
  \begin{array}{@{\,}l@{\quad}l@{}}}
 {\end{array}$\egroup\LEFTRIGHT\lbrace.{\copy\matrixbox}}

\begin{document}
\section{Works!}
\[
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix} \quad
\begin{Bmatrix}
a & b \\
c & d \\
\end{Bmatrix} \quad
\begin{cases}
a & b \\
c & d \\
\end{cases}
\]

\section{Works as well}
\begin{align*}
\begin{pmatrix}
a & b \\
c & d \\
\end{pmatrix}\quad
\begin{Bmatrix}
a & b \\
c & d \\
\end{Bmatrix} \quad
\begin{cases}
a & b \\
c & d \\
\end{cases}
\end{align*}

\[
\begin{pmatrix}
a & \begin{pmatrix} c \\ d \end{pmatrix} \\
e & f
\end{pmatrix}
\]

\end{document}

在此处输入图片描述

答案2

以下代码受到以下启发@egreg 的回答特别是运用了盒子操纵的技术,主要有两点改进:

  1. \matrix@check的特征 被amsmath和 pmatrix保留 cases
  2. Bmatrix大括号 用于 cases 当且仅当包选项 curlybraces被传递给 mtpro2。对于选项 morphedbraces和 straightbraces,使用大直括号更有意义。

pmatrix*此外,类似的补丁也 应用于 Bmatrix*软件包mathtools(我就是这么做的不是在我的原始问题中提到)。最后,正如@egreg 先前的回答\mskip-\thinmuskip,我已从 的定义中 删除\LEFTRIGHT。我认为分享我的代码会对其他人有所帮助。

以下是我的结果:

\documentclass{article}
\usepackage{mathtools}% loads `amsmath'
\usepackage{newtxtext}
\usepackage[scaled=0.861,lining]{FiraMono}
\def\bracesshape{curlybraces}% change here to obtain different braces
% curlybraces
% morphedbraces
% straightbraces
\usepackage[lite,\bracesshape]{mtpro2}

% Patches begin
\makeatletter
% Fix weird space
\usepackage{etoolbox}
\patchcmd{\LEFTRIGHT}
  {\kern-2\nulldelimiterspace\mskip-\thinmuskip}
  {\kern-2\nulldelimiterspace}
  {}{}
% Two new boxes
\newsavebox{\mtp@matrixbox}
\newsavebox{\mtp@casesbox}
% Round parentheses should always be used by default
% `pmatrix' from `amsmath'
\renewenvironment{pmatrix}{%
  \matrix@check\pmatrix\setbox\mtp@matrixbox=\hbox\bgroup$\env@matrix
}{%
  \endmatrix$\egroup\PARENS{\copy\mtp@matrixbox}%
}
% Curly braces are used only if `curlybraces' is set
% From `mtpro2.sty': \DeclareOption{curlybraces}{\let\mtp@br=c}
\ifx\mtp@br c
  % `Bmatrix' from `amsmath'
  \renewenvironment{Bmatrix}{%
    \setbox\mtp@matrixbox=\hbox\bgroup$\env@matrix
  }{%
    \endmatrix$\egroup\LEFTRIGHT\lbrace\rbrace{\copy\mtp@matrixbox}%
  }
  % `cases' from `amsmath'
  \renewcommand*\env@cases{%
    \let\@ifnextchar\new@ifnextchar
    \setbox\mtp@casesbox=\hbox\bgroup$%
    \def\arraystretch{1.2}%
    \array{@{}l@{\quad}l@{}}%
  }
  \renewenvironment{cases}{%
    \matrix@check\cases\env@cases
  }{%
    \endarray$\egroup\LEFTRIGHT\lbrace.{\copy\mtp@casesbox}%
  }
\fi
% Now, the matrices from `mathtools'
\MHInternalSyntaxOn
\MaybeMHPrecedingSpacesOff
% `pmatrix*' from `mathtools'
\renewenvironment{pmatrix*}[1][c]
  {\setbox\mtp@matrixbox=\hbox\bgroup$\MT_matrix_begin:N #1}
  {\MT_matrix_end:$\egroup\PARENS{\copy\mtp@matrixbox}}
\MH_if_meaning:NN \mtp@br c
  % `Bmatrix*' from `mathtools'
  \renewenvironment{Bmatrix*}[1][c]
    {\setbox\mtp@matrixbox=\hbox\bgroup$\MT_matrix_begin:N #1}
    {\MT_matrix_end:$\egroup\LEFTRIGHT\lbrace\rbrace{\copy\mtp@matrixbox}}
\MH_fi:
\MHPrecedingSpacesOn
\MHInternalSyntaxOff
\makeatother
% Patches end

\newcommand*\showopendelimitersizes[1]{%
  #1\bigl#1\Bigl#1\biggl#1\Biggl#1}

\begin{document}

\section*{Matrices and cases in \texttt{align} now work!}
Matrices from \verb|amsmath| and \verb|mathtools| work;
\verb|cases| from \verb|amsmath| works.
\subsection*{Package \texttt{mtpro2} options: \texttt{lite,\bracesshape}}
\begin{align*}
\showopendelimitersizes{(}
\begin{pmatrix}
-a &  b \\
 c & -d \\
-a &  b \\
 c & -d \\
\end{pmatrix} \quad
\showopendelimitersizes{\lbrace}
\begin{Bmatrix*}[r]
-a &  b \\
 c & -d \\
-a &  b \\
 c & -d \\
\end{Bmatrix*} \quad
\begin{cases}
-a &  b \\
 c & -d \\
-a &  b \\
 c & -d \\
\end{cases}
\end{align*}

\end{document}

mtpro2 矩阵和案例

相关内容