luatexja-preset:豪华选项崩溃

luatexja-preset:豪华选项崩溃

deluxe 选项会导致 luatexja-preset 崩溃。例如,当我编译以下代码时:

\documentclass[12pt,a4paper]{ltjsarticle}
\usepackage[hiragino-pro,deluxe]{luatexja-preset}
\newcommand{\jugem}{寿限無 寿限無 五劫の摺り切れ 海砂利水魚の 水行末 雲来末 風来末 食う寝る所に住む所, Supercalifragilisticexpialidocious! }
\begin{document}
\jugem
\end{document}

它崩溃并显示以下错误消息:

*************************************************
* luatexja-preset warning: "scale"
* 
* Japanese fonts will be scaled by 0.92486572265625.
*************************************************
(load luc: /usr/local/texlive/2014/texmf-var/luatex-cache/generic/fonts/otf/ヒラギノ丸ゴ-pro-w4.luc)

! LaTeX Error: Missing \begin{document}.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.319 }

? 

当我使用时,不会发生这种情况\usepackage[hiragino-pro,deluxe]{luatexja-preset}

这是完整的 tex 源文件、luatex 输出和相应的 .log 文件。 https://gist.github.com/nagae/a8b7f55c78c8798b61b7

有什么建议吗?

答案1

问题在于如何luatexja-fontspec定义2.4 版本\newjfontfamily何时fontspec可用;实际上luatexja-fontspec-24.sty存在问题的是辅助包:

208 \DeclareDocumentCommand \newjfontfamily { m O{} m O{} } {
209   \cs_set_eq:NN \fontspec_set_family:Nnn \ltj_fontspec_set_family:Nnn
210   \newfontfamily #1 [#2] {#3} [#4]
211   \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
212 }

(为清晰起见添加了行号)。它基本上重新定义了内部命令\fontspec_set_family:Nnn以向其添加一些代码,然后调用\newfontfamily并最终恢复 的含义\fontspec_set_family:Nnn

问题不在于 的重新定义\fontspec_set_family:Nnn,而在于该\newfontfamily行,它假定该命令是用

\DeclareDocumentCommand{\newfontfamily}{mO{}mO{}{...}

但事实并非如此。

回顾一下历史。在 的第一个版本中fontspec,该命令\newfontfamily被定义为

\DeclareDocumentCommand{\newfontfamily}{ m O{} m }{...}

因此使用如下语法

\newfontfamily{\somefont}[<options>]{fontname}

2.4 版fontspec引入了另一种语法:

\newfontfamily{\somefont}{fontname}[<options>]

不是定义\newfontfamily查找两个可选参数。如果找到旧语法,则使用它。如果相反,如果可选参数出现在两个强制参数之间,则将寻找尾随的可选参数。

因此代码\newjfontfamily失败,因为两个强制参数之间的可选参数找到,但未查找尾随参数。实际上,您收到的错误是由于[位置不对导致 LaTeX 开始排版段落;由于它位于序言中,因此错误

Missing \begin{document}

已发出。

请注意,该deluxe选项只会触发错误:任何声明,例如

\newjfontfamily{\somefont}{fontname}[<options>]

在序言中即使没有该选项也会产生同样的错误deluxe

我认为,的开发人员fontspec不应该改变选项的顺序;但最大的错误是以现在的方式扫描可选参数,因为这违反了 LaTeX3 编程的准则。

如何修复 中的错误luatexja-fontspec-24.sty?该命令\newjfontfamily应支持两种语法,以便与旧文档兼容。因此,我们必须检查两个强制参数之间是否存在可选参数,并添加结果:

\documentclass[12pt,a4paper]{ltjsarticle}
\usepackage{luatexja-fontspec}

% Patch the wrong definition in luatexja-fontspec-24.sty
\ExplSyntaxOn
\DeclareDocumentCommand \newjfontfamily { m o m O{} }
 {
  \cs_set_eq:NN \fontspec_set_family:Nnn \ltj_fontspec_set_family:Nnn
  \IfNoValueTF{#2}
   {% no middle optional argument, use #4
    \newfontfamily {#1} [#4] {#3}
   }
   {% middle optional argument, use it
    \newfontfamily {#1} [#2] {#3}
   }
  \cs_set_eq:NN \fontspec_set_family:Nnn \__ltj_orig_fontspec_set_family:Nnn
 }
\ExplSyntaxOff

\usepackage[hiragino-pro,deluxe]{luatexja-preset}

\newjfontfamily\test[Scale=0.2]{Arial Unicode MS}

\newjfontfamily\testb{Arial Unicode MS}[Scale=2]

\newcommand{\jugem}{寿限無 寿限無 五劫の摺り切れ 海砂利水魚の 水行末 雲来末 風来末 
食う寝る所に住む所, Supercalifragilisticexpialidocious! }

\begin{document}

Tiny: {\test 寿限無} --- Huge: {\testb 寿限無}

\jugem

\end{document}

我添加了具有两种语法的字体定义来显示选择了正确的选项。

在此处输入图片描述

相关内容