在使用 TeX Live 2021 对软件包进行最新更新后,该软件包newtxtext
停止工作。
示例来源:
\documentclass{article}
\usepackage{newtxtext}
\begin{document}
Hello, world!
\end{document}
从日志中:
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=pdflatex 2021.5.17) 22 MAY 2021 15:28
entering extended mode
\write18 enabled.
file:line:error style messages enabled.
%&-line parsing enabled.
**newtxbug.tex
(./newtxbug.tex
LaTeX2e <2020-10-01> patch level 4
L3 programming layer <2021-05-11>
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/article.cls
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/size10.clo
File: size10.clo 2020/04/10 v1.4m Standard LaTeX file (size option)
)
:
:
(/usr/local/texlive/2021/texmf-dist/tex/latex/newtx/newtxtext.sty
Package: newtxtext 2021/05/16 v1.65
`newtxtext' v1.65, 2021/05/16 Text macros taking advantage of TeX-Gyre Termes f
onts (msharpe) (/Users/murray/Library/texmf/tex/latex/MinionPro/fontaxes.sty
Package: fontaxes 2007/03/31 v0.2b Font selection axes
LaTeX Info: Redefining \upshape on input line 26.
LaTeX Info: Redefining \itshape on input line 28.
LaTeX Info: Redefining \slshape on input line 30.
LaTeX Info: Redefining \swshape on input line 32.
LaTeX Info: Redefining \scshape on input line 34.
LaTeX Info: Redefining \sscshape on input line 36.
LaTeX Info: Redefining \ulcshape on input line 38.
LaTeX Info: Redefining \textsw on input line 43.
LaTeX Info: Redefining \textssc on input line 44.
LaTeX Info: Redefining \textulc on input line 45.
)
\ntx@fs=\dimen139
(/usr/local/texlive/2021/texmf-dist/tex/latex/xkeyval/xkeyval.sty
Package: xkeyval 2020/11/20 v2.8 package option processing (HA)
(/usr/local/texlive/2021/texmf-dist/tex/generic/xkeyval/xkeyval.tex
(/usr/local/texlive/2021/texmf-dist/tex/generic/xkeyval/xkvutils.tex
\XKV@toks=\toks15
\XKV@tempa@toks=\toks16
(/usr/local/texlive/2021/texmf-dist/tex/generic/xkeyval/keyval.tex))
\XKV@depth=\count187
File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
))
(/usr/local/texlive/2021/texmf-dist/tex/latex/etoolbox/etoolbox.sty
Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
\etb@tempcnta=\count188
)
(/usr/local/texlive/2021/texmf-dist/tex/generic/xstring/xstring.sty
(/usr/local/texlive/2021/texmf-dist/tex/generic/xstring/xstring.tex
\integerpart=\count189
\decimalpart=\count190
)
Package: xstring 2019/02/06 v1.83 String manipulations (CT)
)
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/ifthen.sty
Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)
)
(/usr/local/texlive/2021/texmf-dist/tex/latex/carlisle/scalefnt.sty)
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/fontenc.sty
Package: fontenc 2020/08/10 v2.0s Standard LaTeX package
LaTeX Font Info: Trying to load font information for T1+ntxtlf on input line
112.
(/usr/local/texlive/2021/texmf-dist/tex/latex/newtx/t1ntxtlf.fd
File: t1ntxtlf.fd 2021/05/07 v1.1 font definition file for T1/ntx/tlf
)
! Incomplete ifx; all text was ignored after line 3.
<inserted text>
fi
l.112 ...\familydefault\seriesdefault\shapedefault
?
(源文件名为newtxbug.tex
。)
答案1
除了 egreg 的解释之外,您还可以在加载之前将其添加到您的文档中,newtxtext
以便在包未更新时解决该问题:
\makeatletter
\AddToHook{file/before/t1ntxtlf.fd}{\let\ntx@sltrue\fi}
\AddToHook{file/after/t1ntxtlf.fd}{\def\ntx@sltrue{\let\ifntx@sl\iftrue}}
\makeatother
%
\usepackage{newtxtext}
\ntx@sltrue
这个 hack 会改变文件中的定义t1ntxtlf.fd
来强制平衡条件,然后在文件结束后恢复其含义。
答案2
更新
版本 1.653(发布于 2021-05-24)newtx
已使用更简单的
\@ifundefined{ifntx@sl}{\let\ifntx@sl\iftrue}{}
因为经过进一步分析,我们意识到该条件只是局部需要。
原始答案
该文件t1ntxtlf.fd
在 1.1 版中进行了更改,添加了
\expandafter\ifx\csname ntx@sltrue\endcsname\relax
\global\newif\ntx@sl\global\ntx@sltrue%
\fi
并且很快就发布了一个修复程序,将代码改为
\expandafter\ifx\csname ntx@sltrue\endcsname\relax
\global\newif\ifntx@sl\global\ntx@sltrue%
\fi
看http://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/newtx/t1ntxtlf.fd?r1=37185&r2=59238和http://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/newtx/t1ntxtlf.fd?r1=59238&r2=59277
这可以解释为什么在 MiKTeX 上没有明显的问题(但问题仍然存在):TeX Live 有热修复,但 MiKTeX 没有。如你所见,if
在“热修复”版本中,开头的字母不见了。
新的条件应该绝不在条件语句中定义,无论如何都要非常小心。这个想法是在读入文件\ifntx@sl
时检查是否定义,如果没有,则定义它。但是当条件语句被定义时会发生什么?让我们看一个更简单的例子:.fd
%\newif\iffoo
\expandafter\ifx\csname footrue\endcsname\relax
\newif\iffoo\footrue
\fi
这有效。但是如果我们删除它前面的注释,则\newif\iffoo
不行,因为条件返回 false(因为\footrue
不是\relax
),因此跳过了 true 文本,但会跟踪条件,因此\fi
匹配到\ifoo
而不是匹配到\ifx
。
这里还有一个问题:.fd
由于各种技术原因,文件是在组内读取的,因此条件应该是全局定义的。然而,\global\newif
目标却落空了。事实上,我们可以检查一下\newif
% latex.ltx, line 1216:
\def\newif#1{%
\count@\escapechar \escapechar\m@ne
\let#1\iffalse
\@if#1\iftrue
\@if#1\iffalse
\escapechar\count@}
并且\global
只会使分配成为全局的\count@=\escapechar
,这并不是特别有用,实际上是错误的,尽管几乎无害。
我不确定为什么.fd
文件中的初始检查被认为是必要的:包newtxtext
定义了\ifntx@sl
,因此条件将总是返回 false,无论选项是否trueslanted
传递给包。