
Я хочу сделать перекрестные ссылки для разделов, чтобы они были символами, но после использования данного описания я получил отчет об ошибке, в котором говорилось, что используемый символ клавиатуры не определен в кодировке ввода 'utf8'. Какой может быть выход?
решение1
Если вы попытаетесь набрать тест в кодировке utf8 в LaTeX (со стандартным движком TeX) с помощью пакета, inputenc
то произойдет следующее:
- LaTeX анализирует символ utf8, считывая нужное количество 8-битных символов, которых может быть один или несколько, в зависимости от того, какой символ находится в документе.
- Это даст LaTeX символ Unicode с определенным номером Unicode (после некоторых вычислений), скажем
00A1
- Теперь LaTeX попытается набрать этот символ, но для этого должен быть загружен шрифт, который фактически содержит глиф, представляющий символ Unicode, и...
- LaTeX должен знать этот факт.
- LaTeX узнает об этом через довольно большое количество объявлений вида:
\DeclareUnicodeCharacter{00A1}{\textexclamdown}
. - Это преобразует число Unicode во внутреннее представление символа LaTeX (LICR).
- Но это не было бы очень полезно, если бы не было глифа, который можно было бы использовать для печати этого символа. Поэтому пакет
inputenc
устанавливает только те символы юникода, для которых загружены шрифты, содержащие их. - Например, если вы загружаете
T1
закодированные шрифты через ,\usepackage[T1]{fontenc}
то внутренне LaTeX загружает все объявления, определенные в файлеt1enc.dfu
. (Для каждой установленной кодировки шрифтов LaTeX существует соответствующий.dfu
файл.) - Но Unicode охватывает огромное количество символов, поэтому если вы случайно поместите в документ символ, который не входит ни в одну из кодировок шрифтов, используемых LaTeX, то вы получите сообщение об ошибке, сообщающее, что этот символ Unicode не настроен.
Что же можно сделать, чтобы решить эту проблему для конкретного документа?
- Первый шаг — определить номер Unicode для символа, о котором LaTeX не знает (он должен появиться в сообщении об ошибке)
- Второй шаг, который немного сложнее, заключается в определении того, есть ли какой-либо шрифт TeX, который на самом деле содержит этот символ, и какова кодировка этого шрифта. Здесь нет хороших советов, но есть некоторые документы, описывающие стандартные кодировки шрифтов LaTeX.
- в качестве альтернативы можно попробовать добавить в документ хотя бы кодировки
T1
иTS1
, поскольку это может решить проблему (если это довольно распространенный «западный» символ). - также может быть так, что вы можете «подделать» символ, скажем, если у вас есть какой-то дефис (которых в Unicode существует несколько разных) и ваш редактор добавляет тот, который не известен LaTeX, вы можете добавить объявление
\DeclareUnicodeCharacter
со вторым аргументом, содержащим заменяющий символ, который действительно существует.
В противном случае, боюсь, единственным решением будет использовать другой символ или движок на базе TeX, который полностью поддерживает Unicode и может иметь доступ к шрифтам Unicode с большими наборами символов изначально.
Более подробную документацию по этому вопросу можно найти в документированном исходном коде, utf8ienc.pdf
который либо входит в дистрибутив LaTeX, либо может быть сгенерирован из .dtx
файла.
решение2
У меня была такая же проблема, когда мой друг хотел набрать книгу о латинской поэзии и хотел напрямую использовать гласные со знаками долготы, такими как ō и ŏ (длиннаяибревис).
Трюк, который я нашел, был завернут в пакет,newunicodechar
.
Говоря
\usepackage{newunicodechar}
\newunicodechar{ō}{\={o}}
\newunicodechar{ŏ}{\u{o}}
это то же самое, что делать
\DeclareUnicodeCharacter{014D}{\={o}}
\DeclareUnicodeCharacter{014F}{\u{o}}
но избавляет от необходимости искать в таблице Unicode.
Конечно, необходимо убедиться, что текст замены действительно может быть воспроизведен загружаемыми нами шрифтами, что может иметь место в случае «маркера раздела».
Смотрите такжеМакрос, принимающий символ в качестве аргумента, делающий его активным, а затем \def его.
Использование этого пакета имеет еще одно преимущество: предположим, вы хотите переключиться на XeLaTeX или LuaLaTeX для обработки документа; тогда такой символ, как