为什么 hyphsubst 不能与 LuaTeX 一起使用?

为什么 hyphsubst 不能与 LuaTeX 一起使用?

考虑以下 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-sterluatex -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}
}

在序言或文档中,以查看模式是否已加载,但似乎并非如此。

相关内容