使用 inputenc 从 .txt 文件导入语音字符失败

使用 inputenc 从 .txt 文件导入语音字符失败

我正在尝试导入我在 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 字符(代码点)的序列:

所以重复一遍,它的主要作用\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 引擎:您需要做的(大多数情况下)是使用xelatexlualatex而不是latex或进行编译pdflatex。它们构建为了解 Unicode 并将每个 Unicode 代码点像任何其他字符一样对待:它们看到 U+0301 COMBINING ACUTE ACCENT 并只输出该字符,而您要求它们使用的(现代,OpenType)字体将包含有关如何显示该字符的信息。

相关内容