当 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}