20090128

Скрипт rss2xmpp, кросспост чего угодно в Jabber

В общем, скрипт лежит на BitBucket: rss2xmpp.py.

Использование:
$ rss2xmpp.py адрес-фида джаббер-ID-адресата
Фид можно почти любой: и RSS, и Atom. Записи пересылаются отдельными сообщениями в прямом хронологическом порядке, история отосланных сохраняется. При первом запуске скрипт создаст файл~/.rss2xmpp, куда нужно внести настройки учётной записи Jabber для отправки сообщений. По умолчанию в этот файл вписываются настройки для GoogleTalk.

Для работы скрипты нужны: FeedParser, html2text, и xmpppy, и, конечно, Python. Забавное наблюдение: все зависимости оказались пакетированы во FreeBSD, все, кроме python-html2text в Debian unstable, а в убунте только python-feedparser.

Ещё одно постороннее замечание. BitBucket, как хостинг для Mercurial, мне понравился: сразу дают доступ по SSH (т.е. можно положить ключи и пользоваться без пароля), есть простой Issue-tracker и вики (отключаемы), а вдобавок разрешают и один бесплатный частный (закрытый) репозиторий. Зато freeHg полностью некоммерческий и минималистичный.

rss2xmpp, a script to crosspost any feed to Jabber (этот пост по-английски)

20090125

Выделение HTML-тегов, строк и блоков кода в Vim

Хочу рассказать об одной очень удобной возможности редактора Vim, выделении текстовых объектов, а именно: <тегов> и их содержания, взятых в кавычки "строк", {блоков кода}. Это удобно при редактировании как программ, так и разных языков разметки (HTML, XML и т. п.).

Ниже я покажу визуальное выделение этих текстовых объектов (команда vобъект), хотя их можно использовать и в других командах, например для удаления (dобъект) или замены (cобъект).

Итак, начнём с HTML-тэгов. Предположим у нас есть такой текст:

Hello magic <em>Vim</em> world!

и курсор стоит на слове «Vim», выделенном с помощью тега <em>. Тогда, чтобы выделить всё содержимое тега (т. е. слово «Vim») можно использовать команду vit (от слов «inner tag»):

visual inner tag selection: vit

А чтобы выделить весь тег целиком, т.е. «<em>Vim</em>», можно использовать команду vat (от слов «a tag»):

a tag selection: vat

Теперь рассмотрим примеры выделения закавыченных "строк" и {блоков кода}. Пусть у нас есть такой текст программы на Си:

C hello world snippet

Поместим курсор, как и прежде на слово «Vim». Выделим всё содержимое закавыченной строки, команда vi":

inner string selection: vi"

и выделение строки целиком, вместе с кавычками — команда va":

a string selection: va"

Аналогично для выделения содержимого блока кода — команда vi}:

inner block seletion: vi}

А для всего блока целикомva}:

entire block selection: va}

Вот так — двумя нажатиями клавиш.

Подробнее о текстовых объектах можно почитать во встроенной справке Vim, :help text-objects.

Ещё о Vim:

Vim: как быстро закомментировать/раскомментировать блок кода
Вставка Python-кода в Vim (с исправлением отступов)
Vim в терминале: вставка текста с сохранением отступов (:paste)
Редактирование HTML и XML в Vim

20090106

Буквицы в LaTeX

Применение декоративной буквы в начале абзаца — это старинная традиция. Она настолько древняя, что предшествует рождению строчных букв, которые появились не ранее VIII века.

— Феличи Дж., Типографика: шрифт, верстка, дизайн.


Всем нам буквицы знакомы по сказкам. Это напоминает детство. И если буквица сделано хорошо — это красиво. А сделать буквицу в LaTEX можно разными способами. Легче всего найти пакет dropping. Однако для масштабирования букв он требует использовать пакет graphics и непременно с опцией dvips. Таким образом, делать крупные буквицы в pdflatex или xelatex у меня с ним не получалось.

Решение мне подсказали на stackoverflow. Есть ещё пакет lettrine, возможности которого даже больше (особенно в плане обтекания буквицы с наклонным краем). Хитрость в том, что нужно использовать не только пакет lettrine, но и масштабируемый шрифт (например, Type 1, TrueType или OpenType). Работает и в pdfLaTEX, и в XLaTEX.

Вот работающий пример. Он расчитан на компиляцию xelatex-ом, и использует шрифт URW Bookman L.
\documentclass[12pt]{article}

% russian hyphenation babel + xecyr — better use polyglossia instead
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xecyr}

% using XeLaTeX
\usepackage{xltxtra}
\setmainfont{URW Bookman L-Light}

% use scalalable (Type 1) fonts to obtain nice results
% (using URW Bookman L Light, see \setmainfont)
\usepackage{lettrine}

\usepackage[papersize={13cm,4.5cm},
left=0.5cm,right=0.5cm,
top=0.5cm,bottom=0.5cm]{geometry}

\begin{document}
\lettrine[lines=3,slope=-8pt,nindent=-2pt]{У}{} одного бедного мужика не стало
хлеба. Вот он и задумал попросить хлеба у~барина. Чтобы было с~чем идти
к~барину, он поймал гуся, изжарил его и понёс. Барин принял гуся и говорит
мужику:

—\,Спасибо, мужик, тебе за~гуся; только не знаю, как мы твоего гуся делить
будем. Вот у~меня жена, два сына да две дочери. Как бы нам разделить гуся
без~обиды?
\end{document}
И вот результат (PDF по ссылке):

Подгонка строчек под буквицу сделана параметрами slope и nindent команды \lettrine. Второй обязательный аргумент команды (в примере пустой) — текст после буквицы, набираемый капителью.

Должно работать и с pdflatex, только нужно выбрать Type 1 шрифт. С латиницей проблем нет, а вот с кириллицей у меня не получается. Буду рад рецепту, как использовать Bookman в (pdf)LaTeX.

20090105

TeX и его варианты

Мои читатели ещё в прошлом году могли заметить, что я стал интересоваться «альтернативными» вариантами TEX-а, а именно XTEX-ом (см. XLaTEX и шрифты OpenType, Русский BibTEX и XLaTEX) и ConTEXt-ом. Предлагаю вам небольшой обзор, рассказывающий, что это за звери, и чем они отличаются от обычного TEX-а.

Начнём с того, что когда кто-то говорит «я набираю статьи в „тэхе“», чаще всего подразумевается, что тексты набираются с использованием разметки и команд макропакета LaTEX («латэх»), а затем документы компилируется в файлы формата PDF или DVI. При этом основную работу по вёрстке текста выполняет программа TEX («тэх»). Это означает, что большинство пользователей не использует TEX напрямую, а пользуется более высокоуровневыми наборами команд для разметки. А вот макропакет в свою очередь полностью полагается на TEX.

Теперь мы можем взглянуть на существующий зоопарк TEXнологий. Оказывается, царь зверей TEX в нём не одинок. И макропакет LaTEX — не единственный возможный выбор пользователя.

Начнём с основ. Простой TEX, созданный Дональдом Кнутом, практически заморожен и меняться не будет. Большинство же использует его расширенный вариант ε-TEX Питера Брайтенлонера. Букву «ε» можно понимать как обозначение для «улучшенный», «расширенный», «эволюционный» или даже «европейский» TEX. При этом ε-TEX настолько близок к своему предку, насколько это возможно, хотя и умеет, в отличие от него, например, писать справа налево.

Оба этих зверя выдают на выходе документ формата DVI, что, конечно, замечательно, но требует ещё дополнительной конвертации в PostScript или PDF. Да и не все возможности PDF доступны в DVI. Это привело к широкому распространению ещё одного варианта TEX: pdfTEX-a Хан Тэ Таня, который умеет верстать сразу PDF.
На мой взгляд, использование макропакета LaTEX совместно с pdfTEX-ом — наиболее предпочтительный вариант для набора научно-технических статей и документации. Этот тандем часто назвают одним словом: pdfLaTEX.
Использование pdfTEX-a даёт сразу несколько преимуществ по сравнению с традиционным TEX-ом:
  • можно использовать шрифты Adobe Type 1 и TrueType,
  • доступны микротипографические возможности полевого кернинга (аналог висящей пунктуации, распространяемый на все символы) и «раздвижки шрифта» («font expansion», затрудняюсь правильно по-русски назвать), улучшающей межсловные пробелы,
  • можно использовать такие возможности формата PDF как гиперссылки, таблицы оглавлений, метаданные документа,
  • можно использовать растровую графику,
  • можно сразу получать документ в формате пригодном для обмена с другими людьми.
Казалось бы, чего ещё желать?

А пожелать можно ещё две важных вещи:
  1. Поддержки Unicode. Времена однобайтных национальных кодировок прошли. И достаточно взглянуть на википедию, чтобы понять, что многоязыковые документы — это реальность.
  2. И поддержки OpenType. OpenType — это современная шрифтовая технология, которая должна постепенно заменить и Type 1, и TrueType. Она позволяет создавать единые уникодные шрифты с большим количеством глифов (до 65535), позволяет программировать на уровне шрифтового файла типографические «опции», такие как выбор альтернативных начертаний и стилистических особенностей, автоматических лигатур и замен, поддержку сложных систем писменности, облегчает разработку шрифтов за счёт, например, групп кернинга, а шрифтовые файлы OpenType, наконец, кроссплатформенны.
И оба эти желания довольно «трудные». Было уже несколько попыток их исполнить.

Исторически первая попытка подружить TEX и уникод — это, наверное, проект Omega. Никогда очень активным он не был, и, видимо, окончательно заглох. Его форк, проект Aleph, тоже больше не разрабатываетя.

Однако основная часть функционала Aleph была использована в проекте LuaTEX. Его основные особенности:
  • встроенный в TEX язык программирования Lua,
  • поддержка уникода,
  • поддержка OpenType независимо от ОС (используется код редактора FontForge)
Проект стартовал в 2006 году, и к августу 2009 планируется сделать первый официально-стабильный выпуск. Однако уже сейчас LuaTEX входит в дистрибутив TeXLive 2008 и может быть использован вместе с макропакетом ConTEXt. Ожидается, что именно LuaTEX станет pdfTEX-ом 2.0. Однако использовать LuaTEX совместно с LaTEX пока ещё нельзя.

Ещё один проект добавляющий поддержку и уникода, и OpenType в TEX — XTEX (читается как «зитэх»). И он уже сейчас работает, и уже сейчас может быть использован совместно с LaTEX.

Отличие XTEX от LuaTEX-а в том, что он полагается на поддержку OpenType на уровне операционной системы. В случае GNU/Linux — на библиотеки fontconfig и ICU. Большим достоинством XTEX является заметно упрощённая система работы со шрифтами. Совершенно единообразно можно использовать и старые шрифты Type 1, и новые OpenType.
Таким образом, можно подытожить: если хочется использовать уникод или шрифты OpenType в LaTEX, то сейчас это возможно с помощью XLaTEX. В ближайшем будущем, возможно, можно будет пользоваться и LuaTEX-ом. Однако в остальных случаях можно по-прежнему пользоваться pdfLaTEX. Этот вариант, пожалуй, также надёжнее, если планируется отдавать исходники документа в издательство или другим пользователям. Однако будущее, по моему, за уникодом и OpenType.


На последок несколько слов о макропакетах. Не считая «простого TEX», их два: LaTEX и ConTEXt. И если латэх хорошо известен, то о ConTEXt-е знают меньше. Основная разница между ними — в идеологии.

LaTEX старается дать пользователю средства описания структуры документа, а заботы о вёрстке взять на себя (возложить на разработчика класса документа). Однако некоторые средства управления вёрсткой пользователю всё же даёт (например, выбор начертаний и размеров шрифта). В результате получается более-менее пристойно свёрстанный документ практически без усилий со стороны пользователя (а пользователь может сосредоточится на содержании документа). На практике пользователи часто хотят так или иначе управлять вёрсткой. Хотя возможности самого LaTEX ограничены, нужных эффектов можно добиваться с помощью дополнительных макропакетов, которых существует очень много. К сожалению, активное использование этих макропакетов нарушает переносимость исходников между машинами, между пакетами могут быть конфликты, функциональность пакетов часто дублируется, а нужного результата достичь не всегда легко. Зато LaTEX — это практически «стандарт» для математических и физических статей.

Создатели ConTEXt избрали другой подход: изначально дать пользователю контроль над вёрсткой документа. В результате, требуется немного больше усилий, чтобы сверстать маленький документ «с нуля» (всё таки над макетом документа надо подумать), зато сразу есть все средства для сложной вёрстки. Особенно радует многоколоночная вёрстка. Большое внимание было уделено возможности создания больших и сложных коллекций документов в едином стиле.

Мне лишь недавно удалось набрать в ConTEXt русский текст (потребовалось исправление), но думаю, это проблемы роста. Вообще, надо отметить, что сообщество разработчиков и пользователей ConTEXt кажется очень активным и открытым. Да, ConTEXt поддерживает все вышеперечисленные варианты TEX.

Надеюсь, эта заметка поможет лучше ориентироваться в мире TEX-а. Если что-то упустил или в чём-то ошибся, просьба сообщить об этом в комментариях. На случай, если вы читаете эту заметку где-то в ином месте, комментарии можно оставить в блоге «советы.блогспот.ком». Там же доступна последняя версия этой статьи.