如何在 lualatex 中将所有连字符模式从 Unicode 转换为 T1?

如何在 lualatex 中将所有连字符模式从 Unicode 转换为 T1?

我正在尝试使用路拉泰克斯使用旧的、8 位、非 Unicode 字体:

\documentclass[a4paper]{article}
\usepackage[utf8]{luainputenc}
\usepackage{t1enc}
\usepackage{lmodern}
\def\myhelvetica{\fontfamily{phv}\selectfont}
\begin{document}
\makeatletter\language=\l@hungarian
\showhyphens{árvíztűrő türkörfúrógép}
\hrule
{\Huge Helló, Wörld, árvíztűrő}
\hrule
{\Huge Helló, Wörld, árvízt\H{u}r\H{o}}
\hrule
{\myhelvetica\Huge Helló, Wörld, árvíztűrő}
\hrule
\end{document}

除了显示不正确的连字符外,一切正常\showhyphens

  • ár-víz-tű-rő 是正确的,\showhyphens它显示了其他的东西。 (使用时路拉泰克斯字体规格,这也是正确的连字符。)即使没有 fontspec,我也想\showhypens在 lualatex 中显示 ár-víz-tű-rő。
  • tü-kör-fú-ró-gép 连字符正确。

我怀疑问题是由字母 ő 和 ű 引起的,它们在 Unicode 和 T1 编码中处于不同的位置。(所有其他字母,包括 ó 和 é 都处于同一位置。)

有没有办法将所有连字符模式从 Unicode 转换为 T1 编码,我可以在\documentclass和之间添加一些东西\begin{document}?我不会使用字体规格或此编译中的任何 Unicode 字体。包含连字符模式的文件可能是正确的,我只是想路拉泰克斯用不同的编码 (T1) 加载它们,或者在加载它们之后进行内存编码转换。如果为了实现这一点需要编写一些额外的 Lua 代码,对我来说没问题。

我知道,而且我已经检查过了pdflatex书本之外。然而,在这个问题中,我正在寻找一种方法来让它发挥作用路拉泰克斯。我并不是在寻求建议是否应该使用pdflatex或者路拉泰克斯:为了回答这个问题,我承诺路拉泰克斯

答案1

与此同时,我能够解决这个问题。以下是解决方案(重要的行以 结尾%%):

% pl.tex, works with modern pdflatex and lualatex in TeX Live 2019.
\documentclass{article}
\usepackage[utf8]{luainputenc}  %%
\usepackage{lmodern} \normalfont
\usepackage{t1enc}
\let\kanjiskip\hsize  %%
\usepackage[hungarian]{babel}
\expandafter\let\expandafter\CCC\csname @tempcnta\endcsname  %%
\CCC128 \loop\ifnum\CCC<159 \ifnum\lccode\CCC=0 \lccode\CCC\CCC\fi  %%
  \advance\CCC1 \repeat  %%
\CCC160 \loop\ifnum\CCC<190 \ifnum\lccode\CCC=0 \lccode\CCC\CCC\fi  %% 
  \advance\CCC1 \repeat  %%
\CCC192 \loop\ifnum\CCC<256 \ifnum\lccode\CCC=0 \lccode\CCC\CCC\fi  %%
  \advance\CCC1 \repeat  %%
\begin{document}
\showhyphens{árvíztűrő tükörfúrógép}
\hrule width \hsize
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bababababababa\hrule}
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bábábábábábábá\hrule}
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bőbőbőbőbőbőbő\hrule}
\bigskip
\vfill\hrule width\hsize
\end{document}

它按预期使用连字符:ba-ba-...,bá-bá-...,bő-bő-...,ár-víz-tű-rő tü-kör-fú-ró-gép。

仅供参考,这是我的原始示例,它适用于pdflatex仅有的:

% p.tex, works with pdflatex only.
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern} \normalfont
\usepackage{t1enc}
\usepackage[hungarian]{babel}
\begin{document}
\showhyphens{árvíztűrő tükörfúrógép}
\hrule width \hsize
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bababababababa\hrule}
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bábábábábábábá\hrule}
\bigskip
\vbox{\Huge\hsize7em\hrule\noindent . . . . . bőbőbőbőbőbőbő\hrule}
\bigskip
\vfill\hrule width\hsize
\end{document}

解决方案说明(聚类):

  • 输入文件采用 UTF-8 编码,文本字体采用T1编码。
  • \usepackage[utf8]{luainputenc}鲁阿输入法需要而不是输入框,否则路拉泰克斯这封信őű根本不会出现。
  • \let\kanjiskip\hsize: 这使得连字符加载而不是丝状菌经过加载hyph-hu.tex,间接加载巴别塔。 我们需要hyphu-hu.ec.tex,因为它包含 T1 编码(而不是 UTF-8)中的连字符模式。
  • \lccode\CCC\CCC例如\lccode"AE="AE:没有这个路拉泰克斯在连字符连接时不会将 ő 和 ű 识别为字母。AE是 T1 编码中 ő 的十六进制代码。
  • 在控制台日志输出中pdflatex在 UTF-8 终端窗口中,该\showhyphens行错误地包含所有重音字符:�rv�zt�-r� t�-k�rf�-r�-g�p 。尽管如此,这些单词的连字符是正确的。
  • 在控制台日志输出中路拉泰克斯在 UTF-8 终端窗口中,该\showhyphens行包含一些错误的重音字符(ő 和 ű):ár-víz-t¶-r® tü-kör-fú-ró-gép。尽管如此,这些单词的连字符是正确的。ő 和 ű 不正确的原因是因为控制台日志输出显示 T1 编码(映射到 UTF-8)中的字符,而 ő 和 ű 是在 T1 和 Unicode 中具有不同位置的字符。

答案2

这并没有直接回答问题,但它显示了我如何调试的一些见解\showhyphens

我正在使用这个源文件:

% Compile it with lualatex.
\documentclass[a4paper]{article}
\usepackage[utf8]{luainputenc}
\usepackage{t1enc}
\usepackage{lmodern}
\usepackage[hungarian,english]{babel}
\begin{document}
\selectlanguage{hungarian}
% Correct hyphenation is ár-víz-tű-rő tü-kör-fú-ró-gép
\showhyphens{árvíztűrő tükörfúrógép}  % Incorrect.
\showhyphens{árvízt\string űr\string ő türkörfúrógép}  % Correct.
{\lccode\string`X="0171 \lccode\string`Y="0151
\lowercase{\showhyphens{árvíztXrY türkörfúrógép}}}  % Correct.
\edef\zzzz{ő}
\typeout{D1: \meaning ő}
\typeout{D2: \number\string`ő}
\typeout{D3: \meaning\zzzz}
\typeout{D4: \expandafter\number\expandafter\string\expandafter`\zzzz}
\hrule
{\Huge árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő
árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő árvíztűrő}
\hrule
\end{document}

控制台日志输出:

D1: macro:->\H o
D2: 337
D3: macro:->®
D4: 174

我的解释:

  • D2 显示 ő 的字符代码为 337,对应于 Unicode 中的 U+0151,即字母 ő。
  • D1 表明 ő 是一个活动字符,它扩展为\H o
  • D3 表明 ő 的完全展开(通过\H o尽可能地展开)是 ®。
  • D4 显示 ® 的字符代码为 174,对应于 T1 编码中的字母 ő(https://en.wikipedia.org/wiki/Cork_encoding)。
  • 这与我在问题中所怀疑的一致:我怀疑问题是由字母 ő 和 ű 引起的,它们在 Unicode 和 T1 编码中处于不同的位置。(所有其他字母,包括 ó 和 é 都位于同一位置。)
  • 当 的参数\showhyphens被扩展时,ő 被转换为 ®,我们得到了错误的连字。连字模式在 Unicode 中为路拉泰克斯
  • 当的参数\showhyphens展开后,\string ő就会转换为ő,从而得到正确的连字符。
  • 类似地,通过\lccode上述技巧,我们可以得到一个非扩展的 ő (U+0151,Unicode 337) 标记,并且得到正确的连字符。
  • 的效果\selectlanguage{hungarian}与 的效果不同\makeatletter\language=\l@hungarian,第一个是正确的。第二个可以防止 tű-rő 连字。
  • 即使我们\usepackage[utf8]{luainputenc}这样做,\usepackage{lmodern}在加载之前babel,连字符模式也将采用 Unicode。
  • 文件丝状菌包含 Unicode(UTF-8)中的匈牙利连字模式,加载hyph-hu.tex负责加载它而不进行编码更改。请注意,还有其他输入文件(例如连字符) 并且有编码转换,但是没有使用。

有关如何的更多信息路拉泰克斯加载连字模式:

\makeatletter
\def\bbl@trace#1{}
\input luababel.def  % Loads language.dat and defines \l@hungarian.
\language=\l@hungarian
\input loadhyph-hu.tex  % Defines \patterns{...} in Unicode (UTF-8).
\lefthyphenmin=1
\righthyphenmin=1
\showhyphens{árvíztűrő türkörfúrógép}  % Correct.
\@@end

通常我们不必手动加载 luababel.def 和 loadhyph-hu.tex,\usepackage[hungarian]{babel}我们会处理好这个问题。

相关内容