我正在尝试导入我在 Toolbox(90 年代的语言学家软件)中制作的一本词典。我目前将词典保存在一个 .txt 文件中,LaTeX 应该能够使用样式文件重现该文件。在 .txt 文件中,我定义了词典中每个条目的不同部分:词素 (\LX)、英文翻译 (\GE)、音标 (\PH) 等。
.txt 文件中用于音标的字体应直接导入 LaTeX。.sty 文件中执行此操作的行可能如下:
\newcommand\PH[1]{\textipa{#1}}
我的.tex:
\documentclass[12pt]{article}
\usepackage[a4paper, margin=1.3cm, twocolumn, columnsep=.3cm, driver=dvips]{geometry}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{dict}%use the style file
\usepackage{paralist}%for the \compactdesc environment
\usepackage{tgtermes}
\setdefaultleftmargin{1em}{}{}{}{}{}%for illustrations
\usepackage{pstricks}
\psset{arrows=c-c}
\usepackage{overpic}
\usepackage{graphicx}
\newlength\cus
\sloppy
\begin{document}
\setlength\cus{0.08\linewidth}
\psset{linewidth=.5pt}
\begin{compactdesc}
\input{texdictkjempebra.txt}% source file
\end{compactdesc}
\end{document}
我猜想 inputenc 也应该负责导入我的奇怪字符。
下面是我的 .txt 字典中的一些示例行(以 UTF8 格式保存):
\LX{ahat} \ph ahát̚ \PS{n} \GE{Sunday} \GN{hari mingu} \bw < Arab.
\LX{ajari} \ph adɟári \PS{v} \GE{to teach} \GN{mengajar}
\LX{bol} \ph bɔl \PS{n} \GE{mouth} \GN{mulut} \NT{wl 6}
\LX{bolkul} \ph bɔlkúl \PS{n} \GE{lip} \GN{bibir} \NT{wl 7}
\ph 后面的内容未正确导入:
我收到以下错误代码(即使已创建 .pdf):
Package inputenc Error: Unicode char (U+FEFF)(inputenc) not set up for use with LaTeX.
Undefined control sequence. \LX{ahat} \ph a
Package inputenc Error: Unicode char ́ (U+301)(inputenc) not set up for use with LaTeX. \LX{ahat} \ph ahá
Package inputenc Error: Unicode char ̚ (U+31A)(inputenc) not set up for use with LaTeX. \LX{ahat} \ph ahát̚
我猜你需要样式文件才能正确重现。我不认为我可以在这里附加任何内容,但该文件(我修改过,你至少需要激活 \ph 的代码)可以在以下网址下载http://www.zas.gwz-berlin.de/uploads/media/dict.sty。
那么:如何让 LaTeX 正确读取和打印我的输入文件?LaTeX 似乎无法读取准确重音(代表高音调)和变音符号“角”。为了解决第一个错误消息,我尝试添加\DeclareUnicodeCharacter{FEFF}{}
到序言中,但随后出现以下错误:
Undefined control sequence. \DeclareUnicodeCharacter
Missing \begin{document}. \DeclareUnicodeCharacter{F
答案1
[U+FEFF]是某些软件放置在 unicode 文件顶部的非打印字节顺序标记(“BOM”),并且特别被 Microsoft 用作区分 unicode 文件的魔术字符,但它不是标准“UTF-8”编码的一部分。
正如 egreg 所说,在序言中定义。我会将其放在 \inputenc 语句之后: \DeclareUnicodeCharacter{FEFF}{}
或者,将您的 .tex 文件保存为标准 UTF-8(而不是“带有 BOM 的 UTF-8”[并且不是]“带有字节顺序标记的 UTF-8”。
并且,对于每个仍然会产生“输入错误”的字符......
! Package inputenc Error: Unicode char (U+????)
(inputenc) not set up for use with LaTeX.
...对于这些,您还需要为每个不同的实例设置 \DeclareUnicodeCharacter{?}{?},但一定要放置适当的替换值,因为使用“BOM” [U+FEFF] 您实际上并没有用可打印字符替换,您只是消除了“魔法字符”。
答案2
如果使用\usepackage[utf8]{inputenc}
,它可以帮助 TeX 将输入文件中的 (UTF-8) 字节序列理解为 Unicode 字符,而不是单个字节。例如,在 Unicode 中,ahát̚
是六个 Unicode 字符(代码点)的序列:
- U+0061 拉丁小写字母 A,以 UTF-8 编码为
61
- U+0068 拉丁小写字母 H,以 UTF-8 编码为
68
- U+0061 拉丁小写字母 A,以 UTF-8 编码为
61
- U+0301 结合尖锐重音,以 UTF-8 编码为
CC 81
- U+0074 拉丁小写字母 T,以 UTF-8 编码为
74
- U+031A 结合上方左角,以 UTF-8 编码为
CC 9A
所以重复一遍,它的主要作用\usepackage[utf8]{inputenc}
是帮助 TeX 将其解释ahát̚
为 6 个 Unicode 字符的序列,而不是 8 个单独的字节。
(补充:ahát̚
它也可以是 5 个代码点,而不是 6 个,因为 Unicode 包含一个预组合á
字符U+00E1 带有尖音符的拉丁小写字母 A但是 Unicode 并不包含所有可能的组合的预制字符,例如“t 与上面的左角组合”。)
但即使有 的帮助inputenc
,TeX 本身也不知道所有 Unicode 的东西,比如如何处理组合字符。在某种程度上,它可以被教导如何处理给定的 Unicode 字符,这就是它所做的\DeclareUnicodeCharacter
:你可以用 来表示“当你看到 Unicode 字符 FEFF 时,什么也不做” \DeclareUnicodeCharacter{FEFF}{}
。(顺便说一句,这行需要在你加载 之后添加inputenc
。)
典型的 TeX 发行版确实带有相当多的此类定义;例如“当你看到Unicode 字符 1E56,排版一个上面带点的 P”(由TeX Live\DeclareUnicodeCharacter{1E56}{\.P}
中的行给出tex/latex/oberdiek/ix-utf8enc.dfu
)。
但实际上,并非所有东西都能给出这样的定义;在 TeX 中,如何为 U+0301 COMBINING ACUTE ACCENT 给出定义,相当于“返回并找到您已经排版的上一个字符,并在正确的位置加上重音符号”?(这可能是可以做到的;这只是一种 hack。)
相反,您应该考虑兼容 Unicode 的 XeTeX 或 LuaTeX 引擎:您需要做的(大多数情况下)是使用xelatex
或lualatex
而不是latex
或进行编译pdflatex
。它们构建为了解 Unicode 并将每个 Unicode 代码点像任何其他字符一样对待:它们看到 U+0301 COMBINING ACUTE ACCENT 并只输出该字符,而您要求它们使用的(现代,OpenType)字体将包含有关如何显示该字符的信息。