在 dvilualatex 中,无法将法语和希腊语 Babel 结合起来

在 dvilualatex 中,无法将法语和希腊语 Babel 结合起来

由于某种原因,尝试使用 dvilualatex 的法语和希腊语 Babel 支持时出现错误。

尝试运行以下命令,它将与 dvilualatex+dvips/dvipdfmx 一起正常工作:

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern} \usepackage[greek.ancient,main=french]{babel}
\title{Ça marche?} %\date{} \author{me}
\begin{document} \maketitle un, deux, trois \end{document}

或者,尝试使用英语和希腊语运行,一旦包含希腊语文本,它就会再次正常工作:(用我尝试过的任何其他语言替换英语似乎都可以,例如西班牙语)

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern} \usepackage[greek.ancient,main=english]{babel}
\title{Does it work?} %\date{} \author{me}
\begin{document} \maketitle one, two, three \foreignlanguage{greek}{ἀγαγεῖν} \end{document}

,如果您在主体中使用希腊文本并以法语作为其中一种语言来运行它,那么 dvilualatex 将编译出 dvips 和 dvipdfmx 都拒绝处理的 DVI。另一方面,使用 latex+dvips 或 latex+dvipdfmx 编译相同的 TeX 文档则工作正常。

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern} \usepackage[greek.ancient,main=french]{babel}
\title{Ça marche?} %\date{} \author{me}
\begin{document} \maketitle un, deux, trois \foreignlanguage{greek}{ἀγαγεῖν} \end{document}

当通过 dvilualatex 运行时,似乎完成得很好,但却返回了 dvips:

dvips: ! DVI file contains unexpected command (131)

并使用 dvipdfmx:

dvipdfmx:fatal: DVI opcode 254 only valid for XeTeX

那么到底是怎么回事呢?我该如何解决这个问题呢?(我要指出的是,在 PDF 模式下,LuaLaTeX 似乎可以正常工作,但对于特定情况,我想使用 DVI。无论如何,这是一个错误 — — 它从何而来???)

答案1

此问题已在 中修复babel-french。如果您仍遇到此问题,请更新您的 TeX 发行版。以下答案不再适用,因为如果与已修复的代码结合使用,此修复将弊大于利babel-french

旧答案

正如 Ulrike Fischer 所写,问题出在法语标点符号代码上。它被插入到“字距调整”回调中,该回调取代了传统的 TeX 字距调整代码,但并未应用任何字距调整。

因此,即使在您的第一个示例中仅包含法语,LuaLaTeX 和 pdfLaTeX 版本之间也存在细微差别:在 LuaLaTeX 版本中,“marche”中的字距调整缺失。

通常这在 LuaTeX 中并不重要,因为在 LuaLaTeX 中您通常使用使用另一种字距调整机制的 OpenType 字体,但当您使用传统字体时,这一点就变得很重要。

可以通过更改回调来添加字距调整过程来解决此问题:

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}
\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern}
\usepackage[greek.ancient,main=french]{babel}

\directlua{
  luatexbase.add_to_callback("kerning", node.kerning, "TeX legacy kerning")
} 

\title{Ça marche?} %\date{} \author{me}

\begin{document}
\showoutput
\maketitle
un, deux, trois
\end{document}

这不仅修复了旧字体的字距调整,而且还修复了 DVI 文件和希腊文本的问题:

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}
\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern}
\usepackage[greek.ancient,main=french]{babel}
\directlua{
  luatexbase.add_to_callback("kerning", node.kerning, "TeX legacy kerning")
} 

\title{Ça marche?} %\date{} \author{me}

\begin{document}
\showoutput
\maketitle
un, deux, trois

\foreignlanguage{greek}{ἀγαγεῖν}
\end{document}

工作正常。

你可能想知道为什么?

希腊文本的问题与希腊文本中的一个特殊字符有关:小 sigma。当它作为单词的最后一个字符时,它看起来会有所不同。这在 TeX 中被实现为一种特殊的连字:希腊字体要求 TeXright_boundary在每个单词的末尾插入一个“伪字符”。然后字体可以使用字距调整和连字规则,让这个特殊right_boundary字符在单词末尾表现出不同的行为。完成字距调整后,这些伪字符将被再次删除。

但是,当字距回调被覆盖时,删除这些字符也会被禁用。因此,在包含法语和希腊语文本的示例中,每个希腊语单词的末尾right_boundary都会保留一个字符并写入输出文件中。这会导致奇怪的效果,因为 LuaTeX 将此字符建模为具有索引的字形节点-2,而输出格式不喜欢负字形索引。在 PDF 中,这会写为 8 位无符号字符,因此转换为索引2^8-2=254。您在示例中看不到这一点,因为字体子集不包含字符索引254,但如果您在文档的任何位置插入 gree \char 254,您将看到这个字符附加到 PDF 输出中的每个单词:

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}
\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage{lmodern}
\usepackage[greek.ancient,main=french]{babel}
% \directlua{
%   luatexbase.add_to_callback("kerning", node.kerning, "TeX legacy kerning")
% } 

\title{Ça marche?} %\date{} \author{me}

\begin{document}
\showoutput
\maketitle
un, deux, trois

\foreignlanguage{greek}{\char 254 ἀγαγεῖν ἀγαγεῖν ἀγαγεῖν ἀγαγεῖν ἀγαγεῖν}
\end{document}

在此处输入图片描述

DVI 文件格式非常灵活,确实指定了如何插入具有负索引的字形。让我们再看一下该dvips消息:

dvips:!DVI 文件包含意外命令 (131)

仅当字形索引为负数或索引大于 16777215 时才需要命令 131。鉴于 dvips 仅支持字形索引在 0 到 255 之间的 8 位字体,此命令确实出乎意料。对于 dvipdfmx,问题类似,它仅支持最大 16777215 的字形索引,但该消息有点误导,因为它试图忽略命令字节 131 并尝试将字体索引读取为(无效)命令。

答案2

看起来法语标点符号代码给出了无效的 dvi。如果我删除回调,它就可以正常工作(应该在 babel 之后加载 lmodern,以避免字体系列发生变化):

\documentclass[12pt]{article}
\usepackage[utf8]{luainputenc}\usepackage[LGR,T1]{fontenc}\input{lgrenc.dfu}
\usepackage[greek.ancient,main=french]{babel}
\usepackage{lmodern}
\title{Ça marche?} %\date{} \author{me}
\directlua{luatexbase.remove_from_callback("kerning","frenchb.french_punctuation")}
\begin{document} \maketitle un, deux, trois
 \foreignlanguage{greek}{ἀγαγεῖν} 
 \end{document}

答案3

我不知道 哪里出了问题dvilualatex,但既然你最终还是要使用 8 位 Type1 字体,为什么不坚持使用 呢latex + dvips?请注意,你必须将\title{}命令移到 之后,\begin{document}才能使活动标点符号正常工作。

\documentclass[12pt]{article} \usepackage[utf8]{inputenc} \usepackage[LGR,T1]{fontenc} \usepackage[greek.ancient,main=french]{babel} \usepackage{lmodern} \begin{document} \title{Ça marche?} \date{} \author{me} \maketitle un, deux, trois \foreignlanguage{greek}{ἀγαγεῖν} \end{document}

相关内容