我刚刚安装了 TeXLive-2016,发现 microtype(更准确地说是命令\textls
和)exscale
崩溃了,而在 TeXLive-2015 中它们运行正常。以下是示例:
\documentclass{article}
\usepackage{microtype}
\usepackage{exscale}
\begin{document}
\textls[160]{$abc$}
\end{document}
这种不兼容现象的背后原因是什么?
答案1
我不确定为什么在某种\textls
语境中使用数学,但是……
microtype
2.6a 版本 (TL 2016)之间存在差异
\DeclareRobustCommand\lsstyle{%
\not@math@alphabet\lsstyle\textls
\MT@glet\glb@currsize\@empty
\def\MT@feat{tr}%
\let\MT@tracking\MT@set@tr@codes
\selectfont
}
和版本 2.5a (TL 2015)
\DeclareRobustCommand\lsstyle{%
\not@math@alphabet\lsstyle\textls
\let\glb@currsize\@empty
\def\MT@feat{tr}%
\let\MT@tracking\MT@set@tr@codes
\selectfont
}
代码在microtype-pdftex.def
和中microtype-luatex.def
(没有\textls
用 XeTeX 定义)。
资料中没有关于从\let
到 的改变的评论\global\let
,但这是应该做的(参见来源 2e)。然而exscale
,
\addto@hook\every@math@size{%
\begingroup
\setbox\z@\vbox{\hbox{$($}\kern\z@}%
\global\big@size 1.2\ht\z@
\endgroup}
我们可以看到问题:组内的数学公式触发设置数学大小,但值为\glb@currsize
空,导致\every@math@size
被调用……无限循环。
以下补丁可能会解决问题,因为在为测量目的而构建\textfont0
时应该已经设置好了。\hbox
\documentclass{article}
\usepackage{microtype}
\usepackage{exscale}
\usepackage{etoolbox}
\makeatletter
\edef\next{\the\every@math@size}
\patchcmd\next{\hbox{$($}}{\hbox{\the\textfont\z@(}}{}{}
\every@math@size=\expandafter{\next}
\makeatother
\begin{document}
$(\big(\Big(\bigg(\Bigg($
{\Large$(\big(\Big(\bigg(\Bigg($}
\textls[160]{$abc$}
\end{document}