自定义编码中的特殊字符/重音命令和连字

自定义编码中的特殊字符/重音命令和连字

我正在做一个项目,需要定义一个自定义编码,我称之为 K7。我的问题是如何让特殊字符的命令起作用。特别是:

  • \k{ }(星火)
  • \TH
  • \th
  • \DH
  • \dh

K7.enc例如,在我的 中,我有/thorn/Thorn。但是,如果我尝试在\th使用此编码的 LaTeX 文档中使用该命令,则会收到以下错误

! LaTeX Error: Command \th unavailable in encoding K7.

我认为我遗漏了一些将这些命令映射到编码中的字符的额外步骤,但它是什么?不幸的是,信息很少。

另外,我怎样告诉 TeX 在哪里替换连字符?

答案1

我假设您的 K7 编码包含 T1 中不可用的字符。这有多个阶段。

我将描述 T1 发生的情况。

步骤1

我们有一个 Type1 字体,其中包含远超 256 个字形。为了访问它们,我们需要一个编码向量,例如cm-super-t1.enc包含

% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;
% LIGKERN quoteleft quoteleft =: quotedblleft ;
% LIGKERN quoteright quoteright =: quotedblright ;
% LIGKERN comma comma =: quotedblbase ; less less =: guillemotleft ;
% LIGKERN greater greater =: guillemotright ;
% LIGKERN f f =: ff ; f i =: fi ; f l =: fl ; ff i =: ffi ; ff l =: ffl ;
%
% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;
% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;
% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;
% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;
% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;
% LIGKERN nine {} * ; * {} nine ;
%
/T1Encoding [
% 0x00
/grave
/acute
/circumflex
/tilde
/dieresis
/hungarumlaut
/ring
/caron
/breve
/macron
/dotaccent
[...]
/oslash
/ugrave
/uacute
/ucircumflex
/udieresis
/yacute
/thorn
/germandbls % or /germandbls.alt
] def

这将为字形分配插槽。当字体通过pdftex以下dvips行加载时,您需要一个映射文件来执行重新编码,例如

ecrm1000 SFRM1000 " T1Encoding ReEncodeFont " <cm-super-t1.enc <sfrm1000.pfb

其中SFRM1000是 Type1 字体的名称,ecrm1000是相应的 TFM 文件,sfrm1000.pfb是字体文件。可以使用fontinst或获得 TFM 文件(可能附带 VF 文件) afm2tfm

pdftex该映射文件可以在运行时通过\pdfmapfiledvips命令行选项加载。

第2步

您必须准备一个t1enc.def文件,将 LICR 分配给插槽。该文件包含

\ProvidesFile{t1enc.def}
 [2016/06/19 v1.99m
         Standard LaTeX file]
\DeclareFontEncoding{T1}{}{}
\DeclareTextAccent{\`}{T1}{0}
\DeclareTextAccent{\'}{T1}{1}
\DeclareTextAccent{\^}{T1}{2}
\DeclareTextAccent{\~}{T1}{3}
\DeclareTextAccent{\"}{T1}{4}
[...]
\DeclareTextSymbol{\textvisiblespace}{T1}{32}
\DeclareTextSymbol{\th}{T1}{254}
\DeclareTextComposite{\.}{T1}{i}{`\i}
\DeclareTextComposite{\.}{T1}{\i}{`\i}
\DeclareTextComposite{\u}{T1}{A}{128}
\DeclareTextComposite{\k}{T1}{A}{129}
[...]

例如,\th映射到插槽 254 并且组合映射\k{A}到插槽 129(带有 ogonek 的 A)。

步骤3

您可以选择需要一个文件t1enc.dfu,用于将字符的 Unicode 表示形式映射到 LICR

  \ProvidesFile{t1enc.dfu}
   [2016/02/28 v1.1s UTF-8 support for inputenc]
\DeclareUnicodeCharacter{00A0}{\nobreakspace}
\DeclareUnicodeCharacter{00A1}{\textexclamdown}
\DeclareUnicodeCharacter{00A3}{\textsterling}
\DeclareUnicodeCharacter{00AB}{\guillemotleft}
\DeclareUnicodeCharacter{00AD}{\-}
[...]
\DeclareUnicodeCharacter{00FE}{\th}
[...]
\DeclareUnicodeCharacter{0104}{\k A}
[...]

因此将在读取(并使用)文件时Ą映射到,然后在当前输出编码为 T1 时映射到插槽 129。\k A\usepackage[utf8]{inputenc}

最后说明

步骤 1 中提到的 TFM/VF 文件的准备对于此工作至关重要,因为 TeX 需要它们。有关连字和字距调整的信息属于此阶段。该fontinst套件有非常详尽的手册。

结论

使用 XeTeX/LuaTeX 和 OpenType 字体。

相关内容