понедельник, 28 июня 2010 г.

Внедрение номера ревизии SVN в документ LaTeX

Допустим, мы разрабатываем с использованием LaTeX некоторый документ, исходники которого хранятся в системе контроля версий Subversion. Необходимо сделать так, чтобы по документу можно было определить, из какой ревизии он был собран. Для этого следует внедрить номер ревизии в текст документа, например, с помощью сноски:

Разведение слонопотамов%
\footnote{Собрано из ревизии \input{revision.tex}.}

Вместо команды \input{revision.tex} при трансляции документа подставляется содержимое указанного файла. Комментарий в конце первой строки убирает пробел, на который заменяется символ перевода строки. Файл revision.tex будет содержать номер ревизии, например 366. При каждой сборке документа необходимо просмотреть все рабочую копию, сравнить сохраненный номер ревизии с текущим и при наличии несоответствия обновить revision.tex и пересобрать документ.

Содержимое Makefile:

BUILD_DIR = build
MAIN_TEX = svnversion.tex
REVISION_TEX = revision.tex
TEX = $(MAIN_TEX) $(REVISION_TEX)
PDF = $(BUILD_DIR)/svnversion.pdf

Объявляются необходимые переменные. BUILD_DIR - директория для результатов сборки, MAIN_TEX - основной документ, имя которого будет передаваться транслятору LaTeX, REVISION_TEX - файл с номером ревизии, TEX - список файлов-зависимостей, PDF - файл-цель.

MKDIR = mkdir
RM = rm
SED = sed
SED_COMMAND = "s/\([0-9]\+:\)\?\([0-9]\+[A-Z]*\)/\2/"
REVISION_BAT = revision.bat
SVNVERSION = svnversion
SVNVERSION_OPTIONS = -n
LATEX = pdflatex
LATEX_OPTIONS = -output-directory=$(BUILD_DIR)

MKDIR, RM, SED, REVISION_BAT, SVNVERSION, LATEX - программы и команды, использующиеся в процессе сборки цели, SVNVERSION_OPTIONS - опции svnversion, LATEX_OPTIONS - опции интерпретатора LaTeX.

Номер версии рабочей копии будем определять с помощью утилиты svnversion, которая для Windows доступна в составе пакета CollabNet Subversion Command-Line Client. Утилита выдает номер версии в формате [ver1:]ver2[X], где ver1 - самая ранняя ревизия файла из рабочей копии, ver2 - самая поздняя, X - кратная характеристика рабочей копии (например, есть ли локальные изменения). Если рабочая копия не содержит файлов с разными номерами ревизий, то формат вывода ver[X]. В первом случае нас будет интересовать только часть строки после двоеточия, а во втором - вся строка. SED_COMMAND содержит команду потокового редактора sed, выделяющую необходимую часть строки.


WC_VERSION = $(shell $(SVNVERSION) $(SVNVERSION_OPTIONS) . | $(SED) $(SED_COMMAND))

В переменную WC_VERSION заносится необходимая информация о рабочей копии.

all: rev $(PDF)

rev:
  $(REVISION_BAT) $(WC_VERSION) $(REVISION_TEX)

$(PDF) : $(TEX)
  if not exist $(BUILD_DIR) $(MKDIR) $(BUILD_DIR)
  $(LATEX) $(LATEX_OPTIONS) $(MAIN_TEX)

Это цели и правила их сборки. all - главная цель. Цель rev обновляет файл с ревизией, цель $(PDF) запускает сборку. Вспомогательный файл revision.bat выглядит следующим образом:

@echo off

rem %1 is working copy resivion
rem %2 is name of file with revision

if not exist %2 goto update_file

set /p wc_rev_file= <%2
if not %1==%wc_rev_file% goto update_file

goto :EOF

:update_file
echo %1 > %2

Содержимое файла revision.txt сравнивается с переменной WC_VERSION, если будут обнаружены отличия, файл обновится.

Исходный код здесь.

вторник, 22 июня 2010 г.

GNU make on Windows

  • На 64-х битной Windows при использовании 32-х битных утилит GnuWin переменная окружения PROCESSOR_ARCHITECTURE в Makefile имеет значение x86.
  • Команды cmd.exe, имеющиеся в Makefile'е, выполняются успешно. Например, if not exist $(BUILD_DIR) mkdir $(BUILD_DIR) в командах цели работает так, как и ожидалось: создает папку при ее отсутствии. Такая проверка нужна из-за того, что при попытке создать существующую папку mkdir возвращает ненулевой код возврата, make принимает это за ошибку и прекращает сборку цели.

понедельник, 21 июня 2010 г.

MiKTeX 2.9 и PSCyr 0.4d

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

Скачиваем MiKTeX отсюда, выбрав вариант "Basic MiKTeX 2.8" Installer. Ставим, как описано в блоге сурового челябинского программиста, указав решим установки отсутствующих пакетов "Ask me first", что предлагается установщиком по умолчанию. Будем работать с общесистемными настройками (Пуск --> Программы --> MiKTeX 2.8 --> Maintenance (Admin)). После установки обновляем дистрибутив (Update (Admin) в меню), указав в качестве источника обновлений nearest package repository.

Следующий шаг - установка PSCyr, дистрибутив которого нужно скачать отсюда и отсюда. Оба архива распаковываем в одну папку, в которой получим папку PSCyr. Затем где-то, например, в своей домашней директории (%USERPROFILE%) создаем папку texmf, в которую скидываем содержимое папки PSCyr (файлы типа install.sh можно пропустить и скопировать только директории). После этого через меню Пуск запускаем программу Settings и переходим на вкладку Roots. Там нажимаем кнопку Add и выбираем папку texmf. Нажимаем OK. Теперь MiKTeX будет знать, где лежат пользовательские LaTeX-файлы.

Теперь нужно сделать так, чтобы MiKTex узнал о новых шрифтах. Для этого следует:

  1. Выполнить команду initexmf --edit-config-file dvips и ввести в открывшийся блокнот p +pscyr.map
  2. выполнить команду initexmf --edit-config-file pdftex и ввести в открывшийся блокнот +pscyr.map
  3. выполнить команду initexmf --edit-config-file updmap и ввести в открывшийся блокнот Map pscyr.map
  4. выполнить команду updmap
  5. выполнить команду initexmf --edit-config-file dvipdfm и ввести в открывшийся блокнот f pscyr2.map
  6. выполнить команду initexmf -u
  7. запустить из меню Пуск программу "Settings" и на вкладке General нажать кнопку Refresh FNDB
  8. выполнить команду mkfntmap
После этих действий файл с преамбулой
\documentclass[a4paper,russian]{article}
\usepackage[T2A]{fontenc}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage{pscyr}
должен собираться командой pdflatex file.tex. При первой сборке будет выведен запрос на скачивание отсутствующих пакетов.

Возможные ошибки:

  • LaTeX Error: File `pscyr.sty' not found. Не выполнен пункт 7.
  • pdfTeX error: pdflatex (file faqr6a): Font faqr6a at 420 not found. Не выполнен пункт 8.

Update: используется правка пользовательских конфигов вместо общесистемных, поскольку изменения в последних будут утеряны при обновлении.

Update 2: переносы в русском тексте в MiKTeX 2.9 работают «из коробки».

Update 3: из инструкции удалены все действия, требующие прав администратора.