使用 pdfcsplain、xetex 和 luatex 在纯 TeX 中显示西班牙语连字符和 UTF8 字符

使用 pdfcsplain、xetex 和 luatex 在纯 TeX 中显示西班牙语连字符和 UTF8 字符

我正在尝试弄清楚如何使用 OPmac 处理西班牙语文档,因为在纯 TeX 中可以轻松设置结构文档。但是,使用pdfcsplainxetex/luatex引擎,我无法处理连字符模式,而且我不确定管理某些 UTF8 符号的最佳方法,因为我在纯 TeX 方面经验不足。

根据他们的网站,计算机科学普林专为捷克语和斯洛伐克语设计,但“已准备好加载 54 种语言的连字模式”。虽然我不清楚下一步是什么。我猜应该是\esUnicodeand/or之类的东西\eslang,但我所有的尝试都失败了。

所以,第一个问题是如何添加西班牙语连字符对于这两个最小工作示例:

对于 xetex/luatex:

\input opmac
\input ucode
\input cs-schola 
\margins/1 a5 (4,5,1,1)cm  
\typosize[12/14] 
\parindent10pt\parskip1em 
Fantástico, seguro que mañana vendré a tiempo.
\bye

姆韦

如图所示,这里的问题是“mañana”中缺少连字符(应该是“ma-ñana”或“maña-na”),导致过满。使用默认字体也存在\hbox同样的问题 :pdfcsplain

\input opmac
\input utf8lat1 
\margins/1 a5 (4,5,1,1)cm  
\typosize[12/14] 
\parindent10pt\parskip1em 
Fantástico, seguro que mañana vendré a tiempo.
\bye

姆韦

另一方面,如上所示,任何方法都支持重音符号(á、é、í、...),但不支持西班牙语文档中的一些常见 UTF8 符号(如ñ、、)和其他一些符号(如)。据我所知,使用或可以使用TeX Gyre 字体(例如)解决这个Ñ问题:xetexluatex\input ucode\input cs-schola

\input opmac
\input ucode 
\input cs-schola 
Uno → Dos → Tres.  Me darán 50 € y 24 ¢.
\bye

姆韦

而在pdfcsplainwith中,\input utf8lat1我可以使用ñ\~n不是 其他符号。虽然这些符号可能按照计算机科学普林 页面,如果需要映射太多,这似乎是一项非常艰巨的任务:

\input opmac
\input utf8lat1 

% To avoid 
%WARNING: unknown UTF-8 code: `→ = ^^e2^^86^^92' 
%WARNING: unknown UTF-8 code: `€ = ^^e2^^82^^ac' 
%WARNING: unknown UTF-8 code: `ñ = ^^c3^^b1' 
% WARNING: unknown UTF-8 code: `¢ = ^^c2^^a2'

 \mubyte\eurochar ^^e2^^82^^ac\endmubyte%
 \def\eurochar{{\eurofont e}}%
 \font\eurofont=feymr10%

\mubyte\flecha ^^e2^^86^^92\endmubyte%
\def\flecha{$\rightarrow$}%

\mubyte\Cent ^^c2^^a2\endmubyte%
\def\Cent{céntimos}%

 Uno → Dos → Tres.  Mañana me darán 50 € y 24 ¢.

\bye

MWE4

如果没有映射,结果将是:

姆韦

那么,我想知道如果尊重编码,有一些限制较少的解决方案(即不限于 TeX Gyre 字体)或更省力(即无需映射)即可获得最宽的 UTF8 频谱。

答案1

我不知道如何OPmac与此整合;但如果您按照手册中的说明进行操作hyplain,只需进行少量添加,您就可以将西班牙语连字符化。

  1. 创建工作目录spanishtestcd进入该目录
  2. 在工作目录中,hylang.tex使用

    cp $(kpsewhich hylang.tex) .
    
  3. 编辑hyrules.tex文件成为

    %%% This is hylang.tex (version 1.0), where language definitions
    %%% actually occur. The first one should always be
    %%% American English, for compatibility with plain TeX.
    %%%
    %%% Users can modify this file in order to define the
    %%% languages they need.
    %%%
    %%% Every language definition should be followed by a
    %%% \refinelanguage command where conventions specific to 
    %%% the language are set; users should at least provide 
    %%% the left and right hyphenation minima using
    %%% \hyphenmins{<left>}{<right>}
    %%%
    %%% In the third argument one puts what has to be done
    %%% when activating the language; in the fourth argument
    %%% what needs to be undone.
    
    %%% US English must always come first
    \definebaselanguage{en}{US}{hyphen} %%% <--- don't modify
    \refinelanguage{en}{US}{\hyphenmins{2}{3}}{}
    
    %%% fix the lccode tables
    \input unicode-letters.def
    
    %%% Spanish
    \definelanguage{es}{ES}{loadhyph-es}
    \refinelanguage{es}{ES}{\hyphenmins{2}{2}}{}
    
    %%% Add other languages if needed
    %%%
    %%% The arguments to \definelanguage are:
    %%% #1: the language code; it is an arbitrary string, use the 
    %%%     ISO two-letter language code for uniformity, or `nde' for
    %%%     new orthography German
    %%% #2: the nation code; use the uppercase ISO two-letter code
    %%% #3: the file with hyphenation patterns
    %%%
    %%% The arguments to \refinelanguage and \refinedialect are:
    %%% #1 and #2: a pair defined through \definelanguage or \definedialect
    %%% #3: commands to be executed when entering the language
    %%% #4: commands to be undone when entering a new language
    %%%
    % \definelanguage{xx}{YY}{xxhyph}
    % \refinelanguage{xx}{YY}{<something>}{<something>}
    %
    % \definedialect{aa}{BB}{xx}{XX}
    % \refinedialect{aa}{BB}{<something>}{<something>}
    
    % At last the fallback, a language with no patterns
    \definelanguage{zz}{ZZ}{zerohyph}
    % \refinelanguage{zz}{ZZ}{}{} % no need to set conventions
    
    %%% Aliases
    \addalias\US{en}{US}
    \addalias\SP{es}{ES}
    \addalias\ZZ{zz}{ZZ}
    \addalias\nohyphens{zz}{ZZ}
    
    \endinput
    
  4. 转储格式

    xetex -ini -etex hyplain
    
  5. 暂时结束

现在,写入文件spanishtest.tex

%% we need to use OpenType fonts
\font\tenrm="CMU Serif" at 10pt
\tenrm

\selectlanguage{es}{ES}

\vbox{\hsize=0pt \overfullrule=0pt
\hskip0pt Fantástico, seguro que mañana vendré a tiempo.
}
\bye

使用以下方式编译

xetex -fmt hyplain spanishtest

结果如下:

在此处输入图片描述

当你满意后,你可以输入hyplain.fmt,例如,

$TEXMFHOME/web2c/xetex/

因此当从任何目录调用时它都是可用的(使用xetex -ini -etex,您可以在 shell 中定义 的别名)。


另一方面,默认xetex.fmt格式已经包含了对 中定义的所有语言的支持language.def,因此一切也可以正常工作hyplain:只需将测试文件更改为

\font\tenrm="CMU Serif" at 10pt
\tenrm

\uselanguage{espanol}

\vbox{\hsize=0pt \overfullrule=0pt
\hskip0pt Fantástico, seguro que mañana vendré a tiempo.
}
\bye

当然,OpenType 字体对于连字和一般排版成功必不可少。但hyplain它更具可定制性,尽管有点困难。请注意,只要添加

\input luaotfload.sty

在定义 OpenType 字体之前。

无论如何,OPmac 没有定义 OpenType 字体,您必须提供它们的定义。

答案2

似乎有很多问题。例如,标题和帖子第一段提到了连字符,但之后就没再提到了。你正在处理缺失字符,并且正在改变方式:tex 引擎、格式、字体。所以我不确定你的问题的核心在哪里。

首先:OPmac 和你的问题无关。你需要在“纯 TeX”中准备好 texengine+format+hyphenation 来处理西班牙语字母,然后才能使用 OPmac。此外,使用 OPmac 时不需要 CSplain 格式。

编码注释:您很幸运,您的语言的字母采用 ISO-8859-1 编码,它是 T1 TeX 编码和 Unicode 的子集。这意味着您可以加载任何 T1 编码或 Unicode 字体,并且如果激活了 utf8->Unicode 转换,您的语言将可以使用。此转换在xetex或中自动激活luatex

有一个有趣的例外:尽管 T1 编码是为欧洲语言设计的,但其中却没有 Eur 符号。原因:T1 编码是在 1992 年设计的,也就是说,当时还不存在 Eur 符号。

您第一次尝试使用 csplain(更准确地说是使用pdftex+ 激活的 encTeX)。\input utf8lat1仅针对 ISO-8859-1 中定义的字符激活从 utf8 的转换。它不是右箭头,也不是 Eur,也不是描边 c。

是否在 CSplain 文档中应用有很大区别\input t1code。例如,如果\input t1code未使用 ñ 符号,则将其转换为重音符号加 n;如果使用\input t1code(或\input ucode),则将其转换为 ñ 的 Unicode=ISO-8859-1=T1 代码。第一种方法(重音符号加 n)有缺点:无法使用连字符,但有一个优点:它适用于纯 TeX 中预加载的经典 Knuth 字体。

CSplain 可以与经典的 Knuth TeX 或pdftex或 一起运行xetex。它已准备好用于英语、捷克语和斯洛伐克语。也可以使用其他语言,但必须使用适当的连字表重新生成 csplain。这在 CSplain 文档中有描述。我将修订此文档,并添加一个使用其他语言的 CSplain 的示例。

答案3

您可以通过以下方式激活 OPmac 默认要求的 csplain 西班牙语模式:删除 hyphen.lan 文件中激活该命令的行中的注释, 进而重新生成 csplain 和 pdfcsplain 格式

相关内容