CITKIT.ru - свободные мысли о свободном софте
Деловая газета CitCity.ru Библиотека CITForum.ru Форумы Курилка
Каталог софта Движение Open Source Дискуссионный клуб Дистрибутивы Окружение Приложения Заметки Разное
24.08.2017

Последние комментарии

ОСТОРОЖНО: ВИНДОФИЛИЯ! (2250)
24 December, 22:53
Kubuntu Feisty (15)
24 December, 18:42
Один на один с Windows XP (3758)
24 December, 11:46

Каталог софта

Статьи

Дискуссионный клуб
Linux в школе
Open Source и деньги
Open Source и жизнь
Windows vs Linux
Копирайт
Кто такие анонимусы
Лицензии
Нетбуки
Нужен ли русский Linux?
Пользователи
Дистрибутивы
Идеология
Выбор дистрибутива
Archlinux & CRUX
Debian
Fedora
Gentoo
LFS
LiveCD
Mandriva
OpenSolaris
Slackware
Zenwalk
Другие линуксы
BSD
MINIX
Движение Open Source
История
Классика жанра
Окружение
shell
Библиотеки UI
Графические среды
Шрифты
Приложения
Безопасность
Управление пакетами
Разное
Linuxformat. Колонки Алексея Федорчука
Заметки
Блогометки
Файловые системы
Заметки о ядре

Окружение :: Шрифты

Сказ про TeXmacs, или как прикручивали шрифты TeX к графическому режиму, и что из этого получилось

Софтерра

От редактора: эта статья была написана довольно давно — в апреле 2002 года, и опубликована в тогдашней онлайновой Софтерре (исходная ссылка давно не актуальна). Но в ходе одного из обсуждений на Линуксфоруме неожиданно оказалось, что она в своей фактографической части актуальности не потеряла.
А идеологически она актуальна безусловно. Ибо написана профессиональным историком-византиевистом. То есть тем самым конечным пользователем, о благе которого так пекутся и большевики-вендузяднеги, и меньшевики-новолинуксоиды. И который, как можно видеть из приведенного ниже текста, вполне способен сам позаботиться о собственном благе.
Алексей Федорчук

В условиях острого недостатка средств визуального редактирования под Linux каждый текстовый процессор для этой операционной системы непременно становится предметом активного обсуждения в русскоязычном Интернете. Разбираются мельчайшие подробности русификации AbiWord и способы прикрутки новых шрифтов к Ted, равно как и сравнительные достоинства ApplixWord и StarWriter. Да и наша недавняя статья о LyX лишь развивает линии, намеченные предшественниками. Однако же существует программа данного класса, о которой в Сети как будто не обнаруживается почти никакой информации на русском языке. Да и на иностранных-то сайтах трудно найти что-либо, кроме рекламы, заимствованной из ее собственной документации. Имя этой программе — TeXmacs, а автора ее зовут Joris van der Hoeven.

Чем объясняется этот заговор молчания? Возможно, дело в том, что TeXmacs, что называется, «из коробки» обнаруживает способность работать с русскими текстами, так что тема русификации, столь важная в других случаях, не может послужить источником вдохновения. Впрочем, это, как мы увидим, только так кажется. А может быть, пользователей Linux сбивает с толку название программы, недвусмысленно указывающее на то, что она должна иметь отношение к TeX и Emacs. Ну а у этих двух явлений, при всей их разноплановости, общая черта по крайней мере одна: неисчерпаемость. Так что писать о них надлежит не коротенькие заметки в Сети, а толстенные талмуды.

Наследие Emacs

Однако уже первое знакомство с TeXmacs убеждает в самостоятельном характере этой программы, который подчеркивается ее оригинальным (и весьма приятным) графическим интерфейсом. Более того, признаки влияния Emacs в ней отнюдь не бросается в глаза, если не считать заимствованной из этого редактора системы «горячих клавиш» и некоторых рудиментов концепции буферов. То и другое, скажем так, терпимо, хотя и не представляется особенно полезным. Ведь потребность в визуальных редакторах обычно возникает у недавних Windows-мигрантов, а не у людей, досконально освоивших Emacs со всеми его клавиатурными комбинациями. Ну а список буферов в TeXmacs всё равно ограничивается окнами открытых документов, так что заимствованный из Emacs пункт меню «Буфер» можно было бы с успехом переименовать в «Окно» и переместить из начала строки меню куда-нибудь поближе к ее концу.

Правда, есть у TeXmacs и еще одна черта, роднящая его не только с Emacs, но и с консольными редакторами вообще. В программе практически полностью отсутствуют диалоговые окна, так что в тех случаях, когда вызванная тем или иным способом команда требует задания каких-либо параметров, общение с пользователем происходит через строку состояния. Что, конечно, не очень удобно. Например, если пользователь выберет в меню команду «установить поля», ему придется последовательно отвечать на вопросы о величине каждого из четырех полей, не забывая присовокуплять к введенной цифре название единицы измерения (например, cm, mm или in). Впрочем, похоже, что это не концептуальная особенность программы, а просто следствие нежелания автора пользоваться общераспространенными графическими библиотеками, типа gtk или motif.

Однако родство с Emacs станет по-настоящему очевидным, когда мы зададимся вопросом, каким образом осуществляется настройка программы. Как выясняется, никаких интерактивных средств на сей случай не предусмотрено. Правда, в строке меню имеется пункт под названием «Опции», но он, во-первых, весьма беден по содержанию, и, во-вторых, установленные в нем параметры (можно, например, поменять язык интерфейса) действуют только на текущий сеанс. Соответственно, бесполезно искать и какие-либо намеки на конфигурационный файл: ничего подобного нет ни в программном каталоге TeXmacs (отметим, что имя этого каталога хранится в переменной $TEXMACS_PATH и соответствует /usr/share/TeXmacs, если программа устанавливалась из бинарного пакета; в противном случае придется поискать где-то в районе /usr/local/lib), ни в домашнем каталоге пользователя. Зато в папке $TEXMACS_PATH/progs обнаруживается целый куст инициализационных сценариев с расширением .scm. Это расширение типично для программ на языке Scheme, который является диалектом Lisp и, стало быть, родным братом макроязыка Emacs.

Таким образом, методика настройки TeXmacs очень похоже на таковую для Emacs, но имеет и свои особенности. Во-первых, сценариев в данном случае не так уж много, и они хорошо систематизированы. Во-вторых, программы на scheme не компилируются, что, с одной стороны, удобно (облегчает их правку), а с другой – имеет оборотную сторону в виде довольно продолжительного времени, уходящего на обработку их кода в процессе инициализации приложения. Ну а за начальную загрузку сценариев и последовательность их исполнения отвечает файл под названием init.scm из того же каталога $TEXMACS_PATH/progs. Предусмотрена и возможность использовать домашний каталог пользователя. Для этой цели существует переменная $TEXMACS_HOME_PATH, которая по умолчанию соответствует каталогу ~/.TeXmacs. Каталог этот образуется автоматически, но изначально пустует. Так вот, если у нас возникнет желание всерьез заняться настройкой TeXmacs, целесообразно будет скопировать init.scm в папку $TEXMACS_HOME_PATH/progs, где и упражняться над ним по своему усмотрению.

Влияние LaTeX

Взаимосвязь между TeXmacs и TeX/LaTeX гораздо более очевидна и бросается в глаза уже при беглом знакомстве с интерфейсом программы. Скажем, в меню «Документ» мы обнаруживаем подменю «Стиль», которое позволяет сделать выбор между такими вариантами, как «Письмо», «Статья», «Книга», «Семинар». Что это такое? Да не что иное, как стандартные классы документов LaTeX. Точно так же не вызывает сомнения происхождение большинства пунктов меню «Вставка», через которое в документ можно включить заголовки разного уровня, а также такие окружения, как «Стихи», «Цитата», «Код», «Замечание», «Пример». Здесь же находим команды, управляющие расстановкой отступов между абзацами и разрывов страниц, которые также выдержаны вполне в духе идеологии LaTeX. В общем, сама собой напрашивается аналогия с таким текстовым процессором, как LyX, где доступ к командам LaTeX осуществляется именно с помощью подобных элементов пользовательского интерфейса. Подобно LyX, TeXmacs изначально ориентирован на создание структурированного документа, оформление которого в соответствии с выбранным стилем программа берет на себя. Единственное внешнее отличие (правда, говорящее, на мой взгляд, не в пользу TeXmacs) заключается в том, что здесь можно лишь вставлять различные элементы структуры, но нельзя, например, оформить уже набранный абзац в качестве заголовка того или иного уровня.

На самом же деле разница гораздо глубже, ибо TeXmacs — вовсе не графическая оболочка для LaTeX, а совершенно самостоятельный текстовый процессор. Поэтому наличие аналогов для распространенных команд LaTeX здесь не дань необходимости, а плод сознательного стремления автора создать программу, пригодную для подготовки документов полиграфического качества. Однако решается эта задача совершенно иными средствами. Об этом говорит уже самый формат документов TeXmacs (они имеют расширение .tm), который не имеет с LaTeX ничего общего, ибо основан на SGML. Что, в общем-то, и неудивительно: TeX/LaTeX — язык слишком своеобразный, и к тому же обладающий внутренним совершенством, так что его сложно использовать как основу для новых разработок. Соответственно, TeXmacs не нуждается в каких-либо внешних компиляторах: получив команду распечатать документ, он самостоятельно создает PostScript-файл, который потом и посылается на печать через Ghostscript. А коль скоро одна и та же программа управляет отображением текста на экране и его переводом в формат PostScript, не так уж сложно сделать результаты обоих процессов максимально близкими друг к другу. По этой причине TeXmacs, в отличие от LyX, обеспечивает не некую условную визуализацию, а настоящий режим WYSIWYG. В процессе редактирования не отображаются разве что разрывы страниц. Зато переносы расставляются тут же, причем с учетом выбранного языка.

Надо заметить, что используемый в TeXmacs алгоритм переносов также заимствован из TeX. Сам по себе данный факт не следует считать признаком тесной связи с этой издательской системой: просто файлы переносов TeX хороши тем, что распространяются свободно и дают вполне удовлетворительный результат. А использовать их ныне можно в любом визуальном редакторе — было бы желание. Так что в этом плане TeXmacs мог бы послужить образцом для всех разработчиков некоммерческих текстовых процессоров. Однако есть одна область, где TeXmacs по-настоящему зависим от TeX: для оформления текста в нем по умолчанию используются шрифты в формате METAFONT. Некоторые из них имеются в комплекте программы, но недостающие приходится брать из дерева каталогов TeX. Кроме того, использование технологии METAFONT, как известно, требует генерации растровых pk-шрифтов, для чего необходимы компиляторы, которые опять-таки не являются частью TeXmacs, а поставляются в составе дистрибутива teTeX. А вот к чему такой выбор приводит — об этом сказ особый.

Гримасы русификации

Выше уже было отмечено, что специально заниматься русификацией TeXmacs как будто бы нет необходимости: всё уже сделано за нас. Более того: хотя в TeXmacs изначально предусмотрена поддержка ряда языков, русский удостоился особого внимания. В меню обнаруживается несколько специальных команд, имеющих отношение к работе с кириллицей, а методике такой работы посвящено отдельное электронное руководство. Тронутый такой заботой, пользователь принимается вводить текст и... наблюдает на экране хорошо знакомую бХОПНю. По крайней мере, в том случае, если в его системе принята кодировка koi8. Попутно обнаруживается, что нельзя пользоваться и английской клавиатурой: пока мы не пометим текст явным образом как английский (это делается через меню «Текст»→«Язык»), вместо латинских букв будут печататься соответствующие им русские.

Первую проблему можно легко исправить, если выбрать в меню «Опции»→«клавиатура»→ «русский» пункт «koi8-r». Но не делать же это в каждом сеансе? Поэтому остается залезть в файл init.scm, где в числе прочего обнаруживаются следующие две строчки:

(exec-file "$TEXMACS_PATH/progs/keyboard/russian" "translit.scm")
(exec-file "$TEXMACS_PATH/progs/keyboard/russian" "cp1251.scm")

Первая строка как раз и заставляет английскую клавиатуру работать в качестве «фонетической» русской раскладки, что может быть полезно для тех, кому приходится иметь дело с русским языком в системах с иной локализацией. Мы же можем ее безбоязненно закомментировать. Что же касается файла cp1251.scm, то он является практически пустым, и, в сущности, не нужен даже в том случае, если наша система локализована на базе этой кодировки. (Вернее, в нем содержится один маленький фокус с буквой «ё», смысл которого станет ясен из дальнейшего). Если же вы используете koi8, то замените название этого файла на koi8.scm. После чего поведение как русской, так и английской клавиатуры в TeXmacs придет в норму.

Но не обольщайтесь. Ибо установили вы не раскладку для koi8, а как раз наоборот: переходник с koi8-клавиатуры на кодировку cp1251. Именно она будет использоваться для отображения текста на экране и записи его в файл. В той же кодировке составлен файл переносов и файл $TEXMACS_PATH/langs/natural/dic/english-russian.scm, отвечающий за русификацию интерфейса. Что, в общем-то, лично меня ни в коей мере не угнетает, поскольку сам я работаю исключительно с cp1251. Да и как же иначе? Не говоря уж о том, что данная кодировка является наиболее логичной, только в ней имеются все необходимые типографские символы, (типа парных кавычек) без которых нет смысла говорить о полиграфическом качестве оформления текста. Однако же давайте задумаемся, почему автор программы (или автор ее русификации) предпочел выбрать именно эту кодировку? Оказывается, по одной единственной причине: cp1251 совместима с кодировкой кириллических шрифтов для TeX, которые по умолчанию используются в TeXmacs. И сделать так пришлось потому, что TeXmacs, будучи WYSIWYG-приложением, не предусматривает механизма перекодировки входного файла, подобного тому, который обеспечивается загрузкой пакетов fontenc и inputenc в LaTeX. То есть навязывают нам, в сущности, вовсе не cp1251, а TeX'овскую кодировку T2A.

Но ведь такой подход не только идеологически неверен, но и весьма наивен. Ну хорошо, cp1251 совпадает с T2A в русской части (и то кроме буквы «ё» — не зря же для ее печати понадобилось переопределять поведение клавиатуры), но ведь это уже не будет соответствовать истине для символов других славянских алфавитов. А что, если мы пожелаем сделать украинскую или сербскую локализацию? Неужели напрямую писать текст в T2A? Текст, который нельзя будет прочесть никаким «Штирлицем», ибо внутренние кодировки TeX вообще-то предназначаются только для откомпилированных файлов .dvi. Никто и никогда не допускал мысли о возможности использовать их напрямую для набора текстов. Главная причина этого достаточно очевидна: в таких кодировках активно используются те ячейки кодовой таблицы, которые вне системы TeX зарезервированы за управляющими кодами и, соответственно, не должны применяться в текстовых файлах.

Увы, похоже, что данное соображение нисколько не смущает автора TeXmacs. Так, в файле $TEXMACS_PATH/progs/keyboard/accents.scm (он отвечает за некоторые общие параметры клавиатуры) встречаем несколько строчек приблизительно следующего вида:

("- - -" " ")

Приведенная строка задает клавиатурную комбинацию для печати символа «длинное тире». А вот то, что мы обозначили как пробел в кавычках — это на самом деле символ с десятичным кодом 22, который соответствует этому самому длинному тире в латинской кодировке для TeX T1 (равно как и в кириллической T2A). И дело даже не в том, что вносить изменения в подобный файл будет сложно без шестнадцатеричного редактора. Но интересно знать, как бы автор выкручивался из положения, если бы ему понадобился символ с кодом 12 (прогон страницы)? Или с кодом 13 (перенос строки)? А ведь на привязку символов к данным кодам в TeX нет никакого запрета.

Еще одна любопытная вещь обнаружится, если мы попробуем преобразовать подготовленный в TeXmacs документ в формат LaTeX. TeXmacs предусматривает такую возможность, хотя автор честно признается, что качество конвертера пока оставляет желать лучшего. Открываем полученный файл в текстовом редакторе, и... первым делом обнаруживаем, что строчная буква «я» всюду превратилась в заглавную. Заглавное же «Я» вообще стало двойным латинским S. Речь, естественно, идет о тексте в cp1251, в противном случае проблема возникла бы с твердым знаком. В чем тут дело? Оказывается, мы опять расплачиваемся за неуклюжую попытку учесть различия между кодировками, на сей раз латинскими: TeX'овской T1 и общепринятой iso-8859-1. Лечится такое поведение путем истребления из файла $TEXMACS_PATH/progs/convert/tmtex.scm следующих двух строчек:

((equal? c #\337) (tmtex-text-sub "SS" l))
((equal? c #\377) (tmtex-text-sub "Я" l))

Но не забавно ли, что, ради того, чтобы сделать документ понятным для LaTeX, приходится перегонять его из внутренней TeX'овской же кодировки в общепринятую? И, как видим, проблема вовсе не ограничивается русификацией, ибо различия между двумя западноевропейскими кодировками — приблизительно такого же порядка, как между cp1251 и T2A.

Как с этим бороться

А теперь зададимся вопросом: а для чего вообще понадобилось связываться со шрифтовым хозяйством TeX? Может быть, TeXmacs умеет корректно обрабатывать содержащиеся в шрифтах лигатуры (под лигатурой в TeX понимается сочетание двух символов, которые должны быть заменены или дополнены третьим символом при компиляции документа)? Да нет, не похоже. Или программа знает, как обращаться с акцентами-модификаторами? Ничего подобного. Правда, в TeXmacs предусмотрены специальные клавиатурные комбинации для печати акцентированных латинских символов, в готовом виде содержащихся в кодировке T1, но вот составить новый символ из буквы и акцента нельзя. Мало того, если в LaTeX кодировка рассматривается как один из атрибутов шрифта, то TeXmacs, имея дело со внутренними кодировками TeX, ничего, в сущности, о них не знает. Шрифты в разных кодировках являются для него, как и для большинства визуальных редакторов, совершенно различными гарнитурами, и уже дело пользователя следить за тем, чтобы выбранный шрифт соответствовал языку текста.

Недоумение еще больше возрастает, когда мы обнаруживаем, что TeXmacs, оказывается, прекрасно умеет обращаться и со шрифтами, установленными в системе XWindow (по крайней мере, в формате Type 1 — насчет остальных ничего сказать не могу). Некоторый набор таких гарнитур (естественно, только латинских, и, естественно, в кодировке Adobe Standard, то есть, в сущности, в той же iso-8859-1) изначально доступен через меню программы. О такой мелочи, как различия кодировок, автор «забыл» предупредить в документации. А эти различия, как мы уже убедились, как раз таковы, чтобы сделать абсолютно бессмысленными попытки сочетания шрифтового хозяйства TeX и XWindow в одном документе. Но, быть может, имеет смысл полностью переориентировать TeXmacs на шрифты Type 1, разом ликвидировав тем самым все вышеописанные проблемы?

Для разрешения этой задачи нам, во-первых, понадобится некий малый джентльменский набор кириллических гарнитур Type 1, состоящий из серифного, санссерифного и машинописного шрифтов. Я бы рекомендовал использовать шрифты в cp1251, но, если предпочтете koi8, не забудьте сконвертировать в эту кодировку файлы, отвечающие за русификацию интерфейса и русский перенос. Кроме того, для полноты операции желательно наличие совместимых гарнитур в западноевропейской кодировке. Далее я ради простоты картины буду исходить из предположения, что у нас имеется базовый набор коммерческих гарнитур от Paratype: NewtonC, PragmaticaC и CourierC для кириллицы, NewtonA, PragmaticaA и CourierA для западноевропейских алфавитов.

Шрифты эти, естественно, должны быть корректно установлены в системе XWindow. Далее мы могли бы сделать их доступными TeXmacs, внеся несколько дополнительных строк (по образцу уже имеющихся) в файлы TEXMACS_PATH/progs/fonts/x-fonts.scm и TEXMACS_PATH/progs/menu/main-menu.scm, которые, как это явствует из их названий, отвечают за загрузку шрифтов XWindow и конфигурацию меню. Но ведь мы хотели полностью отказаться от использования шрифтов системы TeX? Чтобы сделать это с наименьшими затратами, целесообразно переопределить шрифты roman и cyrillic, используемые программой по умолчанию. Для этой цели лучше всего создать новый файл, взяв за основу основу один из сценариев, ведающих загрузкой шрифтов (хотя бы тот же самый x-fonts.scm). Файл этот в нашем случае должен содержать следующие вхождения:

((roman rm medium right $s $d) (ps paratype-newtona-medium-r-normal $s $d))
((roman rm medium italic $s $d) (ps paratype-newtona-medium-i-normal $s $d))
((roman rm bold right $s $d) (ps paratype-newtona-bold-r-normal $s $d))
((roman rm bold italic $s $d) (ps paratype-newtona-bold-i-normal $s $d))

((cyrillic rm medium right $s $d) (ps paratype-newtonc-medium-r-normal $s $d))
((cyrillic rm medium italic $s $d) (ps paratype-newtonc-medium-i-normal $s $d))
((cyrillic rm bold right $s $d) (ps paratype-newtonc-bold-r-normal $s $d))
((cyrillic rm bold italic $s $d) (ps paratype-newtonc-bold-i-normal $s $d))

Далее создаются аналогичные строчки для гарнитур Pragmatica и Courier: помимо названий шрифтов меняется только показатель «rm» (т. е. roman) соответственно на «ss» (sansserif) и «tt» (typewriter). После чего надлежит сделать созданный файл доступным TeXmacs, прописав его загрузку в init.scm. Только загружаться он должен ранее всех прочих файлов из каталога TEXMACS_PATH/progs/fonts, если, конечно, у нас нет желания заниматься их редактированием на предмет истребления конфликтующих вхождений.

После этого не помешает просмотреть файлы из каталога TEXMACS_PATH/progs/keyboard (в первую очередь accents.scm) и вычистить из них те команды, которые имеют смысл только для кодировки T1. Кроиме того, целесообразно будет по-новому определить клавиатурные комбинации для печати наиболее распространенных типографских знаков препинания (то есть короткого и длинного тире, многоточия и парных кавычек всех видов). Нижеследующие определения будут работать правильно как для iso-8859-1, так и для cp1251:

("- -" "<символ с кодом 150>")
("- - -" "<символ с кодом 151>")
(". . ." "<символ с кодом 133>")
("< <" "<символ с кодом 171>")
("> >" "<символ с кодом 187>")
("` `" "<символ с кодом 147>")
("' '" "<символ с кодом 148>")
(", ," "<символ с кодом 130>")


Конечно, чтобы вставить в файл все перечисленные знаки, придется воспользоваться редактором со встроенной таблицей символов. Linux ведь не Windows — получить любой символ путем набора его кода на числовом блоке клавиатуры нельзя. Но это хотя бы не запретные коды из диапазона 0–32.

А теперь последний вопрос: стоит ли всем этим заниматься? Возможно, и стоит: ведь визуальных редакторов под Linux — раз, два и обчелся, а уж способность работать с многоязычными документами — свойство и вовсе уникальное. Только следует иметь в виду, что ваши наработки в TeXmacs не будут совместимы решительно ни с чем. Потому тот недостаток конвертера в формат LaTeX, о котором было сказано выше — далеко не единственный. Файлы, полученные с его помощью, производят страшноватое впечатление, и, главное, напрочь лишены той информации о шрифтовом форматировании и использованных языках, которая во внутреннем формате TeXmacs сохраняется достаточно эффективным способом. Ну а конвертеры для HTML и RTF пока лишь числятся в планах автора, и, соответственно, надежда на них слабая. Так что — думайте сами, решайте сами...




Комментарии

salas, Mon Aug 13 02:15:18 2007:
А вы бы читали, прежде чем комментить: "...cp1251 совпадает с T2A в русской части (и то кроме буквы «ё»..."
Evgueni, Sun Aug 12 09:45:48 2007:
Внутренняя кодировка LaTeX не равна cp1251. Есть как минимум одно отличие - буква ё

Комментарии заморожены.

Новости:

Все новости на CitCity.ru

Компании месяца

 
Последние комментарии
Почему школам следует использовать только свободные программы (101)
20 Декабрь, 14:51
ОСТОРОЖНО: ВИНДОФИЛИЯ! (2250)

24 Декабрь, 22:53
Linux в школе: мифы про школу и информатику (334)
24 Декабрь, 22:43
Kubuntu Feisty (15)
24 Декабрь, 18:42
Software is like sex: it's better when it's free.
©Linus Torvalds