我有以下 MWE,它在 TeXLive 14、15 和 16 下运行良好,但在 TeXLive 2017 上失败。
\documentclass{article}
\usepackage{tikz}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\usepackage{mtpro2}
\begin{document} This is a problem. \end{document}
MTProII是 PCTeX 提供的 Math Times Prof. II 软件包(免费提供)。
该示例是绝对的 MWE,更改其上的任何内容(甚至顺序)都可以使文件正常执行。使用上述代码,它会失败并显示:
! No room for a new \count .
\ch@ck #1#2#3->\ifnum \count 1#1<#2\else \errmessage {No room for a new #3}
\fi
l.129 \alloc@0\count\countdef\insc@unt\pointcount@
我已查看了 Enrico Gregorio 和 David Carlisle 对其他软件包的类似问题以及它们带来的可能性的一些回答 - 但并不适用于此处。
知道是什么原因造成的吗?我该如何解决它?
答案1
为了非常神秘的原因,而不是做
\newcount\pointcount@
软件包mtpro2.sty
(ab) 使用内部分配机制。遗憾的是,内部分配机制随着时间的推移发生了变化,但当然,它\newcount
仍然像以前一样继续工作。
有不有任何理由做出这样的声明
\alloc@0\count\countdef\insc@unt\pointcount@
除非可能是为了给用户制造麻烦。
按该顺序排列的包会出现问题,因为fontspec
和tikz
已经耗尽了索引低于 255 的计数器的供应。当然,使用旧的分配机制将会失败,因为在遇到中的声明\count10
时,保存最后分配的计数器寄存器的值为 278 。\alloc@
mtpro2.sty
如何解决这个问题?有两种方法。最简单的方法是将mtpro2
第 138 行更改为\newcount\pointcount@
。
第二个方法是利用这个调用\alloc@
是包中唯一的调用这一事实,并重新定义它来做正确的事情。
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\makeatletter
\let\alloc@latex\alloc@
\def\alloc@#1#2#3#4{\newcount}% the current \newcount doesn't use \alloc@
\makeatother
\usepackage{mtpro2}
\makeatletter
\let\alloc@\alloc@latex
\makeatother
\setmainfont{Times New Roman}
\begin{document}
This is no more a problem.
\end{document}
我两种方法都试过了,而且都有效。