我有一个文档,它通过 pandoc 从源文件中获取文本(无论如何这都无关紧要)并将其插入而不是 $body$。源文档包含十六进制编辑器中显示的唯一一个符号“C2 AD”。我发现,它是一个 UTF-8 字符“U+00AD”——软连字符。我尝试使用 \DeclareUnicodeCharacter 命令来处理它,方法如下:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\DeclareUnicodeCharacter{00AD}{\-}
\begin{document}
$body$
\end{document}
但 Xelatex 仍然返回错误:“!包 inputenc 错误:在输入编码‘utf8’中,使用的键盘字符未定义(inputenc)。”
当我尝试使用 utf8x 而不是 utf8 时:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T2A]{fontenc}
\DeclareUnicodeCharacter{00AD}{\-}
\begin{document}
$body$
\end{document}
它返回:“!LaTeX 错误:缺少 \begin{document}”。
我做错了什么?
答案1
\usepackage[utf8]{inputenc}
或\usepackage[utf8x]{inputenc}
对于不支持 UTF-8 的 TeX 引擎是必需的。然后 TeX 会看到两个字节 C2 和 AD,utf8.def
或者utf8x.def
激活 C2 来捕获 AD,以打印符号或执行\-
或诸如此类的操作。
在 XeTeX 中,字节 C2 AD 成为“大”字符 AD。“大”字符意味着字符代码 >= 256 的字符是可能的。然后您可以激活该字符并赋予它您要求的含义:
% XeTeX or LuaTeX
\catcode`\^^ad=\active
\let^^ad=\-
答案2
我不建议使用utf8x
; 与包选项utf8x
一起inputenc
使用inputenx
,但它也适用于 XeLaTeX 和 LuaLaTeX,您可以使用newunicodechar
:
\documentclass{article}
%%% Optional part if you want to use multiple engines
\usepackage{ifxetex,ifluatex}
\newif\ifxetexorluatex
\ifx\ifxetex\ifluatex % see http://tex.stackexchange.com/a/140164/
\xetexorluatextrue
\fi
\ifxetexorluatex\else
\usepackage[utf8]{inputenx}
\fi
%%% End of optional part
%%% Use just the following line if you only compile with pdflatex
%\usepackage[utf8]{inputenx}
\usepackage{newunicodechar}
\newunicodechar{}{\-} % the first argument contains U+00AD