我正在尝试弄清楚如何使用 OPmac 处理西班牙语文档,因为在纯 TeX 中可以轻松设置结构文档。但是,使用pdfcsplain
或xetex
/luatex
引擎,我无法处理连字符模式,而且我不确定管理某些 UTF8 符号的最佳方法,因为我在纯 TeX 方面经验不足。
根据他们的网站,计算机科学普林专为捷克语和斯洛伐克语设计,但“已准备好加载 54 种语言的连字模式”。虽然我不清楚下一步是什么。我猜应该是\esUnicode
and/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 字体(例如)解决这个Ñ
问题:€
→
xetex
luatex
\input ucode
\input cs-schola
\input opmac
\input ucode
\input cs-schola
Uno → Dos → Tres. Me darán 50 € y 24 ¢.
\bye
而在pdfcsplain
with中,\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
如果没有映射,结果将是:
那么,我想知道如果尊重编码,有一些限制较少的解决方案(即不限于 TeX Gyre 字体)或更省力(即无需映射)即可获得最宽的 UTF8 频谱。
答案1
我不知道如何OPmac
与此整合;但如果您按照手册中的说明进行操作hyplain
,只需进行少量添加,您就可以将西班牙语连字符化。
- 创建工作目录
spanishtest
并cd
进入该目录 在工作目录中,
hylang.tex
使用cp $(kpsewhich hylang.tex) .
编辑
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
转储格式
xetex -ini -etex hyplain
暂时结束
现在,写入文件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 格式。