考虑以下 MWE:
\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst}
\documentclass{scrartcl}
\usepackage[english]{babel}
\usepackage{blindtext}
\begin{document}
\Blindtext
\end{document}
用 编译没问题pdflatex
,但用 编译不行lualatex
。为什么使用最新的连字模式时会出现错误?我可以让它们与 一起工作吗lualatex
?
This is LuaTeX, Version beta-0.70.1-2011061410 (rev 4277)
restricted \write18 enabled.
(./BabelTest.tex
LaTeX2e <2011/06/27>
LuaTeX adaptation of babel <v3.8l-luatex-1.5> and hyphenation patterns for engl
ish, dumylang, nohyphenation, loaded.
(/usr/local/texlive/2011/texmf-dist/tex/generic/oberdiek/hyphsubst.sty
(/usr/local/texlive/2011/texmf-dist/tex/generic/oberdiek/infwarerr.sty))
(./scrbook.cls
Document Class: scrbook 2012/03/08 v3.10a KOMA-Script document class (book)
(/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/scrkbase.sty
(/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/scrbase.sty
(/usr/local/texlive/2011/texmf-dist/tex/latex/graphics/keyval.sty)
(/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/scrlfile.sty
Package scrlfile, 2011/03/09 v3.09 KOMA-Script package (loading files)
Copyright (C) Markus Kohm
))) (/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/tocbasic.sty)
(/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/scrsize11pt.clo)
(/usr/local/texlive/2011/texmf-dist/tex/latex/koma-script/typearea.sty
Package typearea, 2012/03/08 v3.10a KOMA-Script package (type area)
Copyright (C) Frank Neukam, 1992-1994
Copyright (C) Markus Kohm, 1994-
)) (/usr/local/texlive/2011/texmf-dist/tex/generic/babel/babel.sty
(/usr/local/texlive/2011/texmf-dist/tex/generic/babel/english.ldf
(/usr/local/texlive/2011/texmf-dist/tex/generic/babel/babel.def
! LuaTeX error ...11/texmf-dist/tex/luatex/hyph-utf8/luatex-hyphen.lua:60: luat
ex-hyphen: \language0 should be dumped in the format
stack traceback:
[C]: in function 'error'
...11/texmf-dist/tex/luatex/hyph-utf8/luatex-hyphen.lua:22: in function 'err'
...11/texmf-dist/tex/luatex/hyph-utf8/luatex-hyphen.lua:60: in function 'loadl
anguage'
<\directlua >:1: in main chunk.
\bbl@patterns ...pestring {#1}", \the \language )}
\fi \fi \fi
l.131 \main@language{english}
答案1
回答 OP 的最后一个问题“我可以让它们与 lualatex 一起工作吗?”:
软件包 hyph-utf8 中已包含软件包 dehyph-exptl 中的模式,这些模式已为支持 UTF-8 的 TeX 引擎(例如 LuaTeX 和 XeTeX)激活。由于 TeX 和 pdfTeX 的德语模式已冻结,软件包 hyph-utf8 也包含常规德语模式,但仅为上述 8 位 TeX 引擎激活这些模式。
也就是说,使用 LuaLaTeX 时你根本不需要关心 dehyph-exptl 和 hyph-subst 包。此示例
\documentclass{article}
% \usepackage[ngerman]{babel}
\usepackage[german]{babel}
\begin{document}
\showhyphens{modernste}
\end{document}
使用 LaTeX 和 LuaLaTeX 编译时应显示以下结果:
german ngerman
LaTeX mo-d-ern-ste mo-d-erns-te
LuaLaTeX mo-dern-ste mo-derns-te
您可以通过输入以下命令来了解 hyph-utf8 软件包附带的实验性德语模式的版本(通常是最新版本)
$head `kpsewhich hyph-de-1901.lic.txt`
在 shell 上。Windows 用户输入
>for /F "usebackq" %f in (`kpsewhich hyph-de-1901.lic.txt`) do more "%f"
在命令行上。请注意kpsewhich
调用周围的反引号!
答案2
使用 LuaTeX 编译时没有出现错误,但hyphsubst
似乎无法使用 LuaTeX。您可以通过使用 LuaTeX 运行以下文档来验证:
\RequirePackage[german=ngerman-x-latest]{hyphsubst}
\documentclass{minimal}
\usepackage[german]{babel}
\begin{document}
\showhyphens{Meister}
\end{document}
它应该报告Meis-ter
,但报告Mei-ster
。luatex -recorder test.tex
您可以查看生成的.fls
文件并看到只有文件hyph-de-1901.pat.txt
被加载。
答案3
hyphsubst
只是改变与 LaTeX 在选择语言时使用的控制序列相关的数字。
例如\selectlanguage{ngerman}
执行,除其他外,\language\l@ngerman
在\l@ngerman
创建格式时定义为数字"1E
(在我的计算机上,它可以根据文件而变化language.dat
)。
对应的数字ngerman-x-latest
是(在我的计算机上)"4
。
当有人说
\RequirePackage[german=ngerman-x-latest]{hyphsubst}
\l@ngerman
基本动作是把的意思变成"4
;更准确地说,动作是
\chardef\l@ngerman=\csname l@ngerman-x-latest\endcsname
当然,如果语言没有预加载,就像 LuaLaTeX 那样,这是行不通的(包中采取了预防措施,以便即使 的含义是 ,也能执行正确的分配\csname l@ngerman-x-latest\endcsname
)\relax
。我想这就是我们以英语模式结束的原因。
迈向解决方案的可能一步
显然,LuaLaTeX 知道正确的数字,因此需要强制加载正确的语言。测试:
\documentclass{article}
%% print the numbers
\typeout{ngerman: \number\csname l@ngerman\endcsname}
\typeout{ngerman-x-latest: \number\csname l@ngerman-x-latest\endcsname}
\usepackage{hyphsubst}
\usepackage[ngerman]{babel}
\begin{document}
\typeout{Current language: \number\language}
\HyphSubstLet{ngerman}{ngerman-x-latest}
\typeout{Current language: \number\language}
\end{document}
日志文件的相关部分显示
ngerman: 30
ngerman-x-latest: 4
[...]
Current language: 30
Current language: 4
因此的值\language
似乎设置正确。然而,.fls
文件只报告
INPUT /usr/local/texlive/2011/texmf-dist/tex/generic/hyph-utf8/patterns/txt/hyph-de-1996.pat.txt
INPUT /usr/local/texlive/2011/texmf-dist/tex/generic/hyph-utf8/patterns/txt/hyph-de-1996.pat.txt
INPUT /usr/local/texlive/2011/texmf-dist/tex/generic/hyph-utf8/patterns/txt/hyph-de-1996.hyp.txt
这似乎意味着连字模式ngerman-x-latest
未加载。
我尝试添加类似
%% Load the new language
\setbox0=\vbox{
\everypar{}\begin{hyphenrules}{ngerman-x-latest}abc\end{hyphenrules}
}
在序言或文档中,以查看模式是否已加载,但似乎并非如此。