使用 \pdfbookmark 在目录中使用西里尔字符

使用 \pdfbookmark 在目录中使用西里尔字符

我正在尝试编写一本以俄语为主要语言的书。问题是,在 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 书签名称中使用西里尔字母来解决。这样做的原因是inputencUTF-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或进行编译latexpolyglossia是 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 包。

相关内容