要使用 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 的回答特别是运用了盒子操纵的技术,主要有两点改进:
\matrix@check
的特征 被amsmath
和pmatrix
保留cases
。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}