Показаны сообщения с ярлыком latex. Показать все сообщения
Показаны сообщения с ярлыком latex. Показать все сообщения

20091016

Микросоветы

Всё чаще в твиттер
одной строкой пост целый
пишу на память.

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

Приёмы работы
LaTeX и вёрстка
Программирование
Находки (всякие программки)

1. Приёмы работы:

  • Чтобы не закрывать Firefox, когда закрывается последняя вкладка по Ctrl-W: идём в about:config, находим browser.tabs.closeWindowWithLastTab, ставим false. Проверено на FF 3.5.
  • OpenOffice: чтобы запретить разрыв слова (т.е. запретить перенос), вставляем нечитаемый символ U+2060 (Zero-width WORD JOINER). Символ можно найти, запустив gucharmap. Надо в .XCompose добавить...
  • Чтобы использовать новый, сжимающий раза в два лучше, видео-кодировщик Theora 1.1, нужно взять саму новую библиотечку (уже есть в Debian unstable), и, главное, ffmpeg2theora версии не ниже 0.25. На сайте разработчиков есть и бинарные сборки.
  • Принудительное отключение подсветки ЖК-дисплея: xset dpms force off. Отсюда.
  • Банальность. Удаление пустых строк sed-ом: sed '/^\s*$/d'.
  • Редактируя диаграммы Graphviz в Vim, быстрый просмотр по :make можно сделать так: :set makeprg=dot\ -Tpng\ %\ \\\|display\ png:- errorformat='' autowrite. Подставить название используемой программы (dot, neato, fdp, ...).
  • Создание паролей (если нет KeePassX): cat /dev/urandom | tr -d -c 'a-zA-Z0-9' | fold -w 8 | head -1
  • Поиск и удаление дубликатов файлов: fdupes в командной строке, fslint — утилита с графическим интерфейсом.
  • В Debian можно заменить файл пакета, не пересобирая пакет. Поможет dpkg-divert.
  • sudo -i имитирует логин под рутом (даёт #). Бывает полезно (раньше sudo su - иногда пользовался).
  • Как создавать картинки предварительного просмотра видеофайлов:
    ffmpeg -itsoffset -1 -i видеофайл.avi -vcodec mjpeg -vframes 1 -an -y -f rawvideo -s 320x240 картинка.jpg ; done
    Как создавать картинки из PDF:
    convert -thumbnail 300x300 документ.pdf[0] -gravity center -extent 300x300 картинка.png


2. LaTeX и вёрстка:

  • Рекомендуемая минимальная ширина полей, чтобы документ можно было печатать и на A4, и на Letter — А4, слева и справа 20 мм, сверху и снизу 33 мм. RFC 2346.
  • Чтобы избежать разрыва страницы в LaTeX, можно поместить фрагмент текста в окружение samepage. Это частый вопрос.
  • Отступы элементов списка в LaTeX можно настроить, если использовать окружение list вместо itemize. Пример.
  • Чтобы добавить межабзацный пробел, \setlength{\parskip}{10pt plus 1pt minus 1pt}. Особенно полезно в наборе без абзацного отступа. Отсюда.
  • Чтобы выравнять картинку и текст справа от неё по вертикали, по середине, повозившись, сделал себе макрос \sidebyside{}{}:
    \newsavebox{\leftbox}\newlength{\leftboxheight}\newcommand{\sidebyside}[2]{\sbox{\leftbox}{#1}\settoheight{\leftboxheight}{\usebox{\leftbox}}\usebox{\leftbox}\raisebox{0.5\leftboxheight}{#2}}
    Смотрите пример использования.
  • Чтобы автоматически закрывать окружения LaTeX, пользователи Vim могут поставить плагин tex_autoclose. Использование: в режиме вставки Ctrl+\, затем c.
  • Разрезать на страницы и «склеивать» PDF-документы можно с помощью pdftk. Объединить два файла в один:
    pdftk первый.pdf второй.pdf cat output новый.pdf


3. Программирование:

  • В Python, примитивное транспонирование списка пар в пару списков:
    unzip = lambda pairs: zip(*pairs)
    @vlasovskikh подсказал, что для больших списков izip будет быстрее (проверили, так).
  • Занятное и доходчивое объяснение «что такое продолжения» на 11-й минуте видеопрезентации Swarm-dpl.
  • Быстро создавать графический интерфейс для научных программок позволяет библиотечка TraitsUI (Python). Пока не пробовал, но прочитал урок по TraitsUI.
  • Говорят, Intel готовит Concurrent Collections и для Хаскеля.
  • Я же пока проснулся и прочитал про со-процедуры на Си и устройство Даффа. Впечатлился.
  • Хотите полюбоваться, как можно добавлять побочные вычисления «наследованием» типов? Вот, пожалуйста, в этом примере (на Хаскеле). Хотя это, конечно не Java.
  • Учился использвать монадные трансформеры (бррр!) — оказалось несложно. В результате получился такой пример использования StateT поверх IO. Может кому пригодится.
  • Мелкое копирование словарей в Python — грабли.


4. Находки (всякие программки):

  • Atrack — анонимный открытый битторент трекер для Google App Engine. Всего 246 строк кода.
  • Sweet Home 3D — программа для планирования интерьера. Можно рисовать планы комнат, расставлять мебель, крутить по всякому. Сделана красиво.
  • fuse-zip — файловая система FUSE для монтирования zip-архивов. Быстрая, легко собирается по make, умеет писать в архив. Использование:
    fuse-zip архив.zip /точка/монтирования
    Есть также avfs, которая монтирует любые архивы, но не пишет и не такая удобная. Её использовать так:
    mountavfs ; ls ~/.avfs/полный/путь/к/архиву.zip#/файл/в/архиве
    В Debian нужно предварительно добавить пользователя в группу fuse.
  • Python(x,y) — дистрибутив Python для научных работников, для Windows и Ubuntu. Все инструменты и библиотечки «из коробки».
  • В дополнение к своему однострочнику antiodt нашёл ещё хороший конвертер ODT в Markdown odt2txt.py.
  • Дружественный к Гному вариант Xmonad — Bluetile. Раз попробовал, и две недели им пользовался.
  • Попробовал gitit. Самая простая вики для совместной работы над математическими текстами (вместе с jsMath из коробки). Хранилище — git или darcs.
  • TxtSushi — утилитки, позволяющие выполнять SQL-запросы по простому текстовому (CSV, TSV) файлу.


Ух-ты, а немало получилось.

20090827

Декоративная табличка в LaTeX

В TeXblog появилась заметка, как делать декоративные таблички в LaTeX. Вот такие:

Fancy tables with LateX and Tikz

Табличка набрана как обычно, но внутри «узла» окружения tikzpicture, а фон и раскрашенные шапки — средствами Tikz на фоне. Исходник примера — в TeX blog.

Кстати, давно хочу написать про PGF/Tikz. Что-нибудь интересно?

20090825

Как отслеживать изменения файлов в скриптах

Задача: отслеживать в скриптах изменения файла или файлов и выполнять какие-нибудь команды, когда файлы изменяются.

Пример: пересобирать документ LaTeX при изменении (сохранении) одного из исходных файлов.

Решение: остлеживать изменения можно с помощью утилит inotify-tools. Одна утилита, inotifywait ждёт указанных изменений и после этого завершается с тем или иным кодом возврата. Если произошло ожидаемое событие, код возврата 0 (успех). Именно inotifywait и используется в моём примере ниже. Другая утилита, inotifywatch, наблюдает за файлами и собирает информацию об изменениях, на выходе выводит табличку того, что заметила. Примеры применения этой утилиты смотрите на сайте inotify-tools, там же есть и дополнительные примеры использования inotifywait.

Пример использования: в данном случае я предполагаю, что все исходные файлы документа LaTeX лежат в текущем каталоге, а для сборки достаточно использовать pdflatex и bibtex. Вечный цикл: ждём любых изменений файлов текста или библиографии (первая команда цикла), в случае успеха (обнаруженных изменений) исполняем все нужные команды сборки документа (вторая команда цикла).
while true ; do \
inotifywait *.tex *.bib \
&& ( pdflatex -interaction=nonstopmode mypaper && \
bibtex mypaper && \
pdflatex -interaction=nonstopmode mypaper ) \
done

Естественно, применять можно для чего угодно, не только для LaTeX.

P.S. Вариант запуска LaTeX с опцией -interaction=nonstopmode позволяет с одной стороны избежать запроса интерактивного ввода в случае ошибки компиляции, а с другой стороны, позволяет эти ошибки компиляции всё же увидеть.

P.P.S. Рецепт работает только в линуксе. Для *BSD есть библиотечка pnotify и kqueue.

20090319

Как вставить формулу LaTeX в блоге или на форуме

Я уже как-то писал о том, как сделать картинку из формулы. Однако есть ещё более простые способы вставить формулу на веб-страницу.

1-й способ. Javascript-библиотека jsTeXrender (yourequations.com). GPLv3, кстати. Исходный код здесь (в том числе, серверной части).

Где-нибудь на странице подгружаем скрипт. Например, вставляем такой код перед </body>:
<script type="text/javascript" src="http://tex.yourequations.com/"></script>
А все формулы LaTeX пишем внутри тегов <pre lang="eq.latex"/> и <code lang="eq.latex">:
<pre lang="eq.latex">
\!i\hbar\frac{\partial}{\partial t}\psi=-\frac{\hbar^2}{2m}\nabla^2\psi+V\psi
</pre>
И получаем:

\!i\hbar\frac{\partial}{\partial t}\psi=-\frac{\hbar^2}{2m}\nabla^2\psi+V\psi
Плюсы: легко использовать, библиотечку можно разместить у себя. Формулы остаются читаемы даже при выключенном скрипте. При добавлении новых формул ничего настраивать не надо.

2-й способ. Javascript библиотека jsMath. В отличие от описанного в предыдущем способе jsTeXrender, jsMath не требует настроенного сервера для работы, а рисует формулы сама.

Для использования, нужно подгрузить библиотеку:
<script src="путь/к/библиотеке/easy/load.js"></script>
а формулы, по умолчанию можно писать прямо как в LaTeX:
\[
\!i\hbar\frac{\partial}{\partial t}\psi=-\frac{\hbar^2}{2m}\nabla^2\psi+V\psi
\]
jsMath находит их сама и перерисовывает как надо. При желании, маркеры начала и конца формулы можно настроить.

Рисует формулы jsMath хорошо. Достаточно сказать, что именно jsMath используется в стандартном интерфейсе блокнота Sage. Дополнительные примеры можно посмотреть на сайте jsMath.

Плюсы: простота использования и установки, только Javascript, без серверной части. Минусы: для качественного отображения предлагает пользователю установку специальных шрифтов, Javascript более тяжеловесный и медленный.

3-й способ. Идём на страничу Texify.com. Вводим туда свою формулу и получаем код для вставки на страницу.

texify example

Можно вставлять формулы и не заходя на сайт, URL картинок формируется так: http://www.texify.com/img/формула-LaTeX.gif. Очень удобно, если формулу надо поправить.

Дополнение. Выданный на texify.com адрес картинки с некоторых пор не работает за пределами сайта texify.com, так что картинку придётся сохранить, куда-то выложить и только после этого вставить, куда надо. Всё это лишает Texify.com смысла.

Аналогичный сервис доступен на mathURL.com. Как и tinyurl.com, он генерирует короткие адреса для картинок с формулами. Вот результат

формула нарисованная mathurl.com

Плюсы: минимум усилий для вставки одной-двух формул. Не зависит от скрипта (можно использовать, например, в ЖЖ или на форумах). Минусы: зависимость от внешнего веб-сервиса.

4-й способ. Похож на первые два, только картинку создаёт CGI-программка mimetex. Программка написана на Си, и TeX-а для своей работы не требует. Формула вставляется так:
<img src="http://ваш.сервер/cgi-bin/mimetex.cgi?формула-LaTeX" alt="формула-LaTeX">
а выглядит так:

mimetex example

Плюсы: легко организовать почти на любом сервере, где разрешены CGI-скрипты, не требует на нём установки LaTeX. Никакой зависимости от сторонних веб-сервисов. Минус: нужен свой сервер.

Вариант этого способа — CGI-программка mathtex. В отличие от mimetex, она использует настоящий LaTeX, установленный на сервере, и dvipng, чтобы создавать картинки. В остальном аналогична.

5-й способ. Есть настоящий pastebin для физиков и математиков. mathbin.net. Там можно постить фрагменты текста, и прямо там обсуждать, как на форуме. Это, однако, немного другой жанр.

5-й способ. Недавно возможность отрисовывать формулу LaTeX в виде картинки появилась в Google Charts. Ссылка на картинку формируется так: http://chart.apis.google.com/chart?cht=tx&chl=формула LaTeX. Например:

Google Charts example

(ссылка на картинку: http://chart.apis.google.com/chart?cht=tx&chl=\huge\!i\hbar\frac{\partial}{\partial%20t}\psi=-\frac{\hbar^2}{2m}\nabla^2\psi+V\psi).

6-й способ. Описан в этом блоге. Опять с подключением внешних скриптов, в этот раз предоставленных сайтом watchmath.com, которые, в свою очередь, обращаются к сервису mathcache.appspot.com. Отрисовкой формул занимается экземпляр mathTeX (см. выше), запущенный кем-то на инфраструктуре Amazon. Скрипты же позволяют вставлять формулы как в LaTeX, просто $формула$ или \[ формула \]. Подключаются скрипты так:
<script type="text/javascript"
src="http://mathcache.s3.amazonaws.com/replacemath.js"></script>
<script type="text/javascript">
replaceMath( document.body );
</script>
Пример отрисовки:
пример mathcache.appspot.com
По стилю использования получается похоже на jsMath. Примечание: при использовании этого скрипта все знаки «доллара» на сайте придётся защищать тегом <code>.

Ещё кое-какие способы перечислены здесь.

20090226

Церковно-славянский в Linux

Любопытствовал, как можно на компьютере работать с церковно-славянским текстом. В частности, в линуксе. И немало для себя сделал открытий. В частности,

а. Уникод для записи церковно-славянского текста пока ещё не вполне приспособлен, и вот почему. Хотя в будущем уникод обещает стать лучше.

в. За отстутствием «официальной» кодировки, была предпринята (видимо, удачная) попытка сделать единую кодировку для ЦС. Так и назвали, единой церковно-славянской, UCS. Она достаточно подробно описана здесь.

г. Свободно-распространяемые шрифты для кодировки UCS имеются. Для начала можно поставить Triodion, именно его многие сайты указывают в своих стилях. (В современном линуксе для установки шрифта как правило достаточно поместить все его файлы в ~/.fonts/)

д. Кодировка и шрифты решают проблему представления текста, но не решают проблему набора. А для набора было придумано «инвариантное представление церковно-славянского текста», HIP. Простыми словами: это основаный на простом тексте «легковесный» язык разметки, вроде Markdown, только адаптированный именно под набора ЦС и смешанных текстов. Например, буква «ѣ» набирается как «jь», «фита» как «f», «от» как «w\т». Разнообразные тексты в разметке HIP общедоступны, но полноценного конвертера для Linux я не нашёл. Зато есть онлайн-конвертер. И спецификации :)

е. Однако конвертер, может быть, и не нужен, если речь идёт о вёрстке текста. Есть как минимум два пакета для LaTeX, позволяющие набирать текст прямо в разметке HIP. Исторически первый из них — hiptex Александра Воинова. Позднее появился CSLTeX Алексея Вихлинина (кстати, он физтех!). Кажется, CSLTeX лучше, чем его предшественник hiptex.

Получается, всё, что нужно, уже есть. И чтобы на экране читать, и чтобы набирать, и чтобы верстать и красиво печатать.

Вот такие дела. Признаюсь сразу, что в этом вопросе я полный профан, но было интересно немного вникнуть. Из любви к прекрасному. Кстати, многое о церковно-славянском языке можно узнать из книжки Плетневой и Кравецкого (можно скачать в формате DjVu).

20090106

Буквицы в LaTeX

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

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


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

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

Вот работающий пример. Он расчитан на компиляцию 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-а, а именно X∃TEX-ом (см. X∃LaTEX и шрифты OpenType, Русский BibTEX и X∃LaTEX) и 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 — X∃TEX (читается как «зитэх»). И он уже сейчас работает, и уже сейчас может быть использован совместно с LaTEX.

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


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

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

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

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

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

20081226

Русский BibTeX и XeLaTeX

К заметке о шрифтах OpenType в XeLaTeX добавляю примеры совместного использования русского языка, BibTeX и XeLaTeX, как вместе с babel, так и вместе с polyglossia; смотрите PDF и его исходник.
Внимание: всё нижеследующее относится к использованию XeLaTeX, а не обычного, проверенного временем LaTeX.
Стандартное средство для работы с библиографией в LaTeX — BibTeX. Стандартное средство для «русификации» (включения нужных правил переноса, названий разделов, определённых типографических норм) — пакет babel. Однако ни BibTeX, ни babel не умеют работать с уникодом. В результате при попытке использования этих средств в XeLaTeX могут быть проблемы. В частности, проблемы возникают при попытке использовать их одновременно: при наборе русских текстов с русской библиографией.

Первое, не очень красивое решение: использовать по-прежнему babel, но подставлять костыли, переопределяющие русские символы. Второе решение: перейти от babel к использованию более современного пакета polyglossia.

Итак, предположим, что и документ, и библиография (bib-файл) набраны в уникоде (UTF-8) и содержат кириллические символы. Дальше есть два пути.

При использовании babel в каталог с документом необходимо положить xecyr.sty, а в преамбуле поместить примерно такой код:
\usepackage[cm-default]{fontspec} % or install lmodern
\usepackage{xltxtra} % load xunicode
\usepackage[russian]{babel}
\usepackage{xecyr}
Компилировать с помощью xelatex, запуская bibtex как обычно.

Для использования polyglossia нужно установить пакеты etoolbox и polyglossia. Можно просто поместить файлы etoolbox.sty, polyglossia.ins и polyglossia.dtx из этих пакетов в каталог с документом и выполнить
$ latex polyglossia.ins
а в преамбулу документа добавить примерно такой код:
\usepackage[cm-default]{fontspec} % or install lmodern
\usepackage{xltxtra} % load xunicode
\usepackage[russian]{polyglossia}
polyglossia довольно похожа на babel но имеет некоторые отличия. Чтобы переопределить название стандартного заголовка, например, списка литературы, можно использовать команду
\gappto\captionsrussian{\renewcommand{\refname}{Мои ссылки}}


P.S. Также дополнил предыдущую заметку о XeLaTeX примером, как обеспечить одинаковый рост строчных букв разных гарнитур.

20081206

Диссертация в LaTeX

Мой коллега-блоггер Миша Конник задумал титанический труд на тему «Как написать диплом в LaTeX». Который по задумке должен стать циклом статей, охватывающий вопросы от установки до вёрстки в LaTeX. Некоторые статьи уже готовы. Кстати, один подобный цикл статей, но более общего характера, уже существует.

Мне лично представляется, что при такой широте охвата материала работа эта необъятная. И если это будет коллективная работа, то место ей в Викиучебниках. Особенно в том, что касается вёрстки в LaTeX. Слишком много возможностей, слишком разные у всех задачи и тексты. Вопросы же установки и настройки во многом зависят от используемой ОС и используемого дистрибутива LaTeX. Остаются вопросы специфичные для написания именно диплома (или подобных работ: курсовых, диссертаций, отчётов). Я же в своём блоге стараюсь разрешать конкретные, частные вопросы.

В этой заметке я поделюсь кое-каким опытом написания кандидатской диссертации в LaTeX. Многое пригодится и тем, кто пишет дипломы. Писал я её три года назад, пользовался тогда teTeX (теперь TeXLive). Однако почти всё должно работать и сейчас. Во всяком случае, мой исходник по-прежнему компилируется PDFLaTeX. Об использовании русского языка в PDFLaTeX см. эту заметку. Не утверждаю, что всё сделал правильно или наилучшим образом. Очень может быть, что для ряда задач появились с тех пор лучшие решения.

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

Из технических вопросов, можно выделить:
  1. Вопросы соответствия требованиям по оформлению работы (как правило, они определяют используемый шрифт, макет страницы, отступы, порядок нумерации объектов, страниц, формат подписей, макет титульной страницы); тут лучше положиться на советы своего научного руководителя.
    В случае диссертаций, в соответствии с Положением о порядке присуждения ученых степеней, утверждены формы титульных листов диссертации и автореферата, а оформление диссертации «должно соответствовать требованиям, устанавливаемым Министерством образования Российской Федерации»
  2. Вопросы соответствия нормам отечественной полиграфии (не секрет, что ЛаТэХ по-умолчанию набирает «по-американски», в том числе формулы и математику), тут для начала можно посмотреть примеры правильного набора у К. Воронцова; вот некоторые из отличий:
    1. кавычки у нас используются французские или немецкие;
    2. иначе набирается тире (во всех случаях);
    3. отличается ряд математических символов, например, знаки нестрогих неравенств;
    4. используется другое начертание греческих букв;
    5. отличаются обозначения ряда функций и ряд других математических обозначений;
    6. знак «равно» дублируется при разрыве формулы на две строки;
    7. первый абзац набирается тоже с отступом;

  3. Оформление списка литературы регламентируется соответствующими ГОСТами. С 2009-го года, кстати, вступает в действие новый ГОСТ Р 7.0.5-2008. Думаю, обновлённые стили BiBTeX скоро появятся.
Лирическое отступление. Эта статья написана для блога советы.блогспот.ком и распространяется на условиях лицензии CC-BY-NC-SA 3.0, т. е. требует ссылки на оригинал и запрещает коммерческое использование текста.
В своей работе я использовал класс документа dissert.cls. Теперь его первоисточник что-то не находится, так что выкладываю ту версию, которую использовал сам. Однако очень может быть, что класс rusthesis.cls и лучше. Я его не пробовал. Есть ещё пакет disser, который служит тем же целям. Его я тоже не пробовал.

В плане размера шрифтов, межстрочного интервала* и полей я полагался на настройки пакета dissert.cls. Однако эти вещи легко настраиваются и вручную, см. заметки изменение межстрочного интервала в LaTeX и как задать поля страницы в LaTeX.
*) Да, я считаю, что полуторный, а тем более двойной, интервал — это некрасиво, разве что удобно, чтобы делать правки на бумаге. Однако таков жанр.
Набирал текст я в кодировке CP1251, в основном с расчётом на то, чтобы в процессе работы можно было спокойно давать исходник пользователям Windows. Однако это практически не потребовалось.
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage[T2A]{fontenc}
Также я пользовался пакетом шрифтов pscyr, пользоваться которым я, однако, не рекомендую, по причине неясной лицензии на распространение этих шрифтов. К счастью, свободно-распространяемых шрифтов с тех пор прибавилось.

Переопределение формата нумерации в списке литературы:
\makeatletter
\renewcommand\@biblabel[1]{#1.}
\makeatother
Надпись «Стр.» над номерами страниц в таблице с оглавлением (только для класса документа dissert.cls):
\renewcommand\contentsdesc{Стр.}
Первый абзац с отступом:
\usepackage{indentfirst}
Далее, я переопределял формат подписей под иллюстрациями:
%different caption style: ``Fig.~N.~Caption text''
\makeatletter
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1.~#2}%
\ifdim \wd\@tempboxa >\hsize
#1.~#2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\makeatother
Также я использовал пакет hangcaption, чтобы обеспечить «висящие» номера иллюстраций. Это выглядело примерно так:

________________
,́ `.
| |
| @}---,--`-- |
| |
`.________________,'


Рис. 1.1. Что значит имя? Роза пахнет розой,
хоть розой назови её, хоть нет.
Я также включал макрос \reversemarginpar, поскольку широким в диссертации является именно левое поле.

Для организации иллюстраций несколько в одной я использовал пакет subfigure. Соответственно, чтобы включить нумерацию внутренних элементов иллюстрации русскими буквами («Рис. 3.14 (д)»):
\renewcommand{\thesubfigure}{(\asbuk{subfigure})~}
Я опущу все макросы, касающиеся набора математики. С высокой вероятностью, у моих читателей они будут другие.

Шаблон же основной части документа у меня был такой:
\begin{document}

\tableofcontents
\clearpage

\include{intro}
\clearpage

\include{ch02}
\clearpage

\include{ch03}
\clearpage

\chapter*{Заключение}
\addcontentsline{toc}{chapter}{Заключение}
Текст заключения.
\clearpage

\listoffigures
\addcontentsline{toc}{chapter}{Список иллюстраций}
\clearpage

\listoftables
\addcontentsline{toc}{chapter}{Список таблиц}
\clearpage

\renewcommand{\bibname}{Список использованных источников}
\addcontentsline{toc}{chapter}{Список использованных источников}
\bibliographystyle{gost71u}
\bibliography{thesis}
\end{document}
Как можно заметить, я вынес все главы в отдельные файлы (вообще, такой подход можно рекомендовать для набора любых больших документов). Правильные заголовки всяких «списков» в оглавление вносил вручную (команды \addcontentsline). Ещё изменил название списка литературы. А формат списка литературы определил с помощью стиля BiBTeX gost71. В случае, если это не годится, можно создать собственный стиль BiBTeX.

В будущем, возможно, я дополню эту заметку особенностями набора математики (пока можно обратиться к примерам К. Воронцова), некоторыми особенностями набора автореферата (который набирается на формате A5) и шаблоном титульного листа.

Хотя этот текст распространяется, как обычно в моём блоге, по лицензии CC-BY-NC-SA (т.е. со ссылкой на советы.блогспот.ком и не для коммерческого использования), но если кто-то хочет использовать его в Викиучебниках или других проектах Wikimedia Foundation, то в этом случае можно распространять на условиях GFDL.

Дополнение 2009-10-18: нашёл ещё серию статей Павла Самолысова «Верстаем диплом в LaTeX». Может кому пригодится.

20081201

XeLaTeX и шрифты OpenType в LaTeX

Использовать нестандартные гарнитуры в традиционном LaTeX не так-то просто. Практически, необходимо иметь отдельный пакет LaTeX для каждой новой гарнитуры. Для ряда распространённых гарнитур такие пакеты есть. А если хочется нестандартную гарнитуру, для которой нет стандартного пакета?

Легко использовать любые современные шрифты TrueType и OpenType позволяет XeLaTeX.

Вначале нужно установить XeLaTeX. В Debian/Ubuntu для этого достаточно поставить пакет texlive-xetex.

Помимо этого, нужно определиться собственно с используемыми шрифтами. XeLaTeX может использовать любые шрифты, которые может использовать Fontconfig. Просмотреть список установленных в системе шрифтов и их имена можно с помощью команды fc-list:
$ fc-list | grep Inconsolata
Inconsolata:style=Medium
Ещё можно поставить программу FontMatrix для просмотра и сравнения шрифтов. Установку дополнительных шрифтов я здесь описывать подробно не буду, скажу лишь, что в большинстве случаев для этого достаточно поместить файлы шрифта в ~/.fonts/.

Далее создаём документ LaTeX, как обычно. В преамбулу добавляем:
\usepackage[cm-default]{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
Главный пакет тут — fontspec. Опция cm-default необходима, чтобы он не пытался использовать шрифты lmodern (которые в Debian/Ubuntu надо ставить отдельно, а русских глифов в них всё равно нет).

Как я понял, xunicode изменяет традиционнее латэховские макросы вроде \" таким образом, что немецкую «о умляют» (ö) в XeLaTeX можно ввести не только напрямую с клавиатуры как ö, но и как обычно, \"o. Вообще, все уникодные символы можно вводить непосредственно с клавиатуры (например, с помощью клавиши Compose). Это удобно. Пакет xltxtra добавляет чудесный макрос \XeLaTeX.

Затем можно задать стандартные шрифты документа:
\setromanfont{Charis SIL}
\setsansfont{Liberation Sans}
\setmonofont{Inconsolata}
В общем-то, названия этих команд говорит сами за себя. Они меняют шрифт всего документа в целом. Есть ещё команда \setmainfont{Имя шрифта}.
Дополнение 20081226: поскольку рост строчных букв у разных гарнитур одного кегля разнится, то при совместном использовании в пределах одного абзацах их необходимо соответствующим образом масштабировать. Для того, чтобы обеспечить одинаковый росит строчных букв, можно задать глобальную опцию:
\defaultfontfeatures{Scale=MatchLowercase}
Можно, конечно, задавать опцию Scale для каждой гарнитуры отдельно. Аналогичная опция Scale=MatchUppercase позволяет обеспечить единый рост заглавных букв разных гарнитур.
Временное переключение гарнитуры делается командой \fontspec{Имя шрифта} в теле документа.

Компилировать нужно с помощью xelatex вместо latex. А так — как обычно. Получается PDF. Всё на удивление просто. Примеры по ссылкам. Инструкции в примерах немного более подробные, чем в этой заметке.

пример использования (исходник, UTF-8)
пример использования (PDF)

Да, очень рекомендую посмотреть на что способен XeLaTeX, если ему дать хороший шрифт. Вот только где бы ещё лицензионных (свободно распространяемых) русских шрифтов найти…

Дополнение: XeLaTeX не совместим с пакетом babel. Можно или пользоваться дополнительным пакетом xecyr, переопределяющий кириллический символы LaTeX в соответствии с уникодом, или пользоваться пакетом polyglossia, заменяющим babel. Спасибо Shender-у за подсказанные решения.

Дополнение 20081226: выкладываю также примеры использования BibTeX совместно с XeLaTeX для написания русскоязычных текстов. Рассмотрены оба способа: и с babel+xecyr, и с polyglossia.

20081121

XPDF для предварительного просмотра LaTeX

При редактировании документов LaTeX я обычно пользуюсь для предварительного просмотра xpdf. Несмотря на его спартанский интерфейс, тому есть пара весомых причин:
  • он запускается быстрее всех других PDF-смотрелок, это удобно при использовании из командной строки;
  • он умеет принудительно перезагружать документ (клавиша R).
В общем-то это главное, что нужно для предварительного просмотра.

Вот ещё несколько менее известных, но полезных при таком использовании xpdf возможностей:
  • у xpdf есть удобные клавишы для быстрого переключения масштаба (Z — чтобы уместить страницу, W — уместить по ширине);
  • включить полноэкранный режим можно сочетанием ALT-F;
  • указать желаемый масштаб можно прямо из командной строки:
    xpdf -z page myfile.pdf
    или
    xpdf -z width myfile.pdf

  • и самое главное, можно открыть документ сразу на нужной странице:
    xpdf myfile.pdf номерстраницы

20080918

Python внутри LaTeX (и математический пакет Sage тоже)

Недавно узнал такой приёмчик: внутри документа LaTeX можно исполнять скрипты на Python. Можно использовать, например, для автоматической генерации фрагментов текста (например, таблиц, илюстраций), считывания данных из внешних источников и т.д. Простор для фантазии большой.

Для этого нужно:
  • скачать файл python.sty (копия python.sty на gist.github.com). Положить его в каталог с документом.
  • В документе в преамбуле включить \usepackage{python}
  • Внутри документа фрагменты кода на Python помещать в окружение \begin{python} — \end{python}. Всё, что эти фрагменты кода будут печатать, станет частью конечного документа.
  • Запускать LaTeX нужно с опцией -shell-escape (разрешая тем самым запуск внешнего кода из-под LaTeX)
Вот, пример исходника LaTeX и PDF, который из него получается.

Дополнение 2008-09-22: Вот более интересные примеры использования Python внутри LaTeX, файл LaTeX и полученный из него PDF. В этих примерах: символические вычисления с помощью sympy, сохранение переменных между вызовами Python, построение графиков с помощью matplotlib.

P.S. Заодно узнал, что есть такая штука, как Sage, пакет для математических расчётов, объединяющий в себе многие разработки с открытым исходным кодом. Очень похоже на Matematica, но в отличие от последней с нормальным, питоническим синтаксисом:) Так вот, Sage тоже можно вызывать прямо из LaTeX (и подставлять в него результаты, картинки и прочее). Это делается пакетом sagetex. Да, кстати, начать пользоваться Sage можно не устанавливая его, а воспользовавшись web-версией. Das ist fantastisch. Google Docs отдыхают.

Ссылки по теме:
Embedding Python in LaTeX
Примеры использования Python внутри LaTeX: симолические вычисления, построение графиков, сохранение результатов
Sage, достойная альтернатива Математике
Пример использования Scheme внутри LaTeX

Этот пост по-английски: Python inside LaTeX (and Sage too)

20080913

Знакомство с ConTeXt

Разглядывал такую вещь, как ConTeXt. Надстройку над Plain TeX, в некотором смысле альтернативу LaTeX. Достаточно взглянуть на мануал к нему, вот этот или вот этот, чтобы понять, на что он способен. Судя по этим руководствам, некоторые вещи делаются в ConTeXt лучше и проще, чем в LaTeX. Например:
  • размещение илюстраций и таблиц, обтекание их текстом естественны (кто возился с плавающими илюстрациями в LaTeX — знает, чего это стоит там)
  • есть нормально работающая многоколоночная вёрстка (опять же, подводные камни многоколоночной вёрстки в LaTeX на картах широко отмечены)
  • есть возможность вёрстки по сетке (например, возможно сохранение постоянного межстрочного интервала)
  • отложенный вывод материала является стандартным инструментом, а не высшим пилотажем для знатоков, есть возможность создания целой серии документов, использующих общий исходник и общие стилевые настройки (сказывается изначальная ориентация ConTeXt на создание учебных материалов, например, из одного исходника можно сформировать и лекционные записи, и задачник со списком ответов в конце, и решебник с объяснениеми решений, идея понятна)
  • большинство задач, касающихся вёрстки материала, решаемы встренными средствами самого ConTeXt, нет необходимости прибегать к сторонним пакетам (в случае LaTeX иногда имеется по несколько сходных пакетов, разной степени современности и с разными командами/разметкой)
  • есть развитые средства создания интерактивных и гипертекстовых документов
В общем, всё хорошо и интересно. Если не для написания статей, то для личного использования приспособить ConTeXt можно.

Кириллица в ConTeXt вроде тоже должна поддерживаться. Как средствами pdfTeX, так и уникодного XeTeX. Быстренько поставил ConTeXt из репозиториев Debian, решил попробовать. Однако на практике, попытка собрать примеры с русскими буквами в ConTeXt, приводила к появлению на свет PDF, в котором русские слова записаны транслитом. Т.е. вроде и разные кодировки русские понимает, и не ругается, а вот со шрифтами что-то не то. Если кто разберётся с этим зверем — дайте знать.

Решение проблемы с кириллицей. Кажется, найдёно решение проблемы транлитерации русского текста. Эта ошибка в ConTeXt, похоже, появилась недавно и исправление уже есть (думаю, оно попадёт в будущие версии ConTeXt). На данный момент я сделал так:
  • скачал type-one.zip
  • распаковал файл type-one.tex и заменил им файл /usr/share/texmf/tex/context/base/type-one.tex (да, при следующем апгрейде пакета context эта замена пропадёт, по-хорошему надо собрать новый deb-пакет)
После этого стандартный пример
\enableregime[utf]
\useencoding[cyr]
\definetypeface [russian]
[rm] [serif] [computer-modern] [default] [encoding=t2a]
\setupbodyfont[russian,24pt]
\starttext
Немного русского текста для пробы.
\stoptext
сохраняем в файл. Чтобы скомпилировать, запускаем
$ texexec myfile.tex
Результат содержит русские буквы. Выглядят они не лучшим образом, но для начала неплохо:



См. также:
☙ TeX и его варианты

20080715

Автоматическая компиляция документов LaTeX (с помощью SCons)

Сколько нужно команд, чтобы скомпилировать PDF из документа LaTeX? Как минимум две: pdflatex mypaper.tex; pdflatex mypaper.tex. А если при этом используется библиография в формате BiBTeX? Уже как минимум четыре: pdflatex mypaper.tex; bibtex mypaper; pdflatex mypaper.tex; pdflatex mypaper.tex. А бывает, что документ нужно пропустить через LaTeX более, чем два раза? Бывает. А сколько раз нужно всё это проделывать во время редактирования документа? Много. Удобно всё это? Если честно, не очень. Но жизнь себе упростить можно.

Берём и устанавливаем SCons. В каталоге с файлом LaTeX создаём файл SConstruct вот такого содержания:
PDF(target='mypaper.pdf',source='mypaper.tex')
Вот и всё! Теперь достаточно одной команды:
$ scons
— и, если что-либо в документе или библиографии изменилось, то scons выполнит все нужные команды самостоятельно, запустит bibtex, если он используется, запустит несколько раз pdflatex (если необходимость этого указывается в логе)…

А если запустить scons повторно? А ничего не будет:
$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
— scons проверяет MD5-суммы исходных файлов и ничего не делает, если файлы не изменялись.

А если я хочу, чтобы файл перекомпилировался, когда меняется одна из иллюстраций? Проще простого. Поскольку я держу все картинки в подкаталоге imgs/ в формате PDF, то достаточно просто добавить их в список исходных файлов. Например так (содержимое файла SConstruct):
src = [ 'mypaper.tex', Glob('imgs/*.pdf') ]
PDF(target = 'mypaper.pdf', source = src)
— функция Glob создаст список всех файлов, удовлетворяющие шаблону.

А если нужен не PDF, а PS? Или DVI? Соответственно и в SConstruct достаточно написать
PostScript(target='mypaper.ps',source='mypaper.tex')
или
DVI(target='mypaper.dvi',source='mypaper.tex')


Вообще говоря, SCons — может управлять компиляцией не только документов LaTeX. Это универсальный и гибкий инструмент сборки программ, аналог комбинации Make и autoconf/automake. Я о нём узнал совсем недавно, увидев, что он используется в проекте FEniCS — почитал мануал — и понравилось. Файлы SConstruct (аналог Makefile) являются полноценными скриптами на Python (описать простые правила сборки просто, а сложные — возможно); scons умеет автоматически отслеживать зависимости в C, C++ и Java; «из коробки» поддерживаются C, C++, D, Java, Fortran (разных версий), ObjectiveC, Yacc, Lex, Qt, SWIK, и TeX/LaTeX (можно написать собственные «конструкторы» для других языков/инструментов); может отслеживать изменения по MD5-суммам, а не только по дате изменения; SCons умеет брать нужные файлы из других каталогов или систем управления версиями (CVS, Subversion); изначально спроектирован так, чтобы делать кросс-платформенные сборки было просто (в том числе проверки в стиле autoconf требуют на порядок меньшей настойчивости в изучении документации); поддерживаются параллельная сборка и кэш компилятора (как ccache, только не только для C/C++). А для работы самого SCons достаточно почти любого, самого замшелого Python. Ну и вообще, удобно, что «мэйкфайл» для компиляции документа LaTeX — всего одна строчка ;-)

Да, компилировать документы LaTeX можно, конечно, и с помощью старого проверенного make. Вот, кстати, и неплохой Makefile для этого дела.

См. также:

Эта заметка по-английски: Auto-building LaTeX documents with SCons

20080319

Изменение межстрочного интервала в LaTeX

После почти трёхнедельного перерыва я наконец более-менее освободился и могу возобновить свои записи в блог:) Сегодня я достаю из черновиков и публикую описание двух способов изменить межстрочный интервал в LaTeX.

Итак, простой способ:
% в преамбуле, чтобы использовать полуторный интервал
\renewcommand{\baselinestretch}{1.5}


Способ хитрее: использовать пакет setspace, в этом случае можно менять межстрочный интервал для фрагментов текста:
% в преамбуле
\usepackage{setspace}
\onehalfspacing % полуторный интервал для всего текста
% или \singlespacing % одиночный интервал для всего текста
% или \doublespacing % двойной интервал для всего текста
% или \setstretch{множитель} % произвольный интервал
...

% в тексте
\begin{onehalfspace}
фрагмент текста с полуторным межстрочным интервалом
\end{onehalfspace}
\begin{doublespace}
фрагмент текста с двойным межстрочным интервалом
\end{doublespace}


В общем, можно использовать следующие окружения из setspace меняют межстрочный интервал для фрагмента текста: singlespace, onehalfspace, doublespace, spacing (требует параметра). А команды \singlespacing, \onehalfspacing, \doublespacing и \setstretch{множитель} в преамбуле меняют межстрочный интервал всего документа в целом.

20080204

Как задать поля страницы в LaTeX

Чтобы задать поля страницы в LaTeX, проще всего воспользоваться пакетом geometry. И прямо в параметрах пакета прописать нужные параметры:
% в преамбуле
\usepackage[left=2cm,right=2cm,
top=2cm,bottom=2cm,bindingoffset=0cm]{geometry}

Менять параметры отдельных страниц можно с помощью команд и окружений из пакета chngpage.

Дополнение: Здесь же укажу, как задать произвольный размер страницы:
% в преамбуле
\usepackage[papersize={13cm,8cm},и другие параметры]{geometry}

20080109

LaTeX: Как уместить текст на страницу

Иногда необходимо, чтобы определённый текст вместился строго на одну страницу, а одна или две строчки не влезают... И текст трогать (убирать из него лишнее) уже нельзя.

В этом случае, чтобы «увеличить» нужную страницу, на помощь придёт команда \enlargethispage.

Например, команда \enlargethispage{2\baselineskip} позволит текущей странице стать длиннее (выше) на две строчки. Вариант команды «со звёздочкой», \enlargethispage*{длина}, попытается сжать страницу насколько это возможно.

После использования \enlargethispage, страницу надо завершать явным указанием её конца, для этого служит команда \pagebreak.

Можно также воспользоваться пакетом chngpage, позволяющим менять параметры макета страницы для отдельных фрагментов текста (например, сузить или расширить поля для отдельной страницы).

Его, как и команду \enlargethispage, следует использовать осмотрительно: следить, чтобы полученный документ выглядел аккуратно. В идеале использование этих приёмов должно оставаться незаметным.

Поворот страницы в LaTeX

В этом посте я расскажу, как изменить ориентацию отдельной страницы в LaTeX с сохранением ориентации номеров. Это может быть нужно, например, если надо разместить широкую иллюстрацию или таблицу в документе с портретной ориентацией страниц.

Поможет в этом пакет lscape и окружение landscape им предоставляемое:

% в преамбуле
\usepackage{lscape}
...
% в тексте
\begin{landscape}
...
% часть текста, которая должна быть повёрнута (напечатана как на горизонтально-ориентированной странице)
...
\end{landscape}
Примечание: если используется драйвер pdftex, а не dvips, то в преамбуле документа нужно писать \usepackage[pdftex]{lscape}. Спасибо Дмитрию за комментарий. Хочу, однако, заметить, что у меня в pdfLaTeX из TeXLive работает и без этой опции.

Установка дополнительных пакетов LaTeX в Debian

Многие пакеты LaTeX доступны непосредственно из репозитория Debian, в частности в пакетах texlive-latex-recommended и texlive-latex-extra. Однако бывает, что нужно воспользоваться каким-то пакетом, который в дистрибутив не включен (но есть на CTAN).

Инструкции по ручной установке таких пакетов можно найти в руководстве Debian-specific information about TeX packages.

Если кратко, то установка дополнительных пакетов вручную состоит всего из двух шагов:
1. поместить файлы пакета туда, где (La)TeX ожидает их найти,
2. зарегистрировать новые файлы.

(La)TeX ожидает найти новые пакеты внутри каталога TEXMFLOCAL, который обычно находится /usr/local/share/texmf.

Для пакетов LaTeX там нужно создать подкаталог tex/latex/имя пакета (или использовать tex/latex/misc) и поместить туда файлы пакета; документацию надо положить в doc/latex/имя пакета. Если пакет распространяется в виде пары файлов *.dtx и *.ins, то, чтобы создать файлы пакета, нужно обработать latex .ins-файл, а чтобы создать файлы документации — .dtx-файл. После этого файлы *.dtx и *.ins больше не нужны. Ну и, конечно, нужно читать, что написано в файле README идущем вместе с пакетом.

После того, как файлы пакета разложены куда надо, зарегистрировать их легко. Запустите команду mktexlsr (известную также как texhash). Она пересоздаст файлы ls-R для всех каталогов TeX, в которых у пользователя есть права на запись.

Можно также устанавливать пакеты в пользовательское дерево TeX (TEXMFHOME), которое обычно находится в $HOME/texmf. Об особенностях установки пакетов в домашний каталог, а также об особенности установки шрифтов вручную, можно прочитать всё в том же руководстве.

Эффективная конвертация растра в EPS или PDF

Чтобы использовать растровое изображение в документе LaTeX есть два пути: пользоваться PDFLaTeX, позволяющим включать изображения форматов PNG и JPEG непосредственно, или конвертировать растровые изображения в EPS, а потом работать с ними как обычно. Необходимость конвертировать растр в EPS возникает и при желании использовать другие средства вёрстки и векторные графические редакторы.

К сожалению, обычный способ конвертации с помощью ImageMagick (convert) или распространённых графических редакторов даёт EPS файлы довольно большого размера. Есть программы, которые делают эту работу лучше.

Одна из них — sam2p — есть в репозиториях Debian, и полученные с помощью её EPS файлы действительно довольно маленькие.

Для конвертации в EPS команда будет выглядеть примерно так:
$ sam2p image.png EPS: image.eps


Соответственно для конвертации в PDF:
$ sam2p image.png PDF: image.pdf


Среди полезных опций программы sam2p есть выбор версии PostScript, разрешения получаемого файла (в dpi) и алгоритма сжатия (LZW, ZIP, RLE, FAX, DCT, JPEG).

Вот, к примеру, результат конвертирования скриншота программы Google Earth с помощью sam2p и с помощью ImageMagick:
$ ls -rSsk1 google-earth-screenshot*
1756 google-earth-screenshot.png
3016 google-earth-screenshot-(sam2p).eps
4304 google-earth-screenshot-(convert).eps

EPS, конечно, получился больше, чем PNG (кто бы удивилялся). Интереснее сравнить полученные EPS между собой. В данном случае разница в 1,5 раза. Может показаться, что это не существенно, но если таких изображений много, то накопится прилично. А если изображения попроще, чем спутниковые фотоснимки, разница более заметна.

Например, вот такая картинка в формате PNG:


И вот такие результаты конвертации в EPS:
$ ls -rSs1k pooh-pooh*
84 pooh-pooh.png
156 pooh-pooh-(sam2p).eps
872 pooh-pooh-(convert).eps

Разница между convert и sam2p в 5,5 раз, в пользу последнего!

Есть ещё на CTAN пакет bmeps, который, по слухам, тоже неплохо справляется с задачей конвертации растра в EPS — но его я пока не пробовал.

Ссылки по теме:
страница sam2p
страница bmeps

P.S. Я написал эту заметку также по-английски: Effective conversion from raster to EPS.