Как заставить LaTeX2e понимать русский язык

О чем этот документ

В этот документе я попытаюсь рассказать, как можно набирать документы в системе LaTeX на русском языке в операционной системе Linux. Конкретно я буду говорить о дистрибутиве LaTeX'а teTeX. Весьма вероятно, что эти инструкции окажутся применимы к другим дистрибутивам LaTeX'а и даже к другим операционным системам.

Соглашения

Я предполагаю, что читатель имеет базовые представления об операционной системе Linux, т.е. вы знаете, как копировать, перемещать, удалять, редактировать сжимать/разжимать файлы. Пути я буду указывать относительно корневой директории LaTeX'а, как правило это /usr/lib/texmf. Также иногда я ссылаюсь на архивы CTAN. Основные узлы CTAN (Comprehensive TeX Archive Network) - ftp.dante.de и ftp.tex.ac.uk. Полный список узлов CTAN вы найдете в файле texmf/doc/help/CTAN.sites в дистрибутиве teTeX.

Что нам понадобится

Чтобы выполнить эти инструкции, вам понадобится следующее программное обеспечение:
  1. Относительно новый LaTeX2e. Я рекомендую teTeX 0.4, который включает LaTeX2e от 1996/12/01. Возможно, и более ранние версии LaTeX'а будут работать, но, во всяком случае, это должен быть LaTeX2e, а не LaTeX 2.09. teTeX вы найдете на любом из узлов CTAN в директории /tex-archive/systems/unix/teTeX/. Большинство дистрибутивов Linux включают teTeX, так что, если у вас есть Linux, весьма вероятно, что у вас уже есть и teTeX.
  2. Пакет Babel версии 3.6. Большинство дистрибутивов LaTeX'а, teTeX в частности, включают в себя Babel. Заметьте, что это должен быть Babel 3.6, т.к. более ранние версии не содержали поддержки русского языка. Опять-таки, если у вас teTeX 0.4, у вас все должне быть в порядке.
  3. Шрифты кириллицы LH. Их можно найти на CTAN'е в /tex-archive/fonts/LH, а также на ftp.relcom.ru в /unix/text/fmt/tex/LHfonts.tar.gz.

Что делать

Первым делом установите LaTeX. Подробное описание этого процесса, безусловно, выходит за рамки данного документа. Если у вас Red Hat Linux, то все, что вы должны сделать, это установить следующие RPM: tetex, tetex-latex, tetex-dvips, tetex-xdvi. В противном случае, за инструкциями обращайтесь к различным README-файлам или друзьям-экспертам.

Вообще говоря, LaTeX уже содержит поддержку русского языка посредством пакета Babel. Проблема в том, что Babel работает в кодировке LWN, что означает, что русский текст вводится в латинской транслитерации. Например, вы набираете "sobaka", чтобы получить "собака". Однако, большинство пользователей Linux внимательно прочли Cyrillic HOWTO (правда?) и умеют вводить русские буквы непосредственно с клавиатуры. Сейчас мы научим Babel понимать русский язык в кодировке LYC, т.е. "альтернативной" (кодовая страница 866). Мы будем использовать эту кодировку, т.к. в ней написаны шрифты LH. Я уже слышу возмущенные возгласы "Что еще за CP866? У меня под Linux'ом используется КОИ-8!". Спокойствие, господа, проблема перевода из КОИ-8 в "альтернативную" кодировку легко разрешима, см. ниже.

Итак, приступим к работе

  1. Прежде всего, нам нужен файл определения кодировки, LYCenc.def. Возьмите его здесь (он сжат gzip'ом и занимает 1823 байт). Альтернативный вариант для любителей все делать своими руками:
    1. Скопируйте LWNenc.def в LYCenc.def (в директории texmf/tex/generic/babel)
    2. Отредактируйте LYCenc.def, заменив LWN всюду на LYC.
    3. Около 90-й строки в этом файле замените определения всех макросов \CYR* на настоящие русские буквы в альтернативной кодировке.
  2. Теперь нам нужны фонт-драйверы (.fd) для шрифтов LH. Загляните в директорию texmf/tex/generic/babel - вы найдете там множество файлов с именами LWN*.fd. Из них мы сделаем соответствующие LYC*.fd файлы с помощью следующего скрипта:
      
    #!/bin/csh
    foreach lwnname (LWN*.fd)
      set lycname = LYC`expr substr $lwnname 4 255`
      sed 's/LWN/LYC/g;s/wn/lh/g' $lwnname > $lycname
    end
    
    (проследите, чтобы путь к csh был правильно указан в первой строке; вместо csh можно использовать tcsh). Запустите этот скрипт (под root'ом) в директории texmf/tex/generic/babel. Теперь файлы LYC*.fd готовы.
  3. Теперь скажем Babel'ю использовать кодировку LYC вместо LWN. В директории texmf/tex/generic/babel откройте файл russianb.ldf своим любимым редактором и замените все вхождения строки LWN на LYC. Затем проделайте то же самое с файлом cyrmath.sty в той же директории. В общем-то, этого достаточно, но имеет смысл еще немного поковырять russianb.ldf. Дело в том, что по непонятной причине Babel считает, что в русском языке перед символами '!', '?', ':', ';' нужно ставить ощутимый пробел. Это довольно-таки странно выглядит, так что сейчас мы его отучим это делать. Около строки 129 в russianb.ldf нужно закомментировать несколько строк, так чтобы соответствующий фрагмент выглядел таким образом:
    %\initiate@active@char{:}
    %\initiate@active@char{;}
    %\initiate@active@char{!}
    %\initiate@active@char{?}
    \initiate@active@char{"}
    \addto\extrasrussian{\languageshorthands{russian}}
    \addto\extrasrussian{%
    %  \bbl@activate{:}\bbl@activate{;}%
    %  \bbl@activate{!}\bbl@activate{?}%
    \bbl@activate{"}}
    %\declare@shorthand{russian}{;}{%
    %  \ifhmode
    %    \ifdim\lastskip>\z@
    %      \unskip\penalty\@M\thinspace
    %    \else
    %      \thinspace
    %    \fi
    %  \fi
    %  \string;}
    %\declare@shorthand{russian}{:}{%
    %  \ifhmode
    %    \ifdim\lastskip>\z@
    %      \unskip\penalty\@M\thinspace
    %    \else
    %      \thinspace
    %    \fi
    %  \fi
    %  \string:}
    %\declare@shorthand{russian}{!}{%
    %  \ifhmode
    %    \ifdim\lastskip>\z@
    %      \unskip\penalty\@M\thinspace
    %    \else
    %      \thinspace
    %    \fi
    %  \fi
    %  \string!}
    %\declare@shorthand{russian}{?}{%
    %  \ifhmode
    %    \ifdim\lastskip>\z@
    %      \unskip\penalty\@M\thinspace
    %    \else
    %      \thinspace
    %    \fi
    %  \fi
    %  \string?}
    %\declare@shorthand{system}{:}{\string:}
    %\declare@shorthand{system}{!}{\string!}
    %\declare@shorthand{system}{?}{\string?}
    %\declare@shorthand{system}{;}{\string;}
    
    Теперь Babel готов использовать кодировку LYC.
  4. Теперь пора установить шрифты LH. Скопируйте все исходники (т.е файлы с расширением .mf) в какую-нибудь подходящую директорию, например texmf/fonts/source/public/lh. По желанию, можно также скопировать .tfm-файлы (TeX Font Metrics) в texmf/fonts/tfm/public/lh, но это не обязательно, т.к. если этого не сделать, эти файлы будут сгенерированы автоматически, когда понадобятся.
  5. Теперь запустите команду texhash (под root'ом). Она обновляет базу файлов texmf/ls-R, по которой teTeX ищет свои файлы.
  6. Сейчас LaTeX уже может обрабатывать русский текст, но он не будет делать переносов. Теперь научим его переносить русские слова. Для начала, нам понадобится файл русских переносов. Здесь возможны 3 варианта: Итак, так или иначе, у вас есть файл переносов ruhyphen.tex. Скопируйте его в texmf/tex/generic/hyphen. Затем в директории texmf/tex/generic/config отредактируйте файл language.dat. Закомментируйте ненужные языки (только ни в коем случае не трогайте American, USenglish или English - английский язык должен оставаться первым) и добавьте строчку
    russian   ruhyphen.tex
    
    Еще раз запустите texhash.
  7. Теперь нам необходимо перегенерировать форматный файл LaTeX'а latex.fmt, чтобы заставить LaTeX загружать русские переносы. Зайдите а директорию texmf/tex/latex/config и запустите такую команду:
      initex 'latex.ini \dump'
    
    Готовый latex.fmt переместите в директорию texmf/web2c.
  8. Наконец, последний штрих. Вся наша руссификация пока работает в "альтернативной" кодировке, в то время как вы наверняка используете в Linux'е кодировку КОИ-8. Самое простое (и не самое удобное) решение этой проблемы заключается в том, чтобы перекодировать каждый LaTeX-файл перед обработкой его LaTeX'ом. К счастью, существует и гораздо более удобное решение. Используйте пакет koi2alt, который будет делать перекодировку автоматически. Возьмите этот пакет здесь. Разархивируйте его gunzip'ом и поместите полученный koi2alt.sty в подходящую директорию, например texmf/tex/latex/local (при необходимости, создайте такую директорию). Затем снова запустите texhash. Внимание: я нашел этот пакет где-то в Интернете, но внес в него небольшие изменения. В оригинальном пакете была небольшая ошибочка, которая приводила к тому, что вместо буквы "ё" (йо) печаталась "Я". Так что, если вы взяли koi2alt.sty не с этой страницы, убедитесь, что у вас он правильный.
  9. Еще один шаг необходим, если вы хотите, чтобы LaTeX правильно различал больше и маленькие буквы в русском языке, в частности, если вы хотите, чтобы команды \uppercase и \lowercase работали. (последнее требуется, например, чтобы правильно форматировать заголовки в классе amsart). Чтобы этого добиться, необходим вот этот пакет koi8case. Так же, как с koi2alt, разархивируйте его gunzip'ом, поместите в подходящую директорию и запустите texhash. Этот пакет работает только с кодировкой КОИ-8. Внимание: этот пакет я написал сам, но я не особенный эксперт по LaTeX'у, так что гарантировать, что я выбрал наиболее эффективный и безопасный путь, я не могу. Используйте этот пакет на свой риск.
      Уффф... Все! Теперь проверим вашу руссификацию. Следующий фрагмент демонстрирует шаблон для создания русскоязычных документов.
      \documentclass{article}
      \usepackage[russian]{babel}
      \usepackage{koi2alt}
      \usepackage{koi8case}
      \begin{document}
      
      ... Мама мыла раму ...
      
      \end{document}
      
      Прогоните этот файл через LaTeX и затем посмотрите его с помощью xdvi. Будьте готовы подождать немного, пока METAFONT сгенерирует необходимые .tfm (для LaTeX'a) и .pk (для xdvi) файлы для русских шрифтов. Не волнуйтесь, это происходит только когда какой-либо русский шрифт используется впервые (это касается любого шрифта, вообще говоря).

      Если вы всегда используете кодировку КОИ-8, то вам нужно использовать пакеты koi2alt и koi8case всякий раз, когда вы набираете документ на русском. Чтобы не писать каждый раз \usepackage{koi2alt} \usepackage{koi8case} можно добавить следующие строчки в russianb.ldf в texmf/tex/generic/babel (сразу перед строкой \ldf@finish{russian}):

      \AtEndOfPackage{\RequirePackage{koi2alt}}
      \AtEndOfPackage{\RequirePackage{koi8case}}
      
      Теперь пакеты koi2alt и koi8case будут включаться автоматически.

      Disclaimer

      То, что я описал сработало для меня. Хотя я считаю маловероятным, что это не сработает для вас, я не делаю никаких гарантий. Используйте эти инструкции на свой страх и риск. Если у вас возникнут проблемы, я, возможно, смогу вам помочь. Вы можете обратиться ко мне по адресу lz@ecos.kharkov.ua.

      Благодарности

      Большинство приведенной здесь информации позаимствовано из статьи, написанной в FIDO-шную группу RU.LINUX, 10 Oct 1996 неким Алексом Киселевым (Alex_Kicelew@p7.f194.n5020.z2.fidonet.org). Я хотел бы выразить огромную признательность этому человеку за его очень полезное письмо. Также, некоторую информацию я почерпнул из пакета LH Сергея Наумова (serge@astro.unc.edu).