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}
我添加了具有两种语法的字体定义来显示选择了正确的选项。