新的 newtxttext 错误:不完整的 \ifx

新的 newtxttext 错误:不完整的 \ifx

在使用 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=59238http://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传递给包。

相关内容