今天的 fontspec 更新破坏了 fontspec_pass_args?

今天的 fontspec 更新破坏了 fontspec_pass_args?

几个小时前,以下代码运行完美(LuaLatex,Ubuntu 上的 TeXlive 2016):

\DeclareDocumentCommand \SetBaseFont { o m }
 { \__fontspec_pass_args:nnn \__fontspec_SetBaseFont:nn {#1} {#2} }
\cs_new:Nn \__fontspec_SetBaseFont:nn
 {
  \long\xdef\@basefontfeatures{#1}
  \long\xdef\@basefontname{#2}
  \global\@basefontsettrue
  \ignorespaces
 }

现在,它失败了。在此期间,我所做的只是通过 tlmgr 更新 texlive。我自己的代码没有改变。我确实注意到 fontspec 是更新的软件包之一。

我已将其范围缩小至fontspec_pass_args其中的那条线。

还有人遇到类似的问题吗?

编辑:字体规范代码肯定发生了变化(这位谦虚的用户说)。我把\__fontspec_pass_args:nnn出现在我自己的代码中的所有地方都删掉了。然后对于我的字体定义,与以前不同,我需要使用选项括号(即使不需要任何功能):\SetBaseFont[]{Some Font}现在我的代码可以编译了。幸运的是,无论问题代码做什么,都不是我需要的。请注意,我对具有更简单定义的字体使用了类似的代码,所以这不是\long\xdef什么问题。

更多编辑:

在日志文件中(一旦我按照上述方法编辑代码,就可以编译了),我看到许多如下所示的消息。我不记得以前见过它们,但也许我只是没有注意到。由于TU与 fontspec 相关,下面是一个例子。该问题实际上是由 microtype 检测到的。我使用的所有字体都是 Open Type:

Package microtype Warning: Unknown slot number of character
(microtype)                `\textgreater '
(microtype)                in font encoding `TU' in protrusion list
(microtype)                `T1-default'.

或许有关联,或许无关联。

再次重申:

我的问题其实已经得到了答案!导致错误的原因fontspec_pass_args很简单,因为最新版本的 fontspec(2.5c,三周前)不再有该命令。所以,如果其他人没有遇到我的问题,那是因为他们没有在自己的代码中模仿较旧的 fontspec 代码。但关于 TU 的奇怪消息仍然存在,而且很神秘。

答案1

你的问题有两个方面:

  • microtype / TU 问题将在计划于近期发布的 LaTeX2e 更新中修复

  • 关于您的代码破解,我将向您推荐 expl3 编程风格指南 (l3styleguide.pdf):

私有函数(以 开头的函数\__)不应该在模块之间使用。

但这可能是一个过于简短的解释:)

\__fontspec_pass_args:nnn函数旨在操纵可选参数,以便您可以编写

\fontspec[<options>]{fontname}

或者

\fontspec{fontname}[<options>]

但不是

\fontspec[<options>]{fontname}[<options>]

我看到这个,怎么说呢,相当不利在 tex.sx 聊天室中的 LaTeX3 光明会中,因为它违背了软件包xparse提供一致方式处理命令参数的一般理念。

因此我花了一段时间才放弃它,也许不幸的是,现在fontspec也允许“双重可选”形式:

\fontspec[<options>]{fontname}[<options>]

这使用了类似

\DeclareDocumentCommand \fontspec { O{} m O{} }

在第三方代码中,没有人需要复制提供的旧行为\__fontspec_pass_args:nnn

事实上,APIfontspec提供了一种无需使用内部命令即可加载字体的标准方法\__。如果这不能满足您的需求,请随时在 Github 存储库中提交功能请求。

相关内容