我正在尝试编写一本以俄语为主要语言的书。问题是,在 TeXShop(LaTeX 文档)上运行的第二个编译器上,当需要用俄语创建书签时,由于某种原因,它无法处理这些字符。当我用同样的代码处理英文文本时,它也能正常工作,所以我需要弄清楚如何处理俄语。
这是我的代码的简化示例:
\documentclass[a5paper]{book}
\usepackage{graphicx}
\usepackage[left=1cm, right=1cm, top=1.5cm, bottom=1cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T2B]{fontenc}
\usepackage[pdftex]{hyperref}
\hypersetup{
unicode=true,
colorlinks=true,
citecolor={black},
linkcolor={black},
urlcolor={black},
pdffitwindow=true,
}
\usepackage[none]{hyphenat}
\sloppy
\begin{document}
\frontmatter
% Titlepage
\title{
\Huge{\textbf{БИБЛИЯ}}\\\vspace{0.05cm}
\author{} \date{}
}
\pdfbookmark[0]{Title Page}{title}
\maketitle
\mainmatter
\begin{center}
\pdfbookmark[0]{Бытие}{Бытие}\noindent\\
\vspace{0.15cm}\textbf{\Huge{Бытие}}\vspace{0.00cm}\\
\end{center}
\pdfbookmark[1]{1}{Бытие1}\noindent\Large{Глава 1}\\\\
\normalsize 1 \Large \indent В начале сотворил Бог небо и землю.\\
\normalsize 2 \Large \indent Земля же была безвидна и пуста, и тьма над бездною, и Дух Божий носился над водою.\\
\pdfbookmark[1]{2}{Бытие2}\noindent\Large{Глава 2}\\\\
\normalsize 1 \Large \indent Так совершены небо и земля и все воинство их.\\
\normalsize 2 \Large \indent И совершил Бог к седьмому дню дела Свои, которые Он делал, и почил в день седьмый от всех дел Своих, которые делал.
\begin{center}
\newpage\pdfbookmark[0]{1-e Иоанна}{1-e Иоанна}\noindent\\
\vspace{0.15cm}\textbf{\Huge{1-e Иоанна}}\vspace{0.00cm}\\
\end{center}
\pdfbookmark[1]{1}{1-e Иоанна1}\noindent\Large{Глава 1}\\\\
\normalsize 1 \Large \indent О том, что было от начала, что мы слышали, что видели своими очами, что рассматривали и что осязали руки наши, о Слове жизни, –\\
\normalsize 2 \Large \indent ибо жизнь явилась, и мы видели и свидетельствуем, и возвещаем вам сию вечную жизнь, которая была у Отца и явилась нам, –\\
\pdfbookmark[1]{2}{1-e Иоанна2}\noindent\Large{Глава 2}\\\\
\normalsize 1 \Large \indent Дети мои! сие пишу вам, чтобы вы не согрешали; а если бы кто согрешил, то мы имеем ходатая пред Отцем, Иисуса Христа, праведника;\\
\normalsize 2 \Large \indent Он есть умилостивление за грехи наши, и не только за наши, но и за грехи всего мира.\
\end{document}
这是显示错误的日志输出的一小部分:
(/usr/local/texlive/2011/texmf-dist/tex/generic/oberdiek/gettitlestring.sty 包:gettitlestring 2010/12/03 v1.4 清理标题引用(HO) ) \c@section@level=\count108 ) LaTeX 信息:在输入中重新定义 \ref 第 18 行。LaTeX 信息:在输入第 18 行重新定义 \pageref。LaTeX 信息: 在输入行 18 上重新定义 \nameref。 (./ATest.out ./ATest.out:3:未定义控制序列。\T 2B\CYRB \T 2B\cyrery \T 2B\cyrt \T 2B\cyri \T 2B\cyre .0 l.3 ...2B\cyrery \T2B\cyrt \T2B\cyri \T2B\cyre .0} %3? ./ATest.out:3: 缺少插入的 \endcsname。 \T2B\CYRB l.3 ...2B\cyrery \T2B\cyrt \T2B\cyri \T2B\cyre .0} %3? ./ATest.out:3: 未定义控制序列。\T 2B\CYRB \T 2B\cyrery \T 2B\cyrt \T 2B\cyri \T 2B\cyre .0 l.3 ...2B\cyrery \T2B\cyrt \T2B\cyri \T2B\cyre .0} %3?
答案1
您的原始问题可以通过避免在 PDF 书签名称中使用西里尔字母来解决。这样做的原因是inputenc
UTF-8 字符不仅仅是字符。而不是
\pdfbookmark[0]{Бытие}{Бытие}
写
\pdfbookmark[0]{Бытие}{Genesis}
但是,使用更高级别的\addcontentsline
命令更容易,它不仅可以将条目添加到 PDF 目录中,还可以将条目添加到 LaTeX 的主目录中(如果需要打印的话):
\addcontentsline{toc}{chapter}{Бытие}
如果您要用俄语做很多工作,您也可以考虑使用 XeTeX 引擎而不是默认的 pdfTeX。XeTeX 原生支持 Unicode,并允许加载任何 TrueType 或 OpenType 字体。由于 XeTeX 不依赖技巧来处理 UTF-8,而是直接处理 Unicode 编码的文本,因此也可以在 PDF 书签名称和控制序列名称中使用西里尔文(或任何其他)字符(使用xelatex
而不是pdflatex
或进行编译latex
;polyglossia
是 XeLaTeX 的替代品babel
):
\documentclass{book}
\usepackage{polyglossia}
\usepackage{hyperref}
\setdefaultlanguage{russian}
\newfontfamily\russianfont[Ligatures=TeX]{CMU Serif}
\begin{document}
\chapter{Проверка}
\pdfbookmark{Ещё проверка}{Название закладки}
\end{document}
最后,我还应该指出,反复使用低级格式化命令不是一种好习惯,很快就会让你吃亏。你应该在读了一些 LaTeX 之后教程(也尝试一下这非常好的俄语书(虽然有点旧),定义带有语义名称的命令并使用它们。您可能还想看看titlesec
包裹。
答案2
出于相同目的,我使用独立于输入编码的 unicode 选项加载 hyperref 包。