我正在做一个项目,需要定义一个自定义编码,我称之为 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
该映射文件可以在运行时通过\pdfmapfile
或dvips
命令行选项加载。
第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 字体。