我正在写论文,使用 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}$$
我得到的二项式系数周围的括号太小:
我已尝试renewcommand
过binom
:
\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-math
。stix
xits
OpenType 机制是 Microsoft 的发明。数学表虽然主要基于 TeX 使用的机制(如 TeXbook 附录 G 中所述),但缺少 TeX 所需的两个字体参数sigma20
和sigma21
,其用法在规则 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.16a
amsmath
\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 提出功能请求,希望它也能添加类似的功能。