几个小时前,以下代码运行完美(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 存储库中提交功能请求。