输入编码和特殊字符

本章我们将讨论与输入编码、排版重音符号和特殊字符相关的问题。

在以下文档中,我们将“特殊字符”指代除小写字母 a–z、大写字母 A-Z、数字 0–9 和英语标点符号之外的所有符号。

某些语言通常需要专门的输入系统来方便文档写作。这些语言包括阿拉伯语、中文、日语、韩语等。此类特定问题将在国际化部分中讨论。

生产带有附加符号的字符的规则(如重音符号)在文本模式、数学模式和制表环境中有所不同。

输入编码

TeX 默认使用 ASCII。但 128 个字符不足以支持非英语语言。TeX 有自己的一套处理方法,通过命令处理每个重音符号(参见转义代码)。但是,如果我们希望在源文件中直接显示重音和其他特殊字符,就必须告诉 TeX 我们希望使用不同的编码。

LaTeX 提供了几种编码方式:

  • ASCII:默认编码,仅支持英文字符。

  • ISO-8859-1(即 Latin 1):8 位编码,支持大部分拉丁语言的字符,但仅限于此。

  • UTF-8:一种 Unicode 多字节编码,支持完整的 Unicode 规范。

  • 其他...

在此,我们假设你希望使用 UTF-8 编码。

指定编码的步骤

  1. 确保文本编辑器以 UTF-8 解码文件。

  2. 确保文本编辑器以 UTF-8 保存文件。大多数文本编辑器不会区分,但有些编辑器如 Notepad++ 会做出区分。

  3. 如果你在终端工作,确保它支持 UTF-8 输入和输出。一些旧的 Unix 终端可能不支持 UTF-8。PuTTY 默认不使用 UTF-8,需要手动配置。

  4. 告诉 LaTeX 文件是 UTF-8 编码:

    \usepackage[utf8]{inputenc}
    

inputenc 包会告诉 LaTeX 你的 .tex 文件的文本编码格式。

如果你检查字符编码(例如使用 Unix 的 file 命令),确保你的文件包含至少一个特殊字符,否则它会被识别为 ASCII 编码(这是合逻辑的,因为 UTF-8 是 ASCII 的超集)。

inputenc 包还允许用户在文档内更改编码,方法是使用命令:

\inputencoding{'encoding name'}

扩展支持

LaTeX 对 UTF-8 的支持相对有限:它仅包含已知当前字体编码中可用的字符符号。因此,你可能会遇到以下错误:

! Package inputenc Error: Unicode char \u8:ũ not set up for use with LaTeX.

这是因为 UTF-8 定义不一定涵盖你在键盘上能输入的所有字符。例如:

  • ŷ Ŷ ũ Ũ ẽ Ẽ ĩ Ĩ

在这种情况下,你可以尝试使用 utf8x 选项来定义更多的字符组合。utf8x 并非官方支持,但在某些情况下是可行的。不过,它可能会破坏与某些包(如 csquotes)的兼容性。

另一种方法是继续使用 utf8 并自己定义这些字符。这很容易:

\DeclareUnicodeCharacter{'codepoint'}{'TeX sequence'}

其中 codepoint 是所需字符的 Unicode 码点,TeX sequence 是在遇到该字符时打印的内容。例如:

\DeclareUnicodeCharacter{0177}{\^y}

现在输入 ŷ 将有效地打印 ŷ

转义代码

除了直接的 UTF-8 输入外,LaTeX 还支持通过转义符号构造特殊字符。如果你的键盘缺少某些重音符号或其他附加符号,这会很方便。

以下是可以放在字母上的重音符号,尽管大多数示例使用字母 "o",这些重音符号可以放在任何字母上。甚至可以在“缺失”的字母上放置重音符号;例如,\~{} 会在空白处加上一个波浪符号。

以下命令仅能在段落(默认)模式或 LR(左右)模式下使用。

LaTeX 命令 示例 描述
`{o} ò 重音符号(grave accent)
'{o} ó 急音符号(acute accent)
^{o} ô 旋转符号(circumflex)
"{o} ö 两点符号(umlaut)
\H{o} ő 匈牙利重音符(double acute)
~{o} õ 波浪符号(tilde)
\c{c} ç Cedilla(下加符号)
\k{a} ą Ogonek(点状符号)
\l{} ł 划线的 l(带划线的 l)
={o} ō 横线符号(macron)
\b{o} o 下划线符号(bar under the letter)
.{o} ȯ 上点符号(dot over the letter)
\d{u} 下点符号(dot under the letter)
\r{a} å 圆环符号(ring over the letter)
\u{o} ŏ Breve 符号(breve over the letter)
\v{s} š Caron/háček 符号("v")
\t{oo} o͡o 连接符号(inverted u)
\o{} ø 划线的 o(带划线的 o)
{\i} ı 无点 i(没有小圆点的 i)

旧版本的 LaTeX 在为字母 ij 添加重音符号时,不会去掉字母上的点。为了解决这个问题,你需要使用这些字母的无点版本,通过输入 \i\j。例如:

  • \^{\i} 应用于 i 的旋转符号 î

  • \"{\i} 应用于 i 的两点符号 ï

然而,当前版本的 LaTeX 不再需要这样做(实际上可能会报错)。

如果文档是完全用需要特定重音符号的语言编写的,那么使用正确的配置可以让这些字符直接在文档中编写。例如,要便于输入重音符号,可以通过配置 babel 包为 \usepackage[german]{babel}。这为“o”提供了简写符号 \"o。如果需要在标签中使用文本重音符号,这非常有用,因为否则不会接受反斜杠。

更多关于语言配置的息,请参见国际化部分。

小于符号 < 和大于符号 >

符号 '<' 和 '>' 实际上是 ASCII 字符,但你可能会注意到它们会打印出 '¡' 和 '¿'。这是由于字体编码问题。如果你希望它们打印出真实符号,你需要使用其他字体编码,如 T1,并使用 fontenc 包加载它。有关字体编码的更多详细息,请参见“字体”部分。

另外,您可以使用专门的命令来打印它们:

\textless
\textgreater

欧元符号 (€)

在谈论货币时,现在需要使用欧元符号。textcomp 包提供了 \texteuro 命令,它会根据你当前的文本字体打印欧元符号。根据你选择的字体,这个符号可能与官方符号有些不同。

欧元符号的官方版本可以通过 eurosym 包提供。在文档的前导部分加载该包(可选地使用 official 选项):

\usepackage[official]{eurosym}

然后,你可以使用 \euro{} 命令插入符号。如果你希望欧元符号与当前的字体样式(例如,粗体、斜体等)匹配,可以使用不同的选项:

\usepackage[gen]{eurosym}

然后,同样可以使用 \euro{} 插入欧元符号。

另外,你也可以使用 marvosym 包,它也提供了官方的欧元符号:

\usepackage{marvosym}
% ...
\EUR{}

现在,如果你希望键盘上的 '€' 键实际上输出与上述相同的欧元符号,你可以使用一个简单的方法。你需要确保使用 UTF-8 编码,并且有一个有效的 \euro{}\EUR{} 命令。

\DeclareUnicodeCharacter{20AC}{\euro{}}
% 或者
\DeclareUnicodeCharacter{20AC}{\EUR{}}

完整示例:

\usepackage[utf8]{inputenc}
\usepackage{marvosym}
\DeclareUnicodeCharacter{20AC}{\EUR{}}

温度符号和数学符号的度数符号

打印温度和角度值的最简单方法是使用 siunitx 包中的 \SI{value}{unit} 命令,该命令适用于文本模式和数学模式:

\usepackage{amsmath}
\usepackage{siunitx}
%...

A $\SI{45}{\degree}$ angle.

It is \SI{17}{\degreeCelsius} outside.

更多息,请参阅 siunitx 包的文档。

常见的错误是使用 \circ 命令,它不会打印正确的字符(虽然 $^\circ$ 会)。改用 textcomp 包,它提供了一个 \textdegree 命令:

\usepackage{textcomp}
%...

A $45$\textdegree angle.

对于温度,您可以使用相同的命令,或选择 gensymb 包并写:

\usepackage{gensymb}
\usepackage{textcomp}
%...

17\,\celsius % 最好使用 textcomp

某些键盘布局上带有度符号,如果你使用的是 UTF-8 和 textcomp,可以直接使用它。为了获得更好的字体质量,我们建议使用适当的字体,如 lmodern

\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{textcomp}

% ...

17\,°C

17\,℃ % 最好使用

其他符号

LaTeX 拥有许多可用的符号。大多数符号位于数学领域,后续章节将讨论如何访问它们。对于常见的文本符号,请使用以下命令:

命令 示例 字符
% % %
$ $ $
{ { {
_ _ _
\P
\ddag n/a
\textbar n/a
\textgreater > >
\textendash n/a
\texttrademark n/a
\textexclamdown n/a ¡
\textsuperscript{a} X a
\pounds n/a £
# # #
& & &
} } }
\S § §
\dag n/a
\textbackslash n/a \
\textless < <
\textemdash n/a
\textregistered n/a ®
\textquestiondown n/a ¿
\textcircled{a} n/a
\copyright n/a ©

在上述表格中没有提到,波浪符号 (~) 在 LaTeX 代码中用于生成不换行的空格。要打印波浪符号,可以写 \~{}\textasciitilde{}。而一个可见的空格 ␣ 可以通过 \textvisiblespace 创建。

更有趣的符号

Postscript ZapfDingbats 字体可通过 pifont 包提供。将以下声明添加到文档的前导部分:

\usepackage{pifont}

接下来,使用命令 \ding{number} 来打印指定的符号。以下是可用符号的表格

ZapfDingbats 符号

在特殊环境中

数学模式

上面提到的几种符号以及一些相似的重音符号也可以在数学模式中生成。以下命令仅适用于数学模式:

LaTeX 命令 示例 描述 文本模式等效命令
\hat{o} o^ Circumflex \^
\widehat{oo} o o^ \hat 的宽版本覆盖多个字母 -
\check{o} Vee 或 Check \v
\tilde{o} o~ Tilde \~
\widetilde{oo} o o~ \tilde 的宽版本覆盖多个字母 -
\acute{o} Acute accent \'
\grave{o} o` Grave accent \
\dot{o} 点在字母上 \.
\ddot{o} 两个点在字母上(Umlaut) \"
\breve{o} Breve \u
\bar{o} Macron \=
\vec{o} o→ 向量(箭头)在字母上 -

当对字母 ij 添加重音符号时,可以使用 \imath\jmath 来避免点与重音符号干扰:

LaTeX 命令 示例 描述 带上方点的示例
\hat{\imath} ı^ 对字母 i 使用 circumflex,没有上方点 i^
\vec{\jmath} ȷ→ 对字母 j 使用向量(箭头),没有上方点 j→

制表环境

在运行文本中使用的一些重音符号,在制表环境中有其他用途。此时,它们可以通过以下命令创建:

  • \a' 表示急性重音(Acute accent)

  • `\a`` 表示重音符号(Grave accent)

  • \a= 表示长音符号(Macron accent)

Unicode 键盘输入

有关 Unicode 输入的相关息,请参见 Wikipedia 上的 Unicode input

一些操作系统提供键盘组合来输入任何 Unicode 码点,这就是所谓的 Unicode 组合键。

许多 X 应用程序(*BSD 和 GNU/Linux)支持 Ctrl+Shift+u 组合键。按下组合键后,应该会显示一个 "u" 符号。然后键入码点并按 Enter 或空格键来打印字符。例如:

<Ctrl+Shift+u> 20AC <space>

这将打印欧元符号。

桌面环境如 GNOME 和 KDE 可能有一个可自定义的组合键,用于输入更容易记住的序列。

Xorg 提供了先进的键盘布局,带有变种,使得您可以轻松使用组合键和适当的修饰符(如 Alt Gr)输入大量字符。具体取决于所选布局和变种,您可以尝试通过每个键前面加上 Alt Gr 修饰符来实验。

在 Windows 上,您可以按住 Alt 键并键入码点来输入所需字符。例如:

<Alt> + 0252

将打印出德文字母 ü。

外部链接


最后修改: 2025年04月20日 星期日 10:48