分数的拉伸和收缩

分数的拉伸和收缩

当 TeX 收缩方程时,它只在“外层”使用胶水的收缩成分。例如,分数的分子/分母不会收缩,如下例所示:首先,我输入代码的输出,然后输入所需的输出(结果是通过将\thinmuskip, \medmuskip,\thickmuskip缩放 0.8 获得)。

\shipout\vbox{\hsize=140pt\relax
  $${1+2+3\over 2-1}=1+2+3={1+2+3}$$}
\bye

图像显示数学组、分数等没有缩小

在 LuaTeX 中,是否可以让 TeX 在必要时收缩子列表中的这种胶水?(我认为在其他 TeX 引擎中这是不可能的,除非有人接管对完整数学排版的控制,就像在 breqn 中一样。)

(这个问题的灵感来自TeX 是否使用 Hookean 物理弹簧来表示正胶和负胶?有人问 TeX 是否可以并行组合盒子。)

答案1

该宏\resizemath计算要使用的拉伸因子,同时\scalemath根据需要在每个框或组内按比例应用该因子。

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfmath}

% shrnk/expand to given width
\newcommand{\resizemath}[2]% #1 = wudth, #2 = contents
{\mathchoice{\resizestyle{#1}{\displaystyle #2}}%
            {\resizestyle{#1}{\textstyle #2}}%
            {\resizestyle{#1}{\scriptstyle #2}}%
            {\resizestyle{#1}{\scriptscriptstyle #2}}%
}
% apply proportionate stretch
\newcommand{\scalemath}[1]% #1 = contents
{\mathchoice{\scalestyle{\displaystyle #1}}%
            {\scalestyle{\textstyle #1}}%
            {\scalestyle{\scriptstyle #1}}%
            {\scalestyle{\scriptscriptstyle #1}}%
}
\makeatletter
\newcommand{\@stretch}{1}% initialize

\newcommand{\resizestyle}[2]% #1 = contents with style
{\bgroup
  \sbox0{\def\@stretch{1}$\m@th #2$}% compute stretch factor
  \pgfmathdivide{#1}{\wd0}%
  \global\let\@stretch=\pgfmathresult
  \hbox to #1{$\m@th #2$}%
\egroup}

\newcommand{\scalestyle}[1]% #1 = contents with style
{\bgroup\sbox0{\def\@stretch{1}$\m@th #1$}\hbox to \@stretch\wd0{$\m@th #1$}\egroup}
\makeatother

\begin{document}
\fbox{$\displaystyle \resizemath{100pt}{\frac{\scalemath{1+2+3}}{1} = 1+2+3}$}

\fbox{$\displaystyle \resizemath{86pt}{\frac{\scalemath{1+2+3}}{1} = 1+2+3}$}
\end{document}

演示

相关内容