ЛаТеХ для продвинутых: Как контролировать положение плавающих объектов "floats"?

О плавающих объектах (например, картинках) в ЛаТеХе написано много книжек, статей, блогов, заметок, и т.д. Тем не менее вопросы вроде: "Почему я поставил там [!h], а ЛаТеХ всё равно засунул картинку на последнюю страницу?", — наверняка войдут в горячую десятку любого ЛаТеХ-форума. Причина этого проста: механизм размещения плавающих объектов (floats) довольно сложен и отнюдь неинтуитивен. Его описания же в основном рассчитаны на докторов физ-мат наук, решивших посвятить остаток своей жизни разборкам с ЛаТеХом. В этом посте я попытаюсь коротко осветить вопрос о том, как можно контролировать расположение плавающих объектов (в качестве примера будут использованны рисунки "figure", но все написанное применимо и к другим floats, например, table). Большая часть поста состоит из рецептов и примеров, исходники которых лежат здесь. Тем не менее, начать придется с небольшого кусочка теории. Итак, ...

Немного теории или "почему ЛаТеХ не делает то, что я хочу?"

Никто не сможет объяснить, как ЛаТеХ помещает флоатс (floats), точнее и лучше, чем сам Франк Миттельбах. Однако поскольку сделал он это на вражеском языке, мы позволим себе здесь повторить коротко его разъяснения.
Когда ЛаТеХ натыкается на плавающий объект в tex-файле, он пытается его немедленно разместить на странице. Страница для ЛаТеХа состоит из двух частей: верхней и нижней. Кроме того, флоат можно поместить "прямо здесь". Да-да, вы уже поняли, что речь пойдёт об этих загадочных буковках "h", "t" и "b" в \begin{figure}[htb]. ЛаТеХ делает следующее:
  1. Если в аргументе в квадратных скобках встречается "h", то ЛаТеХ попытается немедленно поместить плавающий объект.
  2. Если это невозможно, по причинам которые будут объяснены ниже, то ЛаТеХ посмотрит есть ли в аргументе "t". Если да, то он попытается поместить картинку в верхнюю область страницы.
  3. Если уж и тут не вышло, то ЛаТеХ поинтересуется, встречается ли буковка "b". Да? Тогда картинка идет вниз, если это возможно.
  4. В случае, если ничего не получилось, картинка будет помещена в очередь. ЛаТеХ будет пытаться разгрузить эту очередь, как только начнется новая страница. И здесь плевать он хотел на [hbt].
  5. Отдельная песня — это аргумент "p". На него ЛаТеХ обращает внимание только, когда он разгружает очередь после начала новой страницы. Если "есть такая буква в этом слове", то этот плавающий объект может быть размещен на странице без текста с одними только флоатс.
Как вы уже поняли, порядок аргументов ЛаТеХу абсолютно параллелен, то есть [hbt] и [tbh] возымеют абсолютно одинаковый эффект! Если аргументы не указаны, то по умолчанию предполагается [tbp]. Можно или нельзя поместить плавающий объект на текущей странице вверху (или внизу,...) определяется исходя из двух критериев:
  1. максимальное количество флоатс: totalnumber, topnumber, bottomnumber. Параметры эти означают... Ну, вы и сами догадались: максимальное количество флоатс на всей странице, в верхней и в нижней части, по умолчанию, 3, 2 и 1.
  2. размер "верха" и "низа" страницы не должен превышать \topfraction и \bottomfraction доли страницы, соответственно (по-умолчанию, 0.7 и 0.3). Кроме того, доля текста должна быть не менее \textfraction (по-умолчанию, 0.2).
К чему это всё? А к тому, что восклицательный знак ! означает, что эти два правила будут проигнорированны.
Если не предполагается полностью игнорировать все эти правила, то можно изменить значения параметров. Например,
01:  \setcounter{totalnumber}{10}
02:  \setcounter{topnumber}{10}
может пригодиться, если в документе много невысоких картинок. А
01:  \renewcommand{\topfraction}{1}
02:  \renewcommand{\textfraction}{0}
разрешит ЛаТеХу поместить высокую картинку на странице со всего парой строк текста.
Помимо вышеупомянутых параметров, при размещении плавающих объектов используются длины
  1. \textfloatsep — расстояние между флоатс (в верхней или нижней части страницы) и текстом (по умолчанию, около 20pt);
  2. \floatsep — вертикальное расстояние между двумя флоатс (около 12pt);
  3. \intextsep — расстояние между флоатс вставленным "прямо здесь" (параметр h) и текстом (около 12pt);
  4. \abovecaptionskip и \belowcaptionskip — расстояние над и под подписью к флоат.
Их можно изменить, например, так
01:  \setlength{\textfloatsep}{10pt plus 1.0pt minus 2.0pt}
02:  \setlength{\floatsep}{5pt plus 1.0pt minus 1.0pt}
03:  \setlength{\intextsep}{5pt plus 1.0pt minus 1.0pt}
чтобы всунуть больше плавающих объектов на одну страницу.

Каковы последствия алгоритма? Прежде всего, [!h] означает вовсе не "здесь и только здесь", а "здесь, если оно поместится". Точно также, как [!htpb] и [pb!th] означают абсолютно одно и то же. То есть порядок символов, в том числе и вослицательного знака, никакой роли не играет.
Всё, выдыхаем... Дальше пойдут рецепты.

Здесь, здесь, здесь и только здесь.

Об этом уже писал в блоге virens, но повторюсь: параметр [H] всунет плавающий объект именно там, где он встречается в tex-файле. Если флоат не помещается, то будет начата новая страница, оставив, как результат, пустое место на предыдыщей. Не стоит использовать этот параметер без особой надобности. Ну, и не забудьте сначала сказать \usepackage{float}.

A вам нужны эти флоатс?

Вообще говоря, если вы хотите поместить картинку и её подпись "прямо здесь", то вовсе необязательно использовать плавающий объект. Команда \captionof{}{} из замечательного пакета caption позволяет снабдить подписью что угодно. Например, вот такой код
01:  {
02:  \centering
03:  \includegraphics{mypicture}
04:  \captionof{figure}{Подпись к картинке}\label{fig:mypic}
05:  }
вставит картинку и снабдит её подписью. Первый аргумент — тип плавающего объекта, в данном случае, figure, но с таким же успехом могло бы быть table, wrapfigure и т.п.

Пример использования \captionof

"А для чего оно нужно?", — спросишь ты, привередливый читатель. А, например, для вот такого:
01:  ...
02:  \usepackage{array,graphicx,caption}
03:  ...
04:  \begin{tabular}{m{0.45\linewidth}m{0.45\linewidth}}
05:       Here just some text text text text text text text 
06:       text text text text text text text text text
07:       text text text text text text text text text 
08:       text text text text text text text text text 
09:       text text text text text text text text text  
10:      &
11:       \centering
12:       \includegraphics{roman.jpg}
13:       \captionof{figure}{Usage of captionof}\label{fig:intab}
14:  \end{tabular}

Конечно, не стоит злоупотреблять \captionof: в вышеупомянутом примере гораздо лучшей альтернативой является wrapfigure. Более адекватным примером использования \captionof является случай, когда картинку и таблицу надо разместить так, чтобы они гарантированно были друг под другом, т.е. в пределах одного плавающего объекта:
01:  \begin{figure}\centering % В одном флоат...
02:    % сначала картинка...
03:    \includegraphics[width=7cm]{fig/roman_b}
04:    \captionof{figure}{Figure part of the float}\label{fig:fig}
05:  \vspace*{3em}
06:    % потом таблица
07:    \begin{tabular}{ccc}
08:      ...
09:    \end{tabular}
10:    \captionof{table}{Table part of the float}\label{fig:table}
11:  \end{figure}

Сложный пример с \captionof

Примечание: Нетерпеливый читатель может пропустить этот пример без ущерба для понимания последующего текста.
Во своей своей красе \captionof предстаёт в случаях, когда надо разместить несколько картинок в пределах одного плавающего объекта, как, например, на рисунке внизу.
Стоит обратить внимание на выравнивание картинок: (b) и (c) занимают по высоте ровно столько места сколько более высокая картинка (а) слева. Код из этого примера приведен ниже:
01:  ...
02:  \usepackage[labelformat=simple]{subcaption}
03:  % метка subfigure: "(а)" вместо дефолтного "а"
04:  \renewcommand\thesubfigure{(\alph{subfigure})} 
05:  \usepackage{graphicx}
06:  ...
07:  
08:  \newsavebox{\leftpic}
09:  
10:  \begin{figure}[t]\centering
11:  % Левая картинка (а) помещена в бокс, чтобы измерить её высоту
12:  \sbox{\leftpic}%
13:  {% Левая картинка (a):
14:   \begin{subfigure}[b]{0.45\linewidth}\centering
15:     \includegraphics[height=7cm]{fig/roman_a1}
16:     \caption{Subfigure A}\label{fig:2a}
17:   \end{subfigure}%
18:  }
19:   %------------------------
20:   % Вывeсти картинку, сохраненную в боксе
21:   \usebox{\leftpic}
22:   \quad % немного пустого места между левой и правой картинками
23:   % Две правые картинки в минипейдж, 
24:   %   - высота которого равна высоте левой картинки: \ht\leftpic
25:   %   - материал будет растянут вертикально: [s] + \vfill 
26:   \begin{minipage}[b][\ht\leftpic][s]{0.45\linewidth}
27:    \begin{center}
28:     \includegraphics[height=2.5cm]{fig/roman_b}
29:     \captionof{subfigure}{Subfigure B}\label{fig:2b}
30:    \end{center}
31:  
32:    \vfill
33:  
34:    \begin{center}
35:     \includegraphics[height=2.5cm]{fig/roman_c}
36:     \captionof{subfigure}{Subfigure C}\label{fig:2c}
37:    \end{center}
38:   \end{minipage}
39:  \caption{Fancy placement of subfigures}
40:  \label{fig:2}
41:  \end{figure}
Здесь используется пакет subcaption, в котором определено окружение subfigure: оно, по-сути, идентично окружению minipage. Усложняющим фактором является то, что высота левой картинки заранее неизвестна. Поэтому картинка (а) сначала помещена в savebox под именем \leftpic при помощи команды \sbox{\leftpic}. Затем, после того как она выведена на печать с помощью \usebox{}, справа создаётся minipage:
01:  \begin{minipage}[b][\ht\leftpic][s]{0.45\linewidth}
высота которой равна высоте левой картинки (а): \ht\leftpic. Обратите внимание на необязательный аргумент [s] (s=stretch) и \vfill между (b) и (c). Благодаря им между (b) и (c) помещается "растягивающийся вертикальный интервал" таким образом, что картинки (b) и (c) полностью занимают всю высоту minipage.
В приведенном примере \captionof незаменим, так как он снабжает рисунки (b) и (c) подписью, причем делает это не абы как, а именно так как подписаны все другие subfigure и к тому же инкрементирует все необходимые счётчики, т.е. нумерация (b) и (c) получается автоматически.
В качестве домашнего задания, попробуйте соорудить вот такие две картинки.

Код для левой картинки:открыть
01:  ...
02:  \usepackage[labelformat=simple]{subcaption}
03:  \renewcommand\thesubfigure{(\alph{subfigure})} % I want (a), not just a
04:  
05:  \usepackage[demo]{graphicx} % опция demo вставляет черные прамоугольники вместо картинок
06:  ...
07:  \begin{figure}[!t]\centering
08:  \setcounter{subfigure}{0}
09:  \addtocounter{figure}{1}
10:  \def\hgt{15cm}
11:  \def\wdt{5cm}
12:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
13:    \begin{center}
14:     \includegraphics[width=\wdt]{fig/roman_b}
15:     \captionof{subfigure}{Subfigure A}\label{fig:3a}
16:    \end{center}
17:  
18:    \vfill
19:  
20:    \begin{center}
21:     \includegraphics[width=\wdt]{fig/roman_c}
22:     \captionof{subfigure}{Subfigure B}\label{fig:3bb}
23:    \end{center}
24:  
25:     \vfill
26:  
27:    \begin{center}
28:     \includegraphics[width=\wdt]{fig/roman_aa}
29:     \captionof{subfigure}{Subfigure C}\label{fig:3c}
30:    \end{center}
31:   \end{minipage}
32:  %
33:   \quad
34:  %
35:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
36:    \begin{center}
37:     \includegraphics[angle=90,width=\wdt]{fig/roman_b}
38:     \captionof{subfigure}{Subfigure D}\label{fig:3d}
39:    \end{center}
40:  
41:    \vfill
42:  
43:    \begin{center}
44:     \includegraphics[width=7cm,height=5cm]{fig/roman_c}
45:     \captionof{subfigure}{Subfigure E}\label{fig:3e}
46:    \end{center}
47:   \end{minipage}
48:   \addtocounter{figure}{-1}
49:   \caption{Fancy placement of subfigures}\label{fig:3}
50:  \end{figure}

Код для правой картинки:открыть
01:  ...
02:  \usepackage{caption}
03:  \usepackage[demo]{graphicx} % опция demo вставляет черные прямоугольники вместо картинок
04:  ...
05:  \begin{figure}[!t]\centering
06:  \def\hgt{15cm}
07:  \def\wdt{5cm}
08:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
09:    \begin{center}
10:     \includegraphics[width=\wdt]{fig/roman_b}
11:     \captionof{figure}{caption x1}\label{fig:x1}
12:    \end{center}
13:  
14:    \vfill
15:  
16:    \begin{center}
17:     \includegraphics[width=\wdt]{fig/roman_c}
18:     \captionof{figure}{caption x2}\label{fig:x2}
19:    \end{center}
20:  
21:     \vfill
22:  
23:    \begin{center}
24:     \includegraphics[width=\wdt]{fig/roman_aa}
25:     \captionof{figure}{caption x3}\label{fig:x3}
26:    \end{center}
27:   \end{minipage}
28:  %
29:   \quad
30:  %
31:   \begin{minipage}[b][\hgt][s]{0.45\linewidth}
32:    \begin{center}
33:     \includegraphics[angle=90,width=\wdt]{fig/roman_b}
34:     \captionof{figure}{caption x4}\label{fig:x4}
35:    \end{center}
36:  
37:    \vfill
38:  
39:    \begin{center}
40:     \includegraphics[width=7cm,height=5cm]{fig/roman_c}
41:     \captionof{figure}{caption x5}\label{fig:x5}
42:    \end{center}
43:   \end{minipage}
44:  %
45:  \end{figure}

Код из этих и всех остальных примеров (в виде полностью готовых к компиляции tex-файлов) можно также найти по этой ссылке: http://tinyurl.com/amorua-floats.

До сюда и ни миллиметром дальше: placeins

Вернёмся, однако, к основной теме: к дополнительным средствам контроля над расположением плавающих объектов. В некоторых ситуациях, нежелательно, чтобы плавающие объекты переносились слишком далеко. Например, нелогично, когда картинка из предыдущего раздела возникает лишь в следующем.
Штатным решением этой проблемы является \clearpage, который принудительно разгружает очередь плавающих объектов и начинает новую страницу. Последнее — новая страница — не всегда приводит к красивому результаты. Зачастую хотелось бы вывести все плавающие объекты без начала новой страницы, если это возможно.
Пакет placeins определяет команду \FloarBarrier, которая решает именно вышеупомянутую проблему. Как только LaТeX встретит \FloatBarrier, он выведет все накопившиеся в очереди флоатс, но при этом не будет без надобности начинать новую страницу.
Зачастую, начало нового раздела \section{} и является той логической границей, которую плавающие объекты не должны пересекать. Можно, конечно, вручную указывать \FloatBarrier перед каждым \section. Однако пакет placeins предоставляет опцию section, которая сделает это автоматически:
01:  \usepackage[section,above,below]{placeins}
Здесь использованы ещё две опции above и below. Они разрешают вывод картинки на той же странице, где начинается новый раздел (над или под названием раздела), хотя картинка относится к предыдущему. В некоторых случаях, \FloatBarrier всё-таки приведет к неприятным разрывам страниц. Типичная ситуация такого рода: флоат не влезает на остаток страницы, а после него сразу идёт \FloatBarrier. Здесь у ЛаТеХа не остаётся выбора и будет начата новая страница. Предотвратить такое поведение можно с помощью команды \afterpage из одноименного пакета
01:  ...
02:  \usepackage{afterpage,placeins}
03:  ...
04:  \begin{figure} % здесь сам флоат
05:    ...
06:  \end{figure}  
07:  
08:  \afterpage{\FloatBarrier} % вставить барьер сразу после
09:                            % начала новой страницы
10:  ...
Эта команда вставляет свой аргумент в TeX-код сразу после начала новой страницы.

Утром деньги — вечером стулья: flafter

Одним из последствий алгоритма, описанного в самом начале этого поста, может быть то, что даже если в tex-файле плавающий объект идет после первой ссылки на него, "на бумаге" он окажется раньше, чем на него первый раз ссылаются. Если этого желательно избежать, то самым простым решением является пакет flafter.
01:  \usepackage{flafter}% помещает флоат ПОСЛЕ первой ссылки на него 
Вот, собственно, и всё!

Да ну их всех взад: endfloat

Многие естественнонаучные журналы требуют, чтобы в манускриптах, посланных им на рецензию, все рисунки были вынесены в самый конец. Пакет endfloat сделает это автоматически: он перенесёт все рисунки в конец документа.
По умолчанию, пакет вставит на место рисунков и таблиц (в основном тексте) заглушки типа "[Figure 5 about here]". Затем, после основного текста, сначала Список рисунков и Список таблиц, а затем и сами рисунки/таблицы, центрированными по одной на странице.
Контролировать поведение пакета можно с помощью параметров, наиболее интересными из которых являются nomarkers, nofiglist и notablist. Например,
01:  \usepackage[nomarkers,nofiglist,notablist]{endfloat}
не будет вставлять заглушки и списки рисунков и таблиц.
Если списки флоатс все-таки нужны, то порядок их вывода контролируется параметром tablesfirst или figuresfirst (включен по умолчанию), которые, выводят первым список таблиц или рисунков, соответственно.

Картинки с продолжением: \ContinuedFloat

Иногда возникает необходимость разместить большое количество логически связанных "подрисунков" (subfigures) в пределах одного рисунка. Однако, ЛаТеХ не поддерживает плавающие объекты размером более одной страницы. Проблема решается командой \ContinuedFloat из уже упомянутого пакета caption. Использование этой команды очевидно из примера ниже:
01:  ...
02:  \usepackage{caption}
03:  \usepackage[labelformat=simple]{subcaption}
04:  \renewcommand\thesubfigure{(\alph{subfigure})} % I want (a), not just a
05:  ...
06:  \begin{figure} % Начало "длинного" рисунка
07:    \begin{subfigure}{0.5\linewidth}  % Первый "подрисунок"
08:       \includegraphics{...}
09:       \caption{...}\label{...}
10:    \end{subfigure}
11:    ... % здесь ещё подрисунки
12:    \begin{subfigure}{0.5\linewidth}  % n-й "подрисунок
13:       \includegraphics{...}
14:       \caption{...}\label{...}
15:    \end{subfigure}
16:    \caption{Мой любимый рисунок}\label{...}
17:  \end{figure} % конец первой части
18:  
19:  \begin{figure} \ContinuedFloat % продолжение рисунка
20:    \begin{subfigure}{0.5\linewidth}  % (n+1)-й "подрисунок"
21:       \includegraphics{...}
22:       \caption{...}\label{...}
23:    \end{subfigure}
24:    ... % здесь ещё подрисунки
25:    \begin{subfigure}{0.5\linewidth}  % последний "подрисунок
26:       \includegraphics{...} 
27:       \caption{...}\label{...}
28:    \end{subfigure}
29:    \caption{Мой любимый рисунок (продолжение)} % \label здесь не нужна!!! 
30:  \end{figure} % конец второй (и последней) части рисунка
Принцип очень прост: делим "длинный рисунок" на несколько частей. Каждую часть помещаем в отдельный плавающий объект (окружение figure). Во всех частях, кроме первой добавляем \ContinuedFloat сразу после \begin{figure}. Эта команда "переставит" все счётчики (для figure и для subfigure) соответствующим образом: figure не изменяется (все части имеют один "номер"), а subfigure продолжится начиная с последней буквы предыдущей части.
Обратите внимание, что к каждой части надо вручную добавить \caption{...}.
Абсолютно то же самое можно проделать для любого типа плавающего объекта, например, для table.

Картинки на развороте: dpfloat

Если два больших флоат-рисунка связаны логически, как, например, в примере из предыдущего раздела, то их желательно разместить так, чтобы читатель мог лицезреть обе части одновременно, то есть на развороте. Это особенно удобно, если текст манускрипта будет напечатан в виде книжки: например, в случае диссертации.
На практике это означает, что первая часть рисунка должна попасть на чётную страницу, а вторая — на нечётную (предполагается, что книжка начинается со страницы 1, у которой нет "разворотной пары"). Сделать это можно с помощью пакета dpfloat. Ограничением является то, что каждая из частей будет занимать полную страницу, на которой не будет текста. А делается это так: надо создать два плавающих объекта, идущих в tex-файле друг за другом. Рисунок внутри первого флоат, который должен оказаться слева, помещается внутрь окружения leftfullpage, а рисунок внутри второго, который предполагается быть на правом развороте, внутрь fullpage. Пример ниже демонстрирует это в подробностях.
01:  ...
02:  \usepackage{dpfloat}
03:  ...
04:  \begin{figure} % первая часть
05:    \begin{leftfullpage} % Эта картинка гарантированно окажется
06:                         % на ЛЕВОМ развороте
07:       % здесь все, что обычно...
08:       % например, \includegraphics{...}
09:    \end{leftfullpage}
10:  \end{figure}
11:  
12:  \begin{figure} % вторая часть
13:    \begin{fullpage} % Эта картинка гарантированно окажется
14:                     % на ПРАВОМ развороте
15:       % здесь все, что обычно...
16:       % например, \includegraphics{...}
17:    \end{fullpage}
18:  \end{figure}

Последний рецепт: одинокие картинки

Несмотря на все продвинутые способы контроля положения плавающих объектов, время от времени возникают ситуации, когда посленяя (или пара последних) картинка остаётся напоследок и оказывается одиноко на самой последней странице. При этом, независимо от параметров вроде [hbt], она будет размещена (вертикально) по центру страницы. Но зачастую желательно разместить картинку вверху страницы, в основном, из эстических соображений. Достичь этого очень просто, поместив следующий код в tex-файл:
01:  \makeatletter
02:  \setlength{\@fptop}{0pt}
03:  \setlength{\@fpbot}{0pt plus 1fil}
04:  \makeatother
Любознательные могут ознакомиться с подробностями вот здесь.

Заключение и выводы

Итак, штатные средства ЛаТеХ позволяют контролировать местоположение плавающих объектов с помощью необязательных аргументов [htbp!] и параметров определяющих максимальное количество таких объектов на странице и её частях. Для более продвинутого контроля можно использовать расширения, содержащиеся в пакетах float, caption, placeins, afterpage, flafter, endfloat и dpfloat. В этом посту мы обсудили наиболее общеупотребительные их аспекты, однако для более подробного описания лучше ознакомиться с оригинальной документацией.
Прибегнув к "тонкой настройке" плавающих объектов, в большинстве случаев можно добиться вполне приемлемых результатов даже при "автоматическом" размещении их ЛаТеХом. Разумеется, при диспропорционально большом количестве рисунков и/или таблиц, скорее всего понадобится ручное вмешательство.
При возникновении конкретных проблем, зачастую быстрее всего получить ответ можно задав вопрос на http://tex.stackexchange.com/.
Исходники (tex-файлы) для всех примеров из данного поста можно найти здесь. Зеркала на случай сбоя: зеркало1, зеркало2

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

Здорово, amorua! У меня нет слов: все разжевано до мельчайших подробностей, просто сразу же бери и размещай плавающие объекты на любой вкус. Чувствуется опыт написания научный статей, что даже из подобного зоопарка мелких пакетов все выложено в единую мозаику. По тексту добавить нечего — в закладки непременно. У вас нет желания вести свой блог?

Михаил, ссылки на профили в начале поста сломаны все. Неужели диверсия против приглашенных авторов? Я тут, извини, напомню: ты обещал большой пост про MEX-файлы на НГ. Но вот уже весна, а поста нет.

Михаил Саушкин комментирует...

Отличный пост!

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

Спасибо, актуально как раз оказалось.

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

@ iv_vl, Михаил Саушкин
Я рад, что пост понравился. Будут вопросы, замечания или предложения -- не стесняйтесь :)

@ iv_vl
У вас нет желания вести свой блог?
Времени нет -- работа, дети.

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

@iv_vl комментирует...
Здорово, amorua! У меня нет слов: все разжевано
Да, пост отменный. Вот если бы вся документация в опенсорце была написана вот так!

Михаил, ссылки на профили в начале поста сломаны все.
Я не понял, что ты имеешь в виду. Можно скриншотик?

Я тут, извини, напомню: ты обещал большой пост про MEX-файлы на НГ. Но вот уже весна

Да я помню, помню. Собственно, один абзац уже написан, начало, так сказать, положено :-)

Мне сейчас надо дописать пост на конференцию (American Control Coference) и в журнал. Между делом беру социалистическое обязательство собрать все заметки по MEX и выдать пост.

@Михаил Саушкин комментирует...
Отличный пост!

Кстати, принят с минимальными правками. И если у тов.amorua появятся ещё посты - буду очень рад.

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

@virens комментирует...
Я не понял, что ты имеешь в виду. Можно скриншотик?
Вот тут изобразил красными стрелками нерабочие линки, также не работают они на главной странице. Захотел было я взглянуть на профиль тов. amorua, но не тут-то было.

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

@iv_vl комментирует...
Вот тут изобразил красными стрелками нерабочие линки
Ммм... а знаешь, vl_vl, такой фичи не было в оригинальном шаблоне. Я тебе больше скажу: её и в других шаблонах что-то не видно. Такое довольно нетривиально приделать, если в блоге много авторов. Есть костыли, но они для основного автора.

Кстати, в процессе гугления набрёл на новый шаблон. Уже применил к своему секретному блогу - оно ничего.

не работают они на главной странице.

Они никогда и не работали.

Захотел было я взглянуть на профиль тов. amorua, но не тут-то было.
А там всё равно пока пусто :-) Но дело не в этом. Пока не могу найти решения, оставлю как есть. На самом деле текущий шаблон мне нравится и ломать его пока острого желания нет.

Да, если есть пожелания и предложения - пишите в комментарии. Капча пока отключена, а то горячие украинские\румынские\русские девчонки, страстно желающие пососать что-то покруче чупачупса, меня уже достали в комментах :-)

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

@virens комментирует...
Ммм... а знаешь, vl_vl, такой фичи не было в оригинальном шаблоне.
Тогда оформи её как feature request :) Для этого нужно добавить ссылку на "post.authorProfileUrl", стандартный код для шаблона я нагуглил здесь. На изменения, что делает автор, не обращай внимания: тебе нужно скопипастить кусок кода из пункта 6 (это стандартный код, идет с проверкой на наличие самого URL) и вставить в свой шаблон. Еще нашел схожий код здесь. Попроси Vlsu - у него, вроде бы, все правильно сделано.

Кстати, в процессе гугления набрёл на новый шаблон. Уже применил к своему секретному блогу - оно ничего.
Ой, и не лень тебе менять? Вон я тоже дизайн свой меняю постоянно. Но уже успокоился, надо и написать что-нибудь в блоге.

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

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

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

Для этого нужно добавить ссылку на "post.authorProfileUrl"
Дык я ж это, не вёб-дезигнер я. Кто ж знал... а оно вон как :-)

Еще нашел схожий код здесь.
Йа-йа, даст ист капитале! :-) Сделано!
Спасибо, iv_vl! Теперь оно отображает всех как надо.

Кстати, если ты набиваешься кому в Блоггере в соавторы, оно создаёт профиль, в котором единственный блог - авторский. Так что профили есть у всех.


Ой, и не лень тебе менять?
А у меня два режима: 1) не сломалось - не чини, и 2) долой самодержавие! ДОЛОЙЪ!! БАНЗАЙ!!! :-)

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

Ну и про календарик ты в курсе.
Мне этот как-то сразу в душу запал. А те, что с годом, напоминают китайские смартфоны Zopa c экраном 15" - большие, дурные и бестолковые. Не нра.


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

Там раскрывают тайны подписей к рисункам.

Ну и отличное обсуждение по поводу того, как повернуть группу рисунков.

Ну и ещё раз браво, amorua. Отличный пост!

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

@virens
поставить рисунки друг к другу, в том числе с помощью так любимого мною minipage.
Собственно, см второе "домашнее задание" -- там тоже минипейджи. Кроме того, subfigure environment -- это тоже минипейдж, просто замаскированная.
Я вот подумываю написать про floatrow (я об этом упоминал в своем первоначальном плане). Он решает все эти (и многие другие) проблемы гораздо более продвинутым и элегантным путем (хотя под капотом -- опять минипейджи).

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

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

Кроме того, subfigure environment -- это тоже минипейдж, просто замаскированная.
Хм, а я не знал. Просто я всегда пользовался minipage и мог с помощью них сделать всё, что мне надо.

Я вот подумываю написать про floatrow (я об этом упоминал в своем первоначальном плане).

Отличная идея! Всенепременно поддерживаю, и Анонимусы, думаю, тоже. Тем более, что скоро лето и у Анонимусов начнётся сезонное обострение под названием "Диплом" и "Курсач" :-) Серьёзно, заходы на мой старый пост про иллюстрации уже поползли вверх.

Да, amorua, добавил в экипаж - легенду и аватар пришлось сочинять на ходу. Если есть возражения - готов принять.

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

Я столкнулся с проблемой при создании "картинок с продолжением" - subcaption трижды ругается на 59 строку:

\caption@ForEachType{\DeclareCaptionSubType{#1}}

даже если используется только в преамбуле (скриншот ошибки http://vk.cc/3kEKA0).

Собственно, временное решение - использование двух независимых minipage и уменьшение счетчика картинок на 1.

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

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