使用 xelatex 和 displaystyle 中的 unicode-math 时 \binom 中的括号大小错误

使用 xelatex 和 displaystyle 中的 unicode-math 时 \binom 中的括号大小错误

我正在写论文,使用 XeLaTeX 和unicode-math,documentclass 已修改memoir。我需要排版二项式系数方程,但是我得到的括号大小错误。

并且似乎正在破坏、、等 unicode-math的输出。\binom\choose\genfrac

当我做:

$$\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}$$
$$\binom{5}{6}\qquad \tbinom{5}{6} \qquad \dbinom{5}{6}$$

我得到的二项式系数周围的括号太小:

括号大小错误的二项式

我已尝试renewcommandbinom

\renewcommand{\binom}[2]{\genfrac{(}{)}{0pt}{}{#1}{#2}}

没有成功,但是将它放在\left(和之间\right)会给出正确的更大括号。

我已经设置了非标准字体(见下文),但禁用它们并不能改变这一点。

使用{n \choose k}给出完全相同的输出...如何克服这个问题?

生成该代码的最小代码是:

\documentclass[a4paper,oneside]{memoir}
\usepackage{amsmath,unicode-math,xltxtra}

% Those are needed to use same fonts as I do.
% Parentheses are strange even without them
%\setromanfont[Mapping=tex-text]{Linux Libertine O}
%\setsansfont[Mapping=tex-text]{Ubuntu}
%\setmonofont{Ubuntu Mono}
%\setmathfont{Latin Modern Math}
%\setmathfont[range=\mathit/{latin,Latin,num,Greek,greek}]{Linux Libertine O Italic}
%\setmathfont[range=\mathup/{latin,Latin,num,Greek,greek}]{Linux Libertine O}
%\setmathfont[range=\mathbfup/{latin,Latin,num,Greek,greek}]{Linux Libertine O Bold}
%\setmathfont[range={"221E}]{Linux Libertine O}% "0221E = \infty

\begin{document}

$$\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}$$
$$\binom{5}{6}\qquad \tbinom{5}{6} \qquad \dbinom{5}{6}$$

\end{document}

编辑:简单的解决方法

通过这种方式重新定义\binom,至少对于我的字体集来说,它看起来是可以接受的:

\renewcommand{\dbinom}[2]{\left(\!\!\begin{array}{c}{#1} \\ {#2} \end{array}\!\!\right)}
\let\oldbinom\binom
\renewcommand{\binom}[2]{\mathchoice{\dbinom{#1}{#2}}{\oldbinom{#1}{#2}}{\oldbinom{#1}{#2}}{\oldbinom{#1}{#2}}}

答案1

和/字体本身是 OpenType 字体。数学设置是通过 OTF 数学表提供的参数完成的unicode-mathstixxits

OpenType 机制是 Microsoft 的发明。数学表虽然主要基于 TeX 使用的机制(如 TeXbook 附录 G 中所述),但缺少 TeX 所需的两个字体参数sigma20sigma21,其用法在规则 15e(第 445 页)中定义。基元\overwithdelims\atopwithdelims需要\abovewithdelims适当设置这些参数才能正常工作。

Ulrik Vieth 在他的演讲中报告了这两个参数的缺失,“OpenType 数学阐释",在 BachoTeX 2009 上发表;参考文献在幻灯片的第 19 页。

这些基元将分隔符(通常是一对匹配的圆括号、方括号或花括号,但也有其他可能)包裹在“广义分数”周围,即一对垂直对齐的符号,带有或不带有分数线。它们是命令amsmath\binom其他命令所\genfrac基于的结构。没有其他“本机”机制可用于在任何 TeX 引擎中设置此类分隔符。

尽管人们早已知道这些参数的缺失,但直到最近,在字体接近最终测试时,它们缺失的后果的极其严重性才变得广泛明显stix

这不是个容易解决或解决的问题。两种“显而易见”的方法是 (1) 更改 TeX 程序(不会发生),或 (2) 升级 OTF 数学表。实施第二种方法涉及严重的“政治”困难。因此,目前,对这一缺陷的适当纠正被搁置。

答案2

更新

\genfrac(等等)的实现在 Unicode TeXs的发布\binom中已被改变,问题中的示例现在生成2016-11-05 amsmath.dtx 2.16aamsmath

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath}

\begin{document}

$$\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}$$
$$\binom{5}{6}\qquad \tbinom{5}{6} \qquad \dbinom{5}{6}$$
\end{document}

中的代码amsmath基本上遵循下面答案中勾勒的轮廓。


原始答案

下面给出了一个更新版本,它与广义分数括号的更紧密间距和更大的最小尺寸更加匹配,可以与 pdftex 或 xetex 一起运行,以使用 lm 字体进行比较。

在此处输入图片描述

\documentclass[fleqn,a4paper]{article}

\addtolength\textwidth{40pt}
\usepackage{amsmath}
\ifx\Umathchar\undefined
\usepackage{lmodern}
\else
\usepackage{unicode-math}
\fi


\makeatletter
\ifx\Umathcode\@undefined\else

\DeclareRobustCommand{\genfrac}[6]{%
  \def\@tempa{#1#2}%
  \edef\@tempb{\@nx\@genfrac\@mathstyle{#4}%
    % just \over or \above never withdelims versions
    \ifx @#3@\@@over\else\@@above\fi 
    }%
\ifx\@tempa\@empty \else
\bgroup % so mathord not mathinner
\left\ifx\relax#1\relax.\else#1\fi % assumes . is null delimiter 
                                   % otherwise add specified delimiter
\kern-\nulldelimiterspace % fractions add extra nulldelimiter space
\fi
  \@tempb{#3}{\mathstrut{#5}}{\mathstrut{#6}}%
\ifx\@tempa\@empty \else
\kern-\nulldelimiterspace
\right\ifx\relax#2\relax.\else#2\fi
\egroup
\fi
}
\fi
\makeatother
\begin{document}

\[\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}\]
\[\binom{5}{6}\qquad \tbinom{5}{6} \qquad \dbinom{5}{6}\]
\[ 2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}\]
\[\sum_i\left[\binom{n_1}{i}
    \binom{n_2}{n_3-n_1+i}\binom{n_3}{n_3-n_2+i} + \binom{n_1-1}{i}
    \binom{n_2-1}{n_3-n_1+i} \binom{n_3-1}{n_3-n_2+i}\right]\]
\end{document}

原始答案:

如果您想使用\left/,\right我认为您不需要数组,\mathchoice只需使用\atop\over不使用分隔符,然后换行到左/右对中。

在此处输入图片描述

\documentclass[a4paper,oneside]{memoir}


\usepackage{amsmath,unicode-math,xltxtra}

% Those are needed to use same fonts as I do.
% Parentheses are strange even without them
%\setromanfont[Mapping=tex-text]{Linux Libertine O}
%\setsansfont[Mapping=tex-text]{Ubuntu}
%\setmonofont{Ubuntu Mono}
%\setmathfont{Latin Modern Math}
%\setmathfont[range=\mathit/{latin,Latin,num,Greek,greek}]{Linux Libertine O Italic}
%\setmathfont[range=\mathup/{latin,Latin,num,Greek,greek}]{Linux Libertine O}
%\setmathfont[range=\mathbfup/{latin,Latin,num,Greek,greek}]{Linux Libertine O Bold}
%\setmathfont[range={"221E}]{Linux Libertine O}% "0221E = \infty

\makeatletter
\DeclareRobustCommand{\genfrac}[6]{%
  \def\@tempa{#1#2}%
  \edef\@tempb{\@nx\@genfrac\@mathstyle{#4}%
    \csname @@\ifx @#3@over\else above\fi
    \endcsname
    }%
\ifx\@tempa\@empty \else
\left\ifx\relax#1\relax.\else#1\fi
\fi
  \@tempb{#3}{#5}{#6}%
\ifx\@tempa\@empty \else
\right\ifx\relax#2\relax.\else#2\fi
\fi
}
\makeatother
\begin{document}

$$\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}$$
$$\binom{5}{6}\qquad \tbinom{5}{6} \qquad \dbinom{5}{6}$$

\end{document}

答案3

使用 lualatex 这不是无法解决的问题。它会尝试为两个缺失的参数赋予合理的值(如果失败,可以对其进行调整):

\documentclass[a4paper,oneside]{memoir}
\usepackage{amsmath,unicode-math}

\begin{document}

\[\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}\]

\Umathfractiondelsize\displaystyle=40pt
\Umathfractiondelsize\textstyle=40pt

\[\binom{n}{k}\qquad \tbinom{n}{k} \qquad \dbinom{n}{k}\]

\end{document}

在此处输入图片描述

您可以对 xelatex 提出功能请求,希望它也能添加类似的功能。

相关内容