Как я ушёл с InDesign’а в LaTeX

в 10:00, , рубрики: indesign, latex, научная-вёрстка

InDesign, безусловно, является флагманом в индустрии вёрстки. Но, проработав в нём немалое количество времени, я вернулся к старому доброму TeX'у, с которым познакомился ещё во время своей учёбы в университете. Почему так вышло? Почему от понятного WYSIWYG-редактора я ушёл к языку разметки, и от продукта, поддерживаемого мощнейшей компанией Adobe — к программе, код которой давно заморожен, и лишь появляются новые пакеты, написанные волонтёрами?

История началась с того, что InDesign меня обидел тем, что начал нагло врать в глаза. Я пытался сделать именной указатель и видел в нём не те страницы, на которых реально стояли «якоря», а чуть отличающиеся. Никакие танцы с бубнами не помогали. Делать указатели вручную — не мой жанр. Писать свои скрипты, которые будут отыскивать на страницах какие-то дополнительные скрытые знаки — тоже не очень надёжный вариант. Тем более что список задачек при подготовке издания, был примерно таков:

  1. сделать тематический указатель,
  2. сделать именной указатель,
  3. расставить кучу ударений с учётом того, что в выбранном шрифте, увы, юникодовский знак ударения не работает,
  4. добиться того, чтобы эти ударения нужным образом кочевали в колонтитулы, оглавления и указатели,
  5. изредка пользоваться конструкциями типа «см. сноску 15 на странице 45»,
  6. сделать пробелы вокруг тире поуже, симметричными, а предшествующий тире — ещё и неразрывным,
  7. сделать указатель ссылок на Библию (отсортированный по порядку библейских книг, далее — по главам, далее — по стихам глав).

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

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

Меня эти многочисленные операции в ручном режиме пугали тем, что в тот момент, когда надо будет макет сдавать, наверняка понадобится срочно внести какую-то правку, соответственно, что-то поедет, что-то надо будет заново компилировать, и из тысячи вещей, которые надо не забыть, сотня будет забыта. Кроме того, это «не забыть» означает, что макет, поставленный на полочку, должен быть заморожен — трюки останутся незадокументированными, а потому при повторном издании неповторимыми (ну или, по крайней мере, мучительными).

Возвращение к LaTeX (точнее, к XeLaTeX) было непростым. Пришлось разбираться, как добиться выбранного макета. Пришлось придумывать, как добиться приведённой вёрстки (чтобы строки на просвет совпадали). Пришлось теребить автора одного из пакетов, чтобы добиться возможности использовать Pantone (в некоторых изданиях часть страниц печаталась в CMYK, часть — в 2 краски: чёрную и бордовую). Пришлось освоить азы ещё нескольких языков общения с компьютером: bash, perl, xindy, AppleScript, …

Зато теперь есть некоторый инструментарий, которым можно и поделиться.

Итак, процесс подготовки книги происходит примерно следующим образом.

Начальный документ с текстом и всякими сносками открывается в OpenOffice и через writer2latex выгоняется в LaTeX, где старательно чистится (там полно всякого мусора обычно). При желании документ делится на части, но нам как-то удобнее было работать с одним общим файлом текста произведения.

В рамках представления о том, что надо разделять содержание и оформление, создаётся отдельный файл header.tex, в который потихоньку бузуется куча всяких подгрузок пакетов и определений своих команд.

Все изменения и объединение версий происходит в Git, в нашем случае в приватном репозитории на bitbucket.org. Когда кто-то из редакторов или корректоров боится этих штук, он редактирует как умеет и присылает файлы и по почте, но всё же из почты их кто-то отправляет в репозиторий.

За общий вид макета отвечают в первую очередь пакеты geometry и fancyhdr, за вид и расположение заголовков — titlesec (с его помощью я добивался и приводки вёрстки). Типографских изысков можно достигать, используя пакеты microtype и fnpct, которые помогают сделать оптическое выравнивание по краю и лёгкое «загоняние» знаков препинания под предшествующий знак сноски. Сами сноски можно варьировать намного больше, чем в InDesign (хоть на поле выноси, хоть все сноски в один абзац объединяй) — на это есть footmisc. Буквицы (и образ их обтекания текстом) вставляются при помощи пакета lettrine.

Пока не ушёл далеко, описания пакетов и примеры их использования есть на www.ctan.org А совершенно замечательная площадка взаимопомощи — tex.stackexchange.com

Вопрос с расстановкой ударений пришлось решать вот так:

usepackage{accentbx}
def'#1{upaccent{aboxshift[.9ex]{^^^^00b4}}{#1}}
makeatletter
let@acci'
makeatother

А с тире — вот так (эта штука работает и в тире, обозначающих прямую речь:

usepackage{newunicodechar}
deftire{—}
newcommandvokrugtire{hskip .1em plus .1em minus .05em}
newunicodechar{—}{ifvmodetirekern .1emignorespaceselseunskipnolinebreakvokrugtirenolinebreaktirevokrugtireignorespacesfi}

Переносы LaTeX расставляет в целом намного лучше, чем стандартный InDesign (хотя модуль Игоря Владимировича Батова весьма качественно исправляет этот недостаток InD). Но тут есть такая особенность. В LaTeX нет кнопочки «запретить переносы через страницу». Это связано с тем, что LaTeX сначала формирует абзацы, а потом пытается строки распределить по страницам. Впрочем, в InD я этой кнопочкой не пользовался — как мне представляется, запрещать надо только переносы с нечётной страницы на чётную (то есть на оборот страницы). При включении этой кнопочки InDesign запрещает и переносы между колонками (в многоколоночной вёрстке), что мне кажется совсем перебором.

Игры с переносами заключаются в варьировании значений параметров

righthyphenmin
lefthyphenmin
hyphenpenalty
doublehyphendemerits
finalhyphendemerits

Подробнее про эти параметры можете посмотреть вот тут. InDesign, конечно, не даёт такой степени контроля над процессом формирования абзаца. И мне приходилось сталкиваться с ситуацией, когда в InD абзац начинал выглядеть мерзко из-за того, что стоял запрет на 4 переноса подряд — но эти 4 переноса не испохабили бы так абзац, как возникшие дыры между словами. Так что подход LaTeX'а с подсчётом общего значения penalty мне кажется очень разумным. Переносы с нечётной страницы можно поймать при помощи texttopdf и скрипта на perl.

Работа с указателями становится весьма комфортной, если в преамбуле написать что-то вроде такого:

usepackage{makeidx}
usepackage{multind}
makeindex{subj}
makeindex{name}
newcommand{subj}[1]{index{subj}{#1}}
newcommand{name}[1]{index{name}{#1}}

Тогда в тексте можно будет вставлять каждый раз на отдельной строке отбитую несколькими tab'ами (чтобы не сливалось с основным потоком текста subj{...}, потом прогонять
sed -n "/\name/p;/\geo/p" main-file.tex | sed "s/|[)(]//g" | LANG=ru LC_COLATE=C sort | uniq > name-and-geo-index.tex
и без всякой компиляции файла видеть черновик указателя, из которого потом просто брать и копировать в основной файл те гнёзда указателя, которые снова понадобились. Для полноценной компиляции вам придется разобраться с настройками xindy и, возможно, что-то доточить самостоятельно. Зато мне удалось сделать в книге единый географический указатель, в котором есть и номера страниц, и квадраты приложенных карт. А также я научил гнёзда младших уровней не оставлять «вдовыми» гнёзда-родители (в InDesign этого нельзя добиться в стилях при помощи «Keep with next/previous»: либо все дети липнут в единый блок, либо сирый родитель липнет к следующему родителю).

А правильным образом доточив напильником пакет bibleref, можно добиться того, что при добавлении в основной файл строчки bible{Мф. 1:1} в конце книги будет главка «Указатель ссылок на Священное Писание», где в разделе «Новый Завет» будет подраздел «Евангелие от Матфея», и там строчка 1:1........(номер страницы).

Если на этом абзаце вы готовы вспылить и воскликнуть «Ох уж эти церковники! Даже на Хабр пробрались!», то погодите немножко, сейчас перейдём к самому интересному — к тому, как работать с картинками (заметив в скобках, что TeX совершенно прекрасен для вёрстки церковнославянских текстов).

InDesign типично вбивает картинку в макет как гвоздь в стену — она должна стоять тут, а текст пусть течёт как хочет. TeX воспринимает картинки как плавающие объекты, про которые пользователь говорит: «Картинку хорошо бы где-то тут, вверху страницы (или внизу, или без разницы)». И картинка не уплывает далеко от текста, к которому привязана (даже если вам за полчаса до сдачи макета скажут урезать ширину страницы на два сантиметра). Можно добиться и того, чтобы картинка оказывалась на ближайшей правой полосе:

newcommand{kartinkavramke}[1]{fboxrule=2ptfboxsep=0pt
{centeringboxkinovar{includegraphics[height=textheight]{#1}}par}}

newcommand{kartinkavskoresprava}[1]{
  ifoddvalue{page}afterpage{kartinkavskoresprava{#1}}%
  elseafterpage{thispagestyle{empty}noindent%
    kartinkavramke{#1}}fi}

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

Ну и для ТеХ'а не составляет никаких проблем включить в книгу список иллюстраций (причём элементы этого списка можно сделать отличными от подписи под самой иллюстрацией). В InDesign для этого потребовалось бы, наверное, ставить боксы с белым текстом, обязательно попадающие на страницу (валяющееся на обочине InDesign в индексы не включает).

LaTeX принимает довольно ограниченный список графических форматов: PDF, JPG, PNG. Никаких вам TIFF, никаких PSD. Это не даёт расслабиться, но и жить не мешает. Для быстроты компиляции можно сделать две директории для картинок: large и small.

cd large
for i in *.*; do echo $i; convert -resize 25% -quality 60 $i ../small/$i; done

А в самом тексте временно пользоваться

newcommand{pathtoimg}[1]{small/#1}
includegraphics[height=textheight]{pathtoimg{myself.jpg}}

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

setlength{parfillskip}{0pt plus .75textwidth}

который в переводе на русский означает: «Хочу, чтобы последние строки в абзаце были заполнены не менее, чем на 25%». Остальную работу придётся делать при помощи привычных приёмов: изменения трекинга и межсловных пробелов.

newcommand{tracking}[2]{{addfontfeature{LetterSpace=#1}#2}}
newcommand{interword}[2]{{setlength{spaceskip}{#1fontdimen2font plus #1fontdimen3font minus #1fontdimen4font}#2}}

Что не может здесь не радовать, так это то, что верстальщику всё видно: где какие применены инструменты (у InDesign есть режим подсветки трекинга, но значение-то в каждой точке может быть разным, пока не ткнёшь, не узнаешь).

Что не может не огорчать — то, что после каждого изменения параметра приходится заново компилировать документ, чтобы посмотреть, получилось или не получилось. Если документ огромный, на это может уходить пара минут. Но и тут есть трюки: можно пользоваться includeonly{...} или написать свои команды, заставляющие LaTeX компилировать только нужный фрагмент, а остальное пропускать.

И теперь подходим к самому сложному этапу — сдаче макета в типографию. Для начала у нас потребуют отступ (bleed) в 5 мм. Пожалуйста:

usepackage[
layoutsize={140mm,200mm},
papersize={150mm,210mm},
layouthoffset=5mm,
layoutvoffset=5mm,
...]{geometry}

Потом потребуют выгонки в PostScript и прогонки через Adobe Disttiller. Я пытался сделать это двумя вариантами

cupsfilter -P "PrintDriver.ppd" -m "application/postscript" my-book.pdf > my-book.ps и pdftops my-book.pdf my-book-another-way.ps. Но получалась какая-то ерунда. Чёрный текст после прогонки через cupsfilter (или pdftops), а затем через Distiller превращался в композитный CMYK. Пришлось пользоваться Adobe Acrobat Pro: открыть и сохранить как PostScript. Так чёрный сохранил свою беспримесность.

Чтобы не делать это руками, написал немного AppleScript:

Скрытый текст

*acro-pdf-to-ps.scpt*

on replace_chars(this_text, search_string, replacement_string)
 set AppleScript's text item delimiters to the search_string
 set the item_list to every text item of this_text
 set AppleScript's text item delimiters to the replacement_string
 set this_text to the item_list as string
 set AppleScript's text item delimiters to ""
 return this_text
end replace_chars

on run argv
set current_path to "/Volumes/data/process_me"
set in_file to current_path & "/" & item 1 of argv
set out_file to replace_chars(in_file, ".pdf", ".ps")
set in_file_correct to POSIX file in_file
set out_file_correct to POSIX file out_file
	with timeout of (8 * 60) seconds
        tell application "Acrobat"
        	activate
        	open in_file_correct
            save document 1 to out_file using PostScript Conversion
            close document 1
        end tell
    end timeout
end run

*acrodist.scpt*

on run argv
set current_path to "/Volumes/data/process_me"
set opt_file to current_path & "/Typo.joboptions"
set in_file to current_path & "/" & item 1 of argv
set out_file to replace_chars(in_file, ".ps", "-distilled.pdf")
	with timeout of (8 * 60) seconds
        tell application "Acrobat Distiller"
            Distill sourcePath in_file destinationPath out_file adobePDFSettingsPath opt_file
        end tell
    end timeout
end run

osascript acro-pdf-to-ps.scpt my-book.pdf
osascript acrodist.scpt my-book.ps

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

Так что переход из InDesign в LaTeX состоялся. Скорее всего, безвозвратный (если не придётся верстать журналы с кучей картинок). Со своими радостями. Со своими горестями. С кучкой открытий. Которыми готов делиться — пишите, спрашивайте.

Как говорится, happy TeXing!

Автор: pantlmn

Источник

Поделиться новостью

* - обязательные к заполнению поля