понедельник, 12 сентября 2011 г.

Храним TeX документы в Mercurial репозитории

TeX plus Mercurial

Недавно я переехал с Subversion на Mercurial. И похоже, что добровольно назад не вернусь :). Я действительно проникся той идеей, что поскольку процесс разработки ПО является сам по себе распределённым процессом, то и система контроля версий должна быть распределённой. И ещё тем, что начало работы с VCS должно быть максимально простым. Это позволяет использовать мощь VCS в любом проекте, не задумываясь, как в случае с централизованными системами, окупятся ли усилия по поднятию и/или созданию репозитория. И ещё... а, ладно, на тему CVCS vs. DVCS написано предостаточно ...

TeX'ом, а точнее XeLaTeX'ом (как LaTeX, только современней: utf8 как стандартная кодировка и возможность использования любых установленных шрифтов) я пользуюсь уже давно, в силу того, что по учёбе нужно писать много курсовых/отчётов, а учусь я на технической специальности. Соответственно, формулы, теоремы, определения... И лучше TeX с этим никто не справляется.

Скажу пару слов о структуре документа, которой я придерживаюсь при работе с TeX, чтобы вам было проще адаптировать предложенные в статье настройки под свои нужды. Для каждого документа создаётся свой каталог. В этом каталоге лежит один главный файл, назовём его мастер-файлом, в котором находится преамбула, и БД BibTeX (точнее, symlink на неё). Разделы документа, включая титул, хранятся в отдельных .tex файлах в подкаталоге sections/. Иллюстрации хранятся в подкаталог pics/. Картинки подключаются в файлах разделов, файлы разделов подключаются через \include{} или \input{} в мастер-файле.

Итак, у нас возникает естественное желание совместить Mercurial с TeX. Помимо стандартных для VCS возможностей откатить любые изменения и посмотреть продуктивность работы (по истории коммитов), у этого решения есть ещё один жирный плюс: можно создать репозиторий на bitbucket.org и автоматически получить лёгкое резервное копирование. Что-что, а бекап ещё никому мешал. (Да-да, я отношусь к той категории людей, которые уже ;) делают бекапы)

В общем-то, хитростей никаких нет, всё максимально просто и удобно. Единственной загвоздкой является игнорирование в репозитории служебных файлов TeX: всякие там .aux, .log и т.п.

Решение этой проблемы зависит от инструмента, которым компилируется документ. Тут особенно выделяется SCons, который сам знает, что есть мусор в мире TeX, а что нет. То есть, достаточно выполнить clean (или как там у SCons это называется) перед коммитом. Сам не проверял, но говорят, что работает. Кстати, SCons сам знает, как собирать TeX документ. В других подобных системах, например, GNU Make, схема та же, хотя все действия придётся прописывать вручную.

Если же документ собирается каким-нибудь специализированным TeX-редактором или скриптом, или ещё чем-то, у чего нет волшебного аналога make clean, можно применить другой подход. А именно: не удалять файлы, а заставить Mercurial игнорировать их. Причём можно обойтись без перечисления всех возможных типов файлов, которые TeX может сгенерировать.

Суть решения состоит в том, что нам надо сказать Mercurial: "Игнорируй всё, кроме *.tex". Ну не совсем-совсем всё, а с небольшими исключениями типа картинок-иллюстраций. И после этого вручную, через hg add, добавить нужные (исходные) файлы. Этот подход оправдан, так как:

  1. Исходных файлов значительно меньше, чем сгенерированных TeX'ом.
  2. Они в большинстве своём подходят под шаблон *.tex.

Шаблоны имён, которые следует игнорировать, прописываются в файле .hgignore в корне репозитория. Документация по этому вопросу доступна [здесь][hgignore-doc], я же приведу сразу свой .hgignore в качестве примера.

syntax: glob
*~
doc/presentation/*.*
doc/report/*.*
doc/report/sections/*.*

Итак, разберём по порядку, что здесь написано. В корне репозитория есть каталог doc/, в котором есть 2 каталога для двух TeX документов: doc/report/ и doc/presentation/. Я говорю Mercurial игнорировать всё в этих каталогах и затем вручную добавляю файлы doc/report/report.tex и doc/presentation/pres.tex с помощью hg add. Больше в этих каталогах ничего ценного нет, только файлы сгенерированные TeX. Может понадобиться дополнительно добавить файл списка источников BibTeX. У меня же пришлось дополнительно выполнить

hg add doc/report/sections/*.tex

чтобы добавить в репозиторий TeX файлы отдельных глав.

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

Необходимость в такой настройке у меня возникла в связи с одной особенностью AUCTeX (расширение Emacs для редактирования TeX). Заключается она в том, что AUCTeX создаёт служебные файлы для всех *.tex файлов, а не только для мастер-файла, как это происходит, если использовать компилятор TeX вручную. То есть, если вы пишете курсовую и титул у вас лежит в sections/title.tex, то рядом с ним AUCTeX положит какие-нибудь title.aux и title.log. Чтобы их поудалять, надо открыть каждый файл в редакторе и выполнить команду очистки О_о. Хотя может я просто не умею его готовить.

На последок посоветую обратить внимание на AUCTeX. Это очень мощный и удобный инструмент, особенно когда используется вместе с RefTeX, специальным дополнением к Emacs для работы с перекрёстными ссылками, ссылками на литературу и тому подобными вещами в TeX. Связка AUCTeX + RefTeX уделывает какой-нибудь там Texmaker также, как Texmaker уделывает блокнот.

Комментариев нет:

Отправить комментарий