LXF89:LaTeX

Материал из Linuxformat.

Перейти к: навигация, поиск
LaTeX

Листинги и текст на сайте автора

Компьютерные TeXнологии Учимся использовать культовую систему вёрстки

Содержание

Вёрстка I

ЧАСТЬ 6 Мы учимся использовать культовую систему верстки уже полгода, но до сих пор не сказали об этой самой верстке ни слова. Евгений Балдин спешит исправить сложившуюся ситуацию.


Хороший набор – это плотный набор, «дырявый» же набор
плохо читается, так как дыры нарушают связанность строки и
тем самым затрудняют восприятие мысли.

Ян Чихольд.

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

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


Определённые «размеры» и переменные «длины»

Для определения расстояния LaTeX поддерживает переменные типа «длина». Например, ранее уже упоминалась команда \TeXtwidth – это переменная, хранящее значение длины, равное ширине текста.

Для создания переменной типа «длина» следует воспользоваться командой \newlength. В качестве обязательного параметра ей передаётся имя переменной. При создании переменной присваивается нулевая длина, так что следующим шагом необходимо приравнять её чему-то:

\newlength{\MyLen}
\setlength{\MyLen}{1cm plus 2.5fill minus 5mm}
\addtolength{\MyLen}{5em}
Длина \lstinline!\MyLen! равна \the\MyLen.

Длина в LaTeX – это не просто какой-то определённый размер. Это более сложная структура с указанием границ возможного сжатия и растяжения. Границы растяжения определяются с помощью инструкции plus, а сжатия – minus. При формировании абзацев TeX использует эту информацию для максимально «красивого» заполнения.

Команда \setlength эквивалентна оператору присваивания. В свою очередь команда \addtolength позволяет увеличить переменную на указанную величину, которая может быть отрицательной. Макрос \the позволяет «развернуть» переменную длины для вывода на печать.

LaTeX «говорит» в терминах англо-американской системы мер. Эта система отживает своё, но её наследие будет ещё долго проявляться и портить жизнь современному «метрическому» миру. Для определённости следует знать, что один дюйм (in) равен 2.54 сантиметра, и в нём умещается 72.27 пунктов (1 pt ≈ 0.35 mm). Метрические величины представлены привычными сантиметрами (cm) и миллиметрами (mm). Кроме упомянутых величин, LaTeX умеет оперировать размерами в больших пунктах (bp), пунктах Дидо (dd), пиках (pc) и цицеро (cc) – традиционных единицах измерения, используемых в типографиях. Минимальной ненулевой единицей длины в LaTeX является приведённый пункт (sp), который составляет 1/65536 от одного пункта.

Кроме определённых единиц измерения, длину можно задавать также и в относительных: 1ex соответствует высоте строчной латинской буквы x, а 1em – ширине прописной латинской буквы M. Эти величины меняются вместе со сменой шрифта, что позволяет задавать автоматически масштабирующиеся горизонтальные промежутки, не привязанные к конкретному размеру и типу шрифта. Например, широкий пробел, задаваемый с помощью команды \quad, определяется как \hspace{1em}.

\setlength{\MyLen}{1ex}
Высота x равна \the\MyLen\par
\Large \setlength{\MyLen}{1ex}
Высота x равна \the\MyLen

Интересной инструкцией является длина fill – это бесконечность. TeX поддерживает операции с бесконечностями, причём оперирует тремя их видами: fil, fill и filll, где fil<<fill<<filll. С помощью этих сущностей производится центрирование боксов и более сложные выравнивания.

Если хочется узнать ширину текста, то можно воспользоваться командой \settowidth:

\settowidth{\MyLen}{очень длинная фраза}
\addtolength{\MyLen}{1em}
\centering
\framebox[1.2\MyLen]{очень длинная фраза}\par
\framebox[1.2\MyLen]{короткая фраза}

Аналогично, команда \settoheight позволяет выяснить высоту текста над базовой линией, а \settodepth – глубину под базовой линией. При использовании длины можно добавить перед ней множитель.

А теперь немного «магии» из английского FAQ по LaTeX:

\makeatletter
\newcommand{\maxwidth}{%
    \ifdim\Gin@nat@width>\linewidth
        \linewidth
    \else
        \Gin@nat@width
    \fi
}
\makeatother

Эта конструкция определяет переменную длины \maxwidth таким образом, что при вставке картинки:

\includegraphics[width=\maxwidth]{«картинка»}

ширина картинки становится равной минимальному из двух возможных значений: «естественной» ширины картинки (размер в BoundingBox) или ширины строки. Это позволяет вывести картинку в натуральную величину при условии, что она не выходит за рамки дозволенного и загнать её в эти рамки, коли она за них вылезает.

calc

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

\setlength{\MyLen}{
    (1em+\widthof{очень длинная фраза})*\real{1.2}}
\centering
\framebox[\MyLen]{очень длинная фраза}\par
\framebox[\MyLen]{короткая фраза}

При загрузке calc \setlength и \addtolength переопределяются так, что в качестве аргумента после этого можно передавать арифметические выражения. Кроме арифметики, в calc определяются макросы \widthof{текст}, \heightof{текст} и \depthof{текст} – ширина, высота и глубина текста.

Определение ширины (width), высоты (height) и глубины (depth).
Определение ширины (width), высоты (height) и глубины (depth).

При умножении длины на число длина должна стоять до числа (4mm*2 – верно, а 2*4mm– нет). Делить и умножать можно только на целые числа. Действительные числа вводятся с помощью уже использованного в примере макроса \real и отношения длин, вычисляемого с помощью команды:

\ratio{«длина»}{«длина»}

Подробное описание пакета можно найти в документации calc.pdf из коллекции tools.


Скелет страницы

На рисунке ниже приведён результат выполнения команды \layout из одноимённого пакета. Основное место на странице занимает текст – верстальщики зовут его «основной текст» или «тело текста» (bodytext). Справа и слева от текста расположены поля. Поля обычно остаются пустыми, но иногда они используются для заметок («маргиналий» или «фонариков»). В верхней и нижней части страницы расположены, соответственно, верхний и нижний колонтитулы. Колонтитул представляет из себя справочную строку, помогающую ориентироваться в структуре текста.

1 один дюйм + \hoffset
2 один дюйм + \voffset
3 \oddsidemargin = 2pt
4 \topmargin = -41pt
5 \headheight = 18pt
6 \headsep = 21pt
7 \textheight = 635pt
8 \textwidth = 448pt
9 \marginparsep = 12pt
10 \marginparwidth = 49pt
   \marginparpush = 6pt (not shown)
   \voffset = 0pt
   \paperheight = 845pt
11 \footskip = 50pt
   \hoffset = 0pt
   \paperwidth = 597pt
Макет полосы набора класса scrartcl (опция a4paper). Результат выполнения команды \layout.
Макет полосы набора класса scrartcl (опция a4paper). Результат выполнения команды \layout.

Совокупность размеров и расположений указанных полей, а также вид и содержание колонтитулов называется макетом полосы набора. На рисунке пунктирной линией изображены поля драйвера (1 и 2) относительно которых выстраиваются все остальные поля. По договорённости отступы до полей драйвера равны одному дюйму. Переопределив \hoffset и \voffset (по умолчанию они равны нулю), можно легко сдвинуть полосу набора целиком по горизонтали и вертикали, соответственно.

Ниже перечислены параметры, которые управляют макетом полосы набора:

  • Тело текста характеризуется высотой \TeXthight (7) и шириной \TeXtwidth (8) При многоколоночной вёрстке ширина колонки равна \columnwidth. Переменная \linewidth принимает значение, равное длине строки текущего текста.
  • \oddsidemargin (3) добавляется слева в случае односторонней печати. При двусторонней печати полосы набора для чётных и нечётных страниц различаются. В этом случае для нечётных слева опять же добавляется \oddsidemargin, а для чётных \evensidemargin.
  • Верхний колонтитул располагается на расстоянии \topmargin (4) от поля драйвера, имеет высоту \headheight (5), а тело текста отступает от колонтитула на расстояние \headsep (6).
  • \footskip позиционирует базовую линию нижнего колонтитула относительно последней строки текста.
  • Поля для заметок имеют ширину \marginparwidth (10) и отступают от тела текста на расстояние \marginparsep (9). Ещё одна опция управляет минимальным расстоянием между заметками: \marginparpush.
Выбор размера бумаги

Физический размер бумаги описывается параметрами \paperwidth и \paperheight. Стандартные базовые классы LaTeX (article, book, report и letter) по умолчанию предполагают, что для печати используется бумага формата letter. Очевидно, это умолчание не годится для России, где стандартом является формат A4 (210x297 мм). Обычно установить правильный формат можно с помощью передачи параметра a4paper при выборе класса документа:

\documentclass[a4paper,12pt,oneside]{scrbook}

Для создания небольших брошюрок со страницей размера A5 (половина размера A4) используется опция a5paper.

Ориентация

Для портретной и альбомной ориентации вообще-то требуются разные макеты полосы набора. Альбомная ориентация может использоваться по умолчанию в некоторых специализированных классах (например, slides).

lscape в действии.
lscape в действии.

Если повернуть требуется только текст без изменения полей колонтитулов, то проще всего воспользоваться окружением landscape из пакета lscape. Всё, что находится внутри этого окружения поворачивается на 90 градусов против часовой стрелки. При использовании pdflatex для изменения ориентации не только текста, но и страницы (дабы не наклонять при чтении текста голову набок) при загрузке пакета следует передать ему опцию pdftex или воспользоваться пакетомнадстройкой pdflscape.

Лучше не менять параметры макета во время набора, но если очень хочется это сделать, то можно воспользоваться стандартным пакетом portland. Он позволяет менять портретную ориентацию на альбомную и обратно на лету, переопределяя соответствующие управляющие макетом переменные. Команды \portrait и \landscape работают как переключатели между этими режимами. В пакете определены и одноимённые с переключателями окружения. Это довольно низкоуровневый пакет, и пользоваться им надо аккуратно.

rotpages в действии.
rotpages в действии.

Если по какой-то причине требуется развернуть текст на 180 градусов, можно воспользоваться пакетом rotpages. В пакете определены два переключателя режима \rotboxpages и \endrotboxpages, которые указывают границы повёрнутого теста. Пакет умеет разворачивать не только страницы, но и колонки. Подробности можно найти в документации: rotpages-doc.pdf.

Меняем макет

Причина, по которой неискушённый ТеХник начинает менять макет полосы набора, обычно заключается в том, что он использует стандартные классы LaTeX – один из четвёрки article, book, report или letter. Это очень древние классы, и на них много чего «завязано», поэтому они прибывают в абсолютно замороженном состоянии. Поэтому лучше для начала найти себе класс по душе. Например, scrartcl, scrbook, scrreprt и scrlettr – классы из коллекции KOMA-Script, которые дублируют функциональность стандартной четвёрки, но ориентируются на европейских пользователей и размер листа A4. А.И. Роженко в рамках коллекции ncclatex (NCC) предоставляет класс ncc, ориентированный на русских TeXников.

Двигаем размеры

Выбор, естественно, не ограничивается упомянутыми выше классами – он огромен. Поэтому, прежде чем что-то изменять, следует внимательно изучить уже имеющиеся решения. И даже если вы знаете, что делаете, лучше не переопределять переменные, управляющие размерами макета полосы набора, вручную. Правильным решением будет воспользоваться одним из уже имеющих специализированных пакетов, например: geometry или vmargin.

geometry

Пакет geometry меняет размеры прямо в процессе загрузки стилевого файла, например, так:

\usepackage[height=25cm,a4paper,hmargin={3cm,2cm}]{geometry}

Разбор параметров выполняется с помощью пакета keyval, который уже упоминался в статье «Графика» (см. LXF86). В качестве параметров можно передавать выражения, если загружен пакет calc.

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

vmargin

Пакет vmargin управляет размерами макета через выставку полей. Перед этим следует задать формат листа:

\setpapersize[«ориентация»]{«формат листа»}

В качестве обязательного параметра команды можно указать один из следующих форматов: A0, A1, …, A9, B0, B1, …, B9, C0,…, C9, USletter, USlegal и USexecutive. Необязательный параметр может принимать значения landscape (альбомная ориентация) или portrait (портретная ориентация, по умолчанию). Для нестандартных форматов листа можно задать размеры с помощью ключевого слова custom команды:

\setpapersize{custom}{«ширина»}{«высота»}

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

%Полоса набора с колонтитулами
\setmargins{«ширина поля слева»}{«высота поля сверху»}%
    {«ширина текста»}{«высота текста»}%
    {«высота»}{«отступ»}%верхний колонтитул
    {«высота»}{«отступ»}%нижний колонтитул
%Полоса набора без колонтитулов
\setmargnohf{«ширина поля слева»}{«высота поля сверху»}%
    {«ширина текста»}{«высота текста»}%
%Установка рамеров без изменения колонтитулов
\setmarg{«ширина поля слева»}{«высота поля сверху»}%
    {«ширина текста»}{«высота текста»}%

Кроме перечисленных команд, определены их аналоги: \setmarginsrb, \setmargnohfrb, \setmargrb. Отличие состоит в том, что вместо ширины и высоты тела текста в качестве параметров им передаются ширина правого поля и высота нижнего поля. Подробно пакет описан в документации vmargin.pdf.


Стили страницы

Полоса набора – это не только размеры: это ещё и наполнение колонтитулов. Обычно оно определяется в классе документа. Здесь без необходимости лучше тоже ничего не менять.

Простейший способ изменить стиль страницы – это воспользоваться командой:

\pagestyle{«стиль страницы»}

Если стиль надо переопределить только для текущей страницы, то следует воспользоваться командой \thispagestyle{стиль страницы}.

Есть три стандартно определённых стиля:

  • empty Страница выводится без каких-либо колонтитулов – только текст.
  • plain Выводится только номер страницы в нижнем колонтитуле.
  • headings В верхнем колонтитуле выводится номер страницы и информация, определяемая классом документа.

Если и это наполнение не устраивает, то можно определить свой собственный стиль. Пакет fancyhdr специализируется как раз на этом.

fancyhdr
Заполняем колонтитулы с помощью fancyhdr.
Заполняем колонтитулы с помощью fancyhdr.

Чтобы воспользоваться возможностями пакета, необходимо загрузить стилевой файл и выбрать стиль с помощью \pagestyle

Пакет fancyhdr позволяет управлять содержимым колонтитула. Возможности: верхний и нижний колонтитул разбивается на три независимых части, многострочные колонтитулы, колонтитулы, вылезающие по ширине за \textwidth, декоративные линейки, разные колонтитулы для чётных и нечётных страниц, отдельные колонтитулы для специальных полос (начала глав, страницы, отведённые под плавающие объекты). Вот простейший пример для определения колонтитулов с помощью fancyhdr:

\usepackage{fancyhdr}
…
\begin{document}
\pagestyle{empty} %очищаем стиль страницы
\pagestyle{fancy} %включаем пользовательский стиль
\lhead{А.В.Тор} %верхний колонтитул слева
\chead{---~\arabic{page}~---} % там же по центру
\rhead{Статья} %верхний колонтитул справа
% аналогично для оформления нижнего колонтитула
\cfoot{---~\roman{page}~---}
\lfoot{\hspace{0.7cm}Это просто демонстрация}
\rfoot{возможностей \textbf{fancyheadings}}

Переменная page содержит номер страницы. Подробности о том что можно сотворить с колонтитулами, следует искать в документации к пакету fancyhdr.pdf.


Причёсываем текст

Дефект набора (коридор).
Дефект набора (коридор).

Теперь, когда границы определены, разберемся, что можно сделать для красивого размещения текста на странице. Часть забот по следованию правилам вёрстки LaTeX берёт на себя. Вам, например, не требуется следить за единообразием оформления полос. Но есть дефекты, которые компьютеру заметить не под силу, например, так называемые коридоры.

Строка
Переполненная строка. Включена опция draft.
Переполненная строка. Включена опция draft.

Когда строка с точки зрения TeX становится слишком разряженной (Underfull) или слишком сжатой (Overfull), в log-файле появляются предупреждения, начинающиеся словами вида:

Overfull \hbox (26.1765pt too wide) in paragraph at lines 347--356
[][]\T2A/cmr/m/n/12 Список вос-при-ни-ма-е-мых па-ке-том оп-ций
очень об-ши-рен. В до-ку-мен-та-ции geometry.pdf
Если при выборе класса документа передать ему опцию draft:
\documentclass[draft,a4paper,12pt,oneside]{scrbook}
то такие проблемные места будут отмечаться прямо в тексте.

Обычно подобные переполнения связаны с тем, что LaTeX не знает, как перенести какое-либо слово. В этом случае следует сообщить ему, что и где можно переносить, как это было показано во второй части цикла «Базовые элементы» (см. LXF84). В крайнем случае можно насильно разорвать строку с помощью команды \linebreak или \\. В отличии от \linebreak, команда \\ не выравнивает остаток строки по правому полю.

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

Горизонтальные пробелы

Расстояние между словами можно изменить с помощью горизонтальных промежутков. Они создаются с помощью команды \hspace. В качестве параметра команде передаётся длина. Вариант команды \hspace* отличается от основной тем, что создание пробела не игнорируется даже тогда, когда пробел приходится на начало или конец строки.

Существует несколько определённых по умолчанию горизонтальных пробелов:

  • \quad – горизонтальный промежуток шириной 1em. Также есть \qquad – удвоенный \quad, и \endspace – половина от \quad.
  • \hfill – бесконечный горизонтальный промежуток. Два \hfill подряд в два раза больше, чем один. Также есть «уменьшенная» бесконечность – \hfil.
  • \hrulefill – то же, что и \hfill, но заполненный промежуток подчеркивается. Аналогично, есть команда, заполняющая всё точками – \dotfill.
Страница

Проблемы могут возникнуть и при формировании страниц. В крайнем случае, можно воспользоваться командами принудительного завершения страницы \pagebreak или \newpage. Отличие первой команды от второй в том, что после формирования страницы полоса выравнивается по нижней кромке – это может привести к неоправданному растяжению страницы. Если проблему можно решить путём увеличения/уменьшения страницы на одну-две строки, то лучше воспользоваться следующими макросами:

\newcommand{\longpage}{\enlargethispage{\baselineskip}}
\newcommand{\shortpage}{\enlargethispage{-\baselineskip}}

Команда \longpage увеличивает тело текста текущей страницы на одну строку, а \shortpage, соответственно, уменьшает. Длина \baselineskip служит для определения интерлиньяжа – междустрочного пробела.

Висячая строка

Одним из самых неприятных дефектов набора является «висячая строка». Висячая строка – это концевая строка абзаца, стоящая первой на странице, или начальная срока абзаца, стоящая на странице последней. Этих артефактов следует всячески избегать. Для подавления этого эффекта в заголовке документа следует определить две переменные:

%подавление висячих строк.
\clubpenalty=10000
\widowpenalty=10000
Вертикальные просветы

По аналогии с командой \hspace{длина}, вертикальные промежутки организуются с помощью команды \vspace{длина}. Модификация команды \vspace*{длина} создаёт вертикальный просвет, которые не игнорируется, даже если просвет попадает на начало или конец страницы.

Вертикальные просветы также имеют свои умолчания:

  • \bigskip – вертикальный промежуток, равный примерно \baselineskip. Также имеются \medskip – половина от \bigskip, и \smallskip – четверть от \bigskip.
  • \vfill – бесконечный вертикальный промежуток. Два \vfill подряд в два раза больше, чем один. Также есть «уменьшенная» бесконечность – \vfil.


Печать через две строки

До сих пор временами встречаются требования вида: «Предоставить диплом, набранный в два интервала» – пережиток эпохи печатных машинок [при наборе «в два интервала» интерлиньяж равен удвоенному значению кегля, «в один интервал» – самому значению кегля, – прим. ред.]. Для решение этой проблемы лучше всего воспользоваться пакетом spacing. В пакете определена команда \doublespacing, которая выполняет искомое действие. Так же в spacing определены макросы \onehalfspacing и \singlespacing – печать в полтора и один интервал, соответственно. Для вертикальной разрядки небольшого фрагмента текста лучше воспользоваться одноимёнными окружениями или окружением spacing:

\begin{spacing}{2.5}
    <<Этот текст, напечатан с
    интервалом в две с
    половиной строки>>.
\end{spacing}

В качестве основного параметра окружению spacing передаётся интервал, с которым следует печатать текст.


Послесловие

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

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию