Как впихнуть много текста в ограниченный объём страниц: LaTeX Text Squeezing Woodoo

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




Создание "каркаса" текста, или вставка "Рыбы"
Перед втискиванием текста сначала скажу о "рыбе" - это пустозвонный текст, который нужен для заполнения структурного каркаса (разделов и подразделов). На всякий случай, есть такой пакет под названием:

\usepackage{lipsum}

который генерирует  известный текст``lorem ipsum'':
 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat...
Это, как уверяет нас википедия, искажённый отрывок из философского трактата Цицерона «О пределах добра и зла», написанного в 45 году до нашей эры на латинском языке. Для генерации этого текста следует дать команду:
\lipsum[3-56]
для генерации множества параграфов Lorem Ipsum.


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

Размеры полей
Для изменения размера полей нам нужен пакет geometry который нужно указать в преамбуле:
\usepackage{geometry}
\geometry{left=1cm}
\geometry{right=1cm}
\geometry{top=1cm}
\geometry{bottom=1cm} 
В данном примере мы указали поля по 1 см.

Изменение расстояния между строк в ЛаТеХ
Для изменения междустрочного интервала (отступ между строк) в LaTeX можно использовать пакет setspace который указываем в преамбуле:
\usepackage{setspace}
и далее в тексте по месту используем: 
\onehalfspacing
\doublespacing
Но это для увеличения интервалов :-)  Сейчас поправим:
\begin{spacing}{1.25}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing
vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a,
magna. Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Mauris ut leo.
\end{spacing}
Вместо значения {1.25} подставить своё по вкусу, в зависимости от целей: значение больше единицы увеличивает расстояние между строками, меньше единицы - уменьшает. На примере:


показано изменение параметра \begin{spacing}{ХХX} (сверху вниз) до значения{0.75}, {0.8}, {1}, {1.25} и {1.5} соответственно.


Изменение размера шрифтов
Первый и самый очевидный трюк - естественно, поменять размер шрифта, если это возможно. Для того, чтобы буквы сделать больше или меньше, мы пользуемся командами вида \small или \large. Иногда хорошо бы знать их размер в pt:

CommandNominal Point SizeExact Point Size
\tiny55
\scriptsize77
\footnotesize88
\small99
\normalsize1010
\large1212
\Large1414.40
\LARGE1817.28
\huge2020.74
\Huge2424.88

Так что теперь мы себе представляем, насколько текст может оказаться \huge и сколь \tiny он будет на печати.



Утончённые методы
Рассмотренные выше методы очень грубые и с головой выдают халтуру. Часто ими пользоваться нельзя в принципе - например, если вы готовите текст для конференции, где, как правило, есть свой шаблон, за изменение которого вы гарантированно получите по ушам и будете оформлять текст заново. Мы же займёмся более изящными методами, которые позволят вместить больше текста в тот же объём страниц при соблюдении (или во всяком случае без серьёзных нарушений) имеющегося шаблона.


Уменьшение отступов для окружений enumerate и itemize
От списков, кстати, лучше вообще отказаться, так как они занимают слишком много места. Сделайте их внутри текста, если это возможно. Если не получается, то можно сузить списки, добавив следующий код в преамбулу документа:

\newenvironment{itemize*}%
  {\begin{itemize}%
    \setlength{\itemsep}{1pt}%
    \setlength{\parskip}{1pt}}%
  {\end{itemize}}


\newenvironment{enumerate*}%
  {\begin{enumerate}%
    \setlength{\itemsep}{1pt}%
    \setlength{\parskip}{1pt}}%
  {\end{enumerate}}

Это создаст новые окружения itemize* и enumerate* соответственно, списки в которых будут расположены куда плотнее обычного.

И теперь в тексте используем окружения
 \begin{enumerate*} .... \end{enumerate*}

И вот как это выглядит:



Сноски
Да, сноски - наши большие друзья, так как они оформляются шрифтом меньшего размера. Для этого в преамбулу  добавляем:
\newcommand{\footnoteremember}[2]{\footnote{#2} \newcounter{#1} \setcounter{#1}{\value{footnote}}} 
\newcommand{\footnoterecall}[1]{\footnotemark[\value{#1}]}
что даст нам новые команды \footnoteremember для постановки ссылки на сноску и  \footnoterecall для ссылки на сноску, соответственно:
\footnoteremember{footnoteT420}{The IBM/Lenovo T420 notebook was used for the numerical simulations.}
(see footnote \footnoterecall{footnoteT420}) 

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


Расстояние между словами в тексте
Можно попробовать сократить расстояние между словами в ЛаТеХ до разумных пределов с помощью команды  \fontdimen2. Вот пример кода, который это делает:

\documentclass{article}
\usepackage{lipsum}
\begin{document}
  \newdimen\origiwspc%
  \newdimen\origiwstr%
  \origiwspc=\fontdimen2\font% original inter word space
  \origiwstr=\fontdimen2\font% original inter word stretch
  \lipsum[1]% normal text
  \fontdimen2\font=0.2ex% inter word space
  \lipsum[1]% decreased inter word space
  \fontdimen2\font=\origiwspc% (original) inter word space
  \fontdimen3\font=0.1em% inter word stretch
  \lipsum[1]% decreased inter word stretch
  \fontdimen3\font=\origiwstr% (original) inter word stretch
  \fontdimen2\font=1em% inter word space
  \lipsum[1]% increased inter word space and stretch
  \fontdimen2\font=\origiwspc% (original) inter word space
  \fontdimen3\font=\origiwstr% (original) inter word stretch
  \lipsum[1]% original/normal text
\end{document}

и как это выглядит (картинка кликабельна, но весит почти 1Мб):

From Изображения Blogger



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

\begin{wrapfigure}[16]{r}{0.5\linewidth}
\vspace{-5ex}
\centering \includegraphics[width=1\linewidth]{constr_cases_illustrations}
\caption{\textit{Constraints subcases.}
\label{fig:constr_cases_illustrations}
\end{wrapfigure}

Подсвеченные параметры означают:
  • [16] - определяет высоту рисунка в число строк текста и позволяет добавить строк для правильного обтекания.
  • {r} - положение картинки на странице, можно слева {l} или справа {r}.
  • {0.5\linewidth} - ширина картинки в долях от ширины страницы.
Тонкий момент: на самом деле, параметр положения рисунка на странице можно писать с маленькой буквы (слева {l} или справа {r}), но это заставляет ЛаТеХ поместить изображение именно там, где вы прикажете. Если же ставить большие буквы (слева {L} или справа {R}), даст ЛаТеХу больше свободы.

Также вы можете получить слишком много (или мало) пробелов в верхней или нижней части обтекаемого рисунка. Вот тут нам поможет дополнительный аргумент [lineheight], который в данном примере задан как [16]. Он определяет высоту рисунка в строках текста.

Другой возможностью является добавление или удаление промежутков с помощью команды \vspace. В данном примере \vspace{-5ex} мы заставляем ЛаТеХ  сместить картинку немного вверх, чтобы выиграть место для текста.

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

14 комментариев: |высказаться!| RSS-лента дискуссии.|
Minoru комментирует...

Для того, чтобы шрифт сделать больше или меньше

Лучше «чтобы буквы сделать» — избегаем тавтологии.

Иногда хорошо бы знать, каков размер в pt этих шрифтов:

«Иногда хорошо бы знать их размер в pt». Причина та же.

От списков, кстати, лучше вообще отказаться сразу же - занимают слишком много места.

Отличный совет! Этак ты скоро начнёшь рекомендовать вместо мороки с LaTeX писать формулы от руки и потом вставлять в документ (.docx, не иначе) картинки.

Но да, с тем, что списки жрут неоправданно много места — согласен. Всегда приходится ужимать их немного.

используоем

Спеллчекер тебе таки не помешал бы :)

virens комментирует...

Ох шит! А этот пост вообще-то черновик. Как это я прозевал его публикацию!? Посыпаю голову пеплом.

Так, сейчас поправим. Пост обновлён и существенно дополнен другим постом, который, собственно, и должен быть опубликован. И не в субботу, а в понедельник, но теперь уже неважно...

Можно ув.тов. Главного Редактора попросить глянуть на текст орлиным взором ещё разик?




@Minoru комментирует...
Для того, чтобы шрифт сделать больше или меньше
Исправлено.

Иногда хорошо бы знать их размер в pt». Причина та же.
Согласен, лучше.

Отличный совет! Этак ты скоро начнёшь рекомендовать вместо мороки с LaTeX писать формулы от руки
Слющи, самы умны, да? :-)
Серьёзно, Минору, они занимают просто конское место. Или это SPIEовцы накосячили в шаблоне, но всё равно - избавившись от списков, я треть страницы в статье выдоил.

списки жрут неоправданно много места — согласен.
А то. Рецепт было найти на удивление непросто.

Спеллчекер тебе таки не помешал бы :)
Как это говорят на ЛОРе? "Эта статья содержит слишком мало орфографических ошибок. Её следует проверить Шаманом" :-)

И да, пост существенно улучшен.

Анонимный комментирует...

На мой взгляд, неоправданно мало внимания уделяется могучему средству \vspace. С его помощью можно, например, уменьшить размер отступа перед началом новой секции или абзаца (например, если мне надо селать это всего один раз в документе, то мне лень вспоминать, как переопределяется стиль, а на \vspace{-5mm} уходит ровно две секунды). Можно ручками задать интерлиньяж в конкретном списке itemize или enumerate. Да массу полезных вещей можно сделать.

virens комментирует...

@riki-koen комментирует...
На мой взгляд, неоправданно мало внимания уделяется могучему средству \vspace

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

Попробую написать об этом отдельным параграфом.

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

Да массу полезных вещей можно сделать.
Огрести можно тоже массу :-) Я вот любил засовывать vspace во wrapfigure, а потом приходилось вылавливать эти фигуры отовсюду. Когда латеху сносило башню, он угонял картинки под самый топ страницы. Так что vspace может принести много неприятностей.

amorua комментирует...

Для компактного itemize и иже с ним лучше использовать

\usepackage{paralist}

с его compactenum и compactitem.

А для того, чтобы ссылаться на footnote, можно использовать обычные \label и \footnotemark. Вот здесь это обсуждается с подробностями

http://tex.stackexchange.com/questions/35043/reference-different-places-to-the-same-footnote

Да, а за идею сократить интервалы между словами - спасибо. Мне такое в голову не приходило, хотя часто приходится извращаться по поводу "компактификации".

Кстати, если нет четких указаний по поводу шрифта, то использование txfonts вместо обычного Computer Modern приводит к некоторой экономии места.

Klurik комментирует...

Спасибо за wrapfigure c {R}, уже намучался :)

virens комментирует...

@amorua комментирует...
Для компактного itemize и иже с ним лучше использовать

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

Но за ссылку спасибо.

А для того, чтобы ссылаться на footnote, можно использовать обычные \label и \footnotemark.
Не знал. Благодарствую!

Да, а за идею сократить интервалы между словами - спасибо.
Пожалуйста! Хотя это выглядит несколько криво и с головой выдаёт намерения втиснуть безбожно много текста, иногда проходит на ура.

Кстати, если нет четких указаний по поводу шрифта
Они обычно таки есть :-(

то использование txfonts вместо обычного Computer Modern приводит к некоторой экономии места.
Занятно. Попробуем.

@Klurik комментирует...
Спасибо за wrapfigure c {R}, уже намучался :)
Ю ар вэлком :-) Не самая очевидная опция, кстати. Но помогает поместить рисунок там, где надо, а не где считает латех :-)

Minoru комментирует...

> прибегнуть к ломовым методам грубой силы типа изменение междустрочного интервала и сужение полей до непристойных размеров.

«… вроде изменения … и сужения …»

> Изменение размера между строк

Между строками не размер, а расстояние.

> размер отступа между строками

Здесь слово «размер» вообще не нужно.

> пакет setspace

«setspace» не подсвечено. virens, CSS ждёт тебя!

> \onehalfspacing
> \doublespacing


Код не в рамочке. Или так и задумано?

> большей единицы

Ты хотел написать «значение больше единицы», я уверен в этом :)

> можно сузить отступы списков

Тавтология со списками. Здесь можно просто удалить слово. И рамочка для кода после этих слов какая-то другая.

> A this is customized

Особый, австралийский английский? :)

> В последнем случае пункты идут намного ближе.

Это примечание специально для тех, что читает блог из elinks и не видит картинок?

> Да, сноски - наши большие друзья в плане поместить туда текст, так как сноски, как правило, оформляются шрифтом меньшего размера. На сноски можно ссылаться, особенно если текст оттуда упоминается где-то ещё.

Многословно и запутанно. Я бы переписал так: «Да, сноски — наши большие друзья, так как они оформляются шрифтом меньшего размера».

> с помощью команд

«Команды».

> \fontdimen2

А почему 2 не подсвечено? И в коде ниже тоже… И почему ты внезапно перешёл на синий вместо коричневого?

> и задавая различные параметры для него.

Команда — она, так что «для неё». Вообще я бы «и» заменил на запятую, а то предложение довольно длинное и на одном дыхании точно не читается.

> Для генерации использован пакет \usepackage{lipsum} генерящий искажённый отрывок из философского трактата Цицерона «О пределах добра и зла».

Во-первых, за трактат Цицерона все уже знают — ты в начале поста говорил. Во-вторых, код опять подсвечен синим!

> Подсвеченные параметры означают:

Что-то ты с этим списком намудрил: каждый пункт в каком-то окружении, мешающем чтению. Первый пункт так вообще не дописан.

> в относительных единицах от ширины линии

«Относительно ширины строки».

> то это даст больше свободы ЛаТеХу.

Мне кажется, стоит поменять порядок слов: «даст ЛаТеХу больше свободы».

> Другой возможностью является добавление или удаления

«Удаление».

> и данном примере \vspace{-5ex} мы заставляем ЛаТеХ сместить картинку немного вверх, чтобы выиграть место для текста.

В этом месте лучше сделать отдельное предложение.

> Можно ув.тов. Главного Редактора попросить глянуть на текст орлиным взором ещё разик?

Ты меня по e-mail тыкай, если я долго не отвечаю. В этот раз, к примеру, забыл подписаться на комментарии…

Кстати, ты свои ящики проверяешь? Я тебе ещё в конце прошлого месяца на yandex кое-что отправлял, и что-то ни ответа, ни привета :(

virens комментирует...

@Minoru комментирует...

«setspace» не подсвечено. virens, CSS ждёт тебя!

На самом деле я публикацию этого поста прозевал: у меня их было два, один черновик и один более-менее дописанный. Поставил их scheduled posts и думал - поправлю. А один из них уже запостился...

Код не в рамочке. Или так и задумано?
Так вышло :-) Исправил.


Ты хотел написать «значение больше единицы», я уверен в этом :)
Да ты провидец! Можешь начинать делать предсказания, кстати: virens в следующем посте выложит баян давностью в полгода, сделав 132 орфографические ошибки :-)

Открывай казино или ипподром - типа тараканьих бегов, ставки, всё в реальном времени. На hakyl, markdown и джаваскриптах с CSS :-)

Особый, австралийский английский? :)
Их бин шпрехен них ин уан пиэм эт найт, фор выч ай ду аполоджайз. :-)

Многословно и запутанно. Я бы переписал так: «Да, сноски — наши большие друзья, так как они оформляются шрифтом меньшего размера».
Так лучше. Принято.

И почему ты внезапно перешёл на синий вместо коричневого?
На момент написания поста я использовал Kate из KDE4, где функцию File -> Export to HTML убрали нахрен. В KDE3 она есть. Поэтому и подсветка другая.

Сейчас я ухитрился восстановить все приложения из KDE3 и переделал раскраску.

трактат Цицерона все уже знают
Я не знал. Убрал второй раз Цицерона.

каждый пункт в каком-то окружении, мешающем чтению.
Убрал.

Первый пункт так вообще не дописан.
Хмм... да. Исправил.

Мне кажется, стоит поменять порядок слов: «даст ЛаТеХу больше свободы».
Согласен.


В этом месте лучше сделать отдельное предложение.
Ты прав, как всегда.

Ты меня по e-mail тыкай, если я долго не отвечаю. В этот раз, к примеру, забыл подписаться на комментарии…
Ладно. Я просто не ожидал, что этот пост появится :-)

Кстати, ты свои ящики проверяешь?
Конечно. Только на gmail. Я тебе отписался на почту.

Unknown комментирует...

А как сделать автоперенос формул на новую строку, в том числе при таком маленьком шрифте? Не нашёл ни одной нормальной статьи в интернете.

iv_vl комментирует...

@Андрей Сухарев комментирует…
А как сделать автоперенос формул на новую строку
В сборнике пакетов mh для LaTeX есть пакет breqn, производящий «Automatic line breaking of displayed equations». Никогда, правда, к нему не прибегал — достачно было окружения multiline, поэтому очень хотелось бы услышать ваше мнение о нём, если будете использовать.

Анонимный комментирует...

хочу просто сказать спасибо. Блог много раз выручал.

Владимир комментирует...

Подскажите пожалуйста, как изменить расстояние между пунктами в списке литературы?

Анонимный комментирует...

В некоторых случаях LaTeX порывается бороться с висячими строками. Это выливается в то, что текст "не доходит" до конца страницы. Занять всё пространство можно отключив штрафы за оставление висячих строк:

\clubpenalty=0
\widowpenalty=0

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

Подписаться на RSS-ленту комментариев к этому посту.