12/15/2008

Иллюстрации и рисунки в LaTeX

Этот пост является частью большой статьи
"Как оформить диплом в LaTeX?",
которую написал virens,
ведущий блога "Записки дебианщика".

Здесь приводятся базовые идеи и примеры, которые вам нужно освоить для вставки изображений и рисунков в LaTeX. Мы рассмотрим вставку нескольких рисунков в ряд и оформление групп рисунков, для чего будем пользоваться окружением minipage. Для набора дипломов по техническим специальностям приведённых сведений должно хватить.



Подготовка
Для начала работы с изображениями нужно подключить пакет graphicx, который обеспечивает их вставку в текст документа. Есть много драйверов для работы с изображениями, но мы будем использовать dvips - это позволит нам потом сравнительно легко и довольно просто конвертировать диплом из LaTeX в Word или OpenOffice через формат RTF, используя открытую программу latex2rtf. Для этого ваши рисунки нужно конвертировать в EPS, что делается программой convert из пакета imagemagick или утилитой sam2p. И imagemagick, и sam2p есть в стандартных репозиториях Debian и ставятся на раз.
 


Как вставить в LaTeX-документ изображение?
Рисунок в технической статье или отчёте - это не просто картинка, а ещё и подпись к нему, и возможность поставить на рисунок ссылку. Для этого сначала в преамбуле документа (это те самые магические заклинания, которые до \begin{document} ) нужно вставить следующее:

\usepackage[dvips]{graphicx}
\graphicspath{{noiseimages/}}

Рисунки лучше хранить в отдельных каталогах, идеально - для каждой главы диплома свой каталог. Следует перечислить все каталоги с рисунками, чтобы ЛаТеХ смог их найти. Делается это так:  


\graphicspath{{images-overview/}{images-deconv/}{images-linearization/}{images-noiseincoding/}{images-linearization/imagemotion/}{images-opticalcoding/}}

В ЛаТеХе вы только упоминаете рисунок - ставите на него относительную ссылку при помощи команды  
\includegraphics[width=1\linewidth]{image}
Как уже говорилось, если ваш рисунок в формате PNG/TIF/JPG или ещё каком-нибудь, нужно сначала перевести его в EPS при помощи программы convert из пакета imagemagick или утилитой sam2p. Например, чтобы конвертировать файл в EPS программой convert, нужно дать команду:
convert image.jpg image.eps
После этого копируем полученный eps-файл в каталог, указанный в \graphicspath{{noiseimages/}}, в данном случае подкаталог noiseimages, который находится в каталоге с нашим tex-файлом.


Помимо вставки картинки, нам нужна к нему подпись и возможность сослаться. В общем, мы можем:

  1. определить место рисунка в тексте - разрешить алгоритмам ТеХа принять решение исходя из заполненности страницы \begin{figure}[h] "хотелось бы картинку здесь", настойчиво просить разместить после текста \begin{figure}[h!] "очень хочу картинку здесь", и ударить кулаком по столу - картинку тут и точка \begin{figure}[H] "ХОЧУ картинку здесь и баста", а с прибавлением буквы p мы заставляем поместить ЛаТеХ картинку отдельно на страницу так: \begin{figure}[pH].
  2. задать размер изображения в относительных единицах - долях от ширины строки или текста
  3. вставить подпись под рисунком \caption{Зависимость сигнала от шума для данных.}
  4. вставить ссылку на рисунок \label{ris:image}

А теперь всё сразу:


\begin{figure}[h]
\center{\includegraphics[width=1\linewidth]{image}}
\caption{Зависимость сигнала от шума для данных.}
\label{ris:image}
\end{figure}

Результат в документе:

Всё просто и понятно в этом примере: мы разместили рисунок, который находится в файле image, в тексте - оставляем выбор размещения за ТеХом. Размер его будет во всю строку, подпись - "Рис.N:Зависимость сигнала от шума для данных.", где N - номер рисунка, который будет вставлен позже, во время сборки документа. Расширение у документа не указывается: если вы используете драйвер dvips, то это обязательно postscipt.

Теперь надо ссылаться на рисунок так: как показано на Рис.~
\ref{ris:image} - так вы всегда сошлётесь на правильный рисунок. Только нужно следить, чтобы имена рисунков не повторялись.
Главное - делать название рисунков осмысленными и понятными вам, а не просто ris1, ris2... Естественно, что LaTeX - это язык программирования, так что все советы по грамотному написанию программ уместны и здесь.
Маленькая хитрость: команду \caption{} нужно использовать обязательно перед \label{}, иначе в документе ссылка будет не на рисунок, а на текущую subsection.


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

 

 

Два рисунка в строчку
Немного усложним пример - вставим два рисунка в строку, с единой подписью под каждым. Можно вставить ещё один
\includegraphics, но под рисунками должны быть подписи а) и б) и нужно, чтобы они были по центру. Для этого есть замечательное окружение \begin{minipage} .. \end{minipage}. То есть резервируем место под рисунок, и вставляем его во фрейм. Вот так:

\begin{figure}[h]
\begin{minipage}[h]{0.49\linewidth}
\center{\includegraphics[width=0.5\linewidth]{image} \\ а)}
\end{minipage}
\hfill
\begin{minipage}[h]{0.49\linewidth}
\center{\includegraphics[width=0.5\linewidth]{image} \\ б)}
\end{minipage}
\caption{Зависимость сигнала от шума для данных.}
\label{ris:image1}
\end{figure}

Здесь ширина рисунка указана 1\linewidth то есть во всю строку, но строка теперь ширины 0.49\linewidth так что рисунок будет во весь фрейм размера в половину строки. Кроме того, после каждого рисунка идётразрыв строки и буква, обозначающая рисунок. Нужно помнить, что ссылка и подпись под рисунками одна.

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

Команда \hfill позволяет раздвинуть рисунки к краям страницы, как бы заполняя между ними пространство пустотой. Из приведённых примеров должно быть понятно, как вставлять несколько рисунков в строку, теперь немного усложним задачу и попробуем вставить два рисунка в строчку и два в столбец.


Два рисунка в строчку и два в столбец

Следующий уровень - вставляем рисунки не только в строчку, но и по столбцам. Идея таже, только после заполнения строчек вставляем команду \vfill которая растолкнёт рисунки по строкам. Всё остальное остаётся в силе: используем окружение minipage и грамотно выставляем ширину этих самых minipage так, чтобы оставался небольшой зазор: для двух картинок 0.48, для трёх 0.31 и так далее. Собственно, код:

\begin{figure}[H]
\begin{minipage}[h]{0.47\linewidth}
\center{\includegraphics[width=1\linewidth]{image}} a) \\
\end{minipage}
\hfill
\begin{minipage}[h]{0.47\linewidth}
\center{\includegraphics[width=1\linewidth]{image}} \\b)
\end{minipage}
\vfill
\begin{minipage}[h]{0.47\linewidth}
\center{\includegraphics[width=1\linewidth]{image}} c) \\
\end{minipage}
\hfill
\begin{minipage}[h]{0.47\linewidth}
\center{\includegraphics[width=1\linewidth]{image}} d) \\
\end{minipage}
\caption{Correlation signal peaks: a) numerical experiment, b)
registered correlation signals, c) intensity distribution of correlation
signals in numerical experiment, d) correlation signals intensity
distribution for DCRAW processed data.}
\label{ris:experimentalcorrelationsignals}
\end{figure}

Результат:



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




Два рисунка с разными подписями

Это важный частный случай, так как довольно часто сделать одну подпись для двух рисунков или длинно, или сложно, и поэтому лучше выделить их в два отдельных рисунка, но в ряд. Мы не будем привлекать для этого отдельные сущности, а воспользуемся старым-добрым minipage. Надеюсь, благодарный читатель ещё помнит, что ЛаТеХ - он как рельса, прост и бесхитростен, и делает то, что вы ему прикажете, как бы костыляво это не выглядело:

Для этого случая код следующий:

\begin{figure}[h]
\begin{center}
\begin{minipage}[h]{0.4\linewidth}
\includegraphics[width=1\linewidth]{image}
\caption{Исходное изображение.} %% подпись к рисунку
\label{ris:experimoriginal} %% метка рисунка для ссылки на него
\end{minipage}
\hfill
\begin{minipage}[h]{0.4\linewidth}
\includegraphics[width=1\linewidth]{image}
\caption{Закодированное изображение.}
\label{ris:experimcoded}
\end{minipage}
\end{center}
\end{figure}

Как видно, всё достаточно легко и просто. Не забываем проставлять нужные размеры minipage и рисунков, периодически посматривая на результат в kdvi и корректируя код по ходу дела.
 


Три рисунка с индивидуальными ссылками

Вариация на тему предыдущего случая, но через subfigure. При этом можно ссылаться на под-рисунки отдельными ссылками, например "см. Рис~\ref{fig:actuatorscouplingSheme_decoupledcase} будет отображено как "Рис 2(а)". Добавляем в преамбулу:

\usepackage{subfigure}

и далее вставляем этот код: 

\begin{figure}[ht!]  
\vspace{-4ex} \centering \subfigure[]{
\includegraphics[width=0.25\linewidth]{actuatorscouplingSheme_decoupledcase.eps} \label{fig:actuatorscouplingSheme_decoupledcase} }  
\hspace{4ex}
\subfigure[]{
\includegraphics[width=0.25\linewidth]{actuatorscouplingSheme_nearestcoupledcase.eps} \label{fig:actuatorscouplingSheme_nearestcoupledcase} }
\hspace{4ex}
\subfigure[]{ \includegraphics[width=0.24\linewidth]{actuatorscouplingSheme_nearestcoupled_and_diag_case.eps} \label{fig:actuatorscouplingSheme_nearestcoupled_and_diag_case} }  
\caption{Coupling cases for the DM models: \subref{fig:actuatorscouplingSheme_decoupledcase} decoupled case; \subref{fig:actuatorscouplingSheme_nearestcoupledcase} coupling between the closest neighbours; \subref{fig:actuatorscouplingSheme_nearestcoupled_and_diag_case} coupling between the closest neighbour and diagonally adjacent actuators.} \label{fig:threeDMcases}
\end{figure}

В итоге мы получим вот что:



Так что теперь в тексте можем ссылаться отдельно на рисунок 2а, 2b или 2c с помощью команды \ref{}. На самом деле, subfigures умеют намного больше.



Три рисунка разной высоты

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

\begin{figure}[H]
\begin{minipage}[h]{0.32\linewidth}
\center{\includegraphics[width=0.8\linewidth]{image}}
\end{minipage}
\hfill
\begin{minipage}[h]{0.32\linewidth}
\center{\includegraphics[width=0.4\linewidth]{image}}
\end{minipage}
\hfill
\begin{minipage}[h]{0.32\linewidth}
\center{\includegraphics[width=0.9\linewidth]{image}}
\end{minipage}
\begin{minipage}[h]{1\linewidth}
\begin{tabular}{p{0.32\linewidth}p{0.32\linewidth}p{0.32\linewidth}}
\centering а) & \centering б) & \centering в) \\
\end{tabular}
\end{minipage}
\vspace*{-1cm}
\caption{Процесс кодирования: а) оригинальное изображение, б) ФРТ киноформа, в) закодированное изображение.}
\label{ris:correlationsignals}
\end{figure}

Как это выглядит в документе:

Здесь игра в том, что после всех окружений minipage, в которых вставлены картинки, идёт отдельная minipage. В ней - таблица, ширина колонок которой точно такая же, как и ширина minipage для картинок. Вот, собственно, код:

\begin{minipage}[h]{1\linewidth}
\begin{tabular}{p{0.32\linewidth}p{0.32\linewidth}p{0.32\linewidth}}
\centering а) & \centering б) & \centering в) \\
\end{tabular}
\end{minipage}

Я немного забегаю вперёд и использую таблицы, которые будут описываться в другом разделе, но думаю, что человек с высшим образованием без труда переведёт слово tabular.


Рисунок с обтеканием текста в LaTeX
В дипломах такие фокусы не приветствуются, но если очень нужно - делается сравнительно просто пакетом расширения wrapfig. Для это подключаем этот пакет в преамбуле \usepackage{wrapfig}.

После этого у нас появляется замечательная возможность продемонстрировать свою невероятную оформительскую крутизну, используя окружение \begin{wrapfigure}...\end{wrapfigure}, когда нужно сделать обтекание рисунка:

\begin{wrapfigure}
[16]{r}{0.5\linewidth} 
\vspace{-5ex}
\includegraphics[width=\linewidth]{image}
\caption{Some caption}
\label{fig:somelabel}
\end{wrapfigure}

Подсвеченные параметры означают:
 
[16] - определяет высоту рисунка в число строк текста и позволяет отбить дополнительное место для рисунков. 

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

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




Сквозная нумерация рисунков в LaTeX
Часто требуется, чтобы номер рисунка содержал в себе номер главы (вроде Рис. 1.1). Чтобы была сделана нумерация по главам, достаточно изменить счётчик рисунков в преамбуле документа вот так:
\renewcommand{\thefigure}{\thechapter.\arabic{figure}}
Обратите внимание на красную точку - она должна присутствовать. Можно изменить способ, которым формируются счётчики, с помощью следующих команд:
  • \arabic{page} 4
  • \roman{page} iv
  • \Roman{page} IV
  • \alph{page} d
  • \Alph{page} D
Больше узнать о счётчиках можно тут.



Выводы
Вставка изображений в ЛаТеХ - дело очень простое, и оно сэкономит вам много нервных клеток для более важных дел. Важно то, что со временем эти конструкции у вас войдут в привычку, и однажды написанный код начнёт кочевать из работы в работу.

47 комментариев:

  1. Кроме minipage для объединения нескольких рисунков в один можно пользоваться пакетом subfig. Тогда удобно ссылаться на части рисунка.

    ОтветитьУдалить
  2. Михаил, было бы интересно, если бы вы написали статью про ваш опыт общения с редакциями журналов, которые требуют присылать статьи только "в Ворде".

    ОтветитьУдалить
  3. Совсем не нужно всё в eps преобразовывать.

    ОтветитьУдалить
  4. 2 Me комментирует...
    Кроме minipage для объединения нескольких рисунков в один можно пользоваться пакетом subfig
    Не стоит плодить сущности без крайней необходимости. Minipage справляется со своей работой, и делает этого хорошо. Ссылаться на рисунки внутри так же легко, как обычно.

    2 Анонимный комментирует...
    Михаил, было бы интересно, если бы вы написали статью про ваш опыт общения с редакциями журналов, которые требуют присылать статьи только "в Ворде".
    Отрицательный опыт общения: кроме вытрепленных нервов и знакомства с редакциями а-ля-Клуб-кому-за-60, приходится править оформление статьи под ИХ ворд. Обычно я конвертирую latex2rtf и с каменным лицом выдаю им со словами "ваш кривой ворд, ничего не знаю". В "Наукоёмких технологиях", куда меня заставили писать, это прокатило.

    2 Анонимный комментирует...
    Совсем не нужно всё в eps преобразовывать.
    Мне это нужно для: 1. просмотра в dvi, 2. конвертации в RTF и далее в DOC.

    Слушаю ваши предложения по конвертации в DOC латеховского документа без картинок в EPS. Желательно с примером. Я без иронии - предлагайте. Включу в текст статьи. Сразу.

    ОтветитьУдалить
  5. Для рисунков с вложенной нумерацией все же лучше использовать пакет subfig, тогда ссылки будут иметь вид 1(а), и к номерам не надо вручную дописывать буквы.

    Кроме того, не раскрыта тема рисования схем и графиков непосредственно в LaTeX (прежде всего, пакеты pstricks и pgf). Будет ли это предметом отдельной статьи?

    ОтветитьУдалить
  6. Насколько хороши статьи, насколько воняют они своими "поставьте ссылку на оригинал".

    ОтветитьУдалить
  7. mkevac комментирует...
    ну если так сильно воняют то не читай :-). Уважай труд других людей.

    Михай а у Вас был опыт печати латевского документа в типографии, если я им принесу в латексе диплом они мне его распечатаю или даже открыть не смогут?

    ОтветитьУдалить
  8. Михаил, а как сделать рамку вокруг рисунка и подписи к нему? Как делать рамку вокруг определенного куска текса (код программы).

    ОтветитьУдалить
  9. 2 Maverick

    кажется, так:

    \framebox[ширина][расположение]{содержимое}

    Расположение текста внутри бокса:
    * c -- по центру (default)
    * l -- слева
    * r -- справа
    * s -- выравнивание по обоим краям (текст дложен содержать растяжимые пробелы, чтобы данный вариант сработал)

    Миша.

    ОтветитьУдалить
  10. Михаил, почитал ваши посты, великолепно написано, спасибо за материал.

    Мысль пришла:
    У вас везде стоит одна фраза копирайтная:
    "Этот материал написал Михаил Конник aka virens и опубликовал на своём блоге Записки дебианщика."

    Имхо, ее легко вычистить sed`ом и подобными инструментами. Надо разнообразить:

    "Материал сей Конник "virens" Михаил выложил на блоге сем - Дебианщика Скрижали."

    "Virens aka, Конник Михаил написал труд сей, в "Записках дебианщика" выложил он в блоге."

    "Труд Конник сей написал, Михаил, Virens аки, в "Записках", выложил он, "Дебианщика", блоге том"...

    и т.д. ;)))

    ОтветитьУдалить
  11. У меня почему-то вместо рисунка пустая рамка. Такая ситуация в Debian Etch и в Ubuntu 8.04 - всё та же пустая рамка вместо рисунка. Что делать? Мне ведь надо скоро сдавать. Если у LaTeX'а такие серъёзные проблемы со вставкой рисунков, то от него придётся отказаться в пользу OpenOffice.org, там хоть проблем с рисунками нету.

    ОтветитьУдалить
  12. Спасибо за статью. Все, конечно, хорошо, но как поменять вывод \caption{Название рисунка}?
    Латех выводит по умолчанию следующую конструкцию:

    Рис. Х: Название рисунка

    - ни один нормоконтроллер не пропустит такой диплом или другой технический документ.
    Сейчас по ГОСТ название рисунка должно быть приведено слудующим образом:

    Рисунок Х - Название рисунка

    То же с таблицами, только надпись должна быть вверху таблицы.
    Было бы неплохо это отразить.
    Что-то похожее по этому вопросу нашел здесь
    http://samolisov.blogspot.com/2008/06/latex_12.html , но у меня пока не работает. :( Ищу решение...

    ОтветитьУдалить
  13. \addto\captionsrussian{
    \def\figurename{Рисунок}
    }

    У меня-то больше всего гемора было с созданием этих самых eps. Большая часть рисунков была изначально в visio.

    Пробовал сначала в Visio 2002 -> eps. Результата жуть как корявый.

    Пробовал Visio->svg svg->Inskape->eps
    Результат лучше, однако есть проблемы (стрелки на линиях, многострочные надписи).

    В итоге остановился на виртульном принетере. Результат отличный, однако надо очень внимательно следить за размером бумаги и масштабировать под него картинку.

    ОтветитьУдалить
  14. также можно создавать eps в Dia, всегда так делаю

    ОтветитьУдалить
  15. Спасибо, Михаил, очень хорошая статья!

    ОтветитьУдалить
  16. Помогите! В YAp картинки eps показываются как надо, а при печати они маленькие и в углу страницы. В чем проблема?

    ОтветитьУдалить
  17. Использую сочетание Ubuntu->Kile, если делать как всё написано, но в конечном pdf-е boundingbox отрисовывается, однако картинки не отображаются. В условиях цейтнота потратил массу драгоценного времени, но всё-таки нашёл, на форуме убунты что:

    \usepackage[dvips]{graphicx}
    надо заменить на
    Code:
    \usepackage{graphicx}

    is enough. graphics will be loaded by graphicx. Don't set driver options like dvips and pdftex if it's not really necessary, it should be automatically detected.

    В результате всё заработало.

    ОтветитьУдалить
  18. Спасибо большое за статью!

    При применении рецептов возникла одна проблема. В подписях к рисункам необходимо использовать математику (типа $\lambda 6439 \AA$), но компилятор выдаёт ошибку ! Argument of \Hy@tempa has an extra }.

    может что-то ещё надо дописать/довключить? гугление дало пару страничек на английском, где присоветовали воспользоваться \protect, но я чайник и не очень понимаю, как это сделать.

    Буду очень благодарна за любую помощь =)

    Алина

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

    ОтветитьУдалить
  20. "...После этого копируем полученный eps-файл в каталог..." Подскажите, пожалуйста, какова последовательность действий. Я хотел бы вставить рисунок. Рисунок был в gif я его конвертировал с помощью программы VectorMagic в eps. эта картинка у меня на рабочем столе, теперь я не знаю как её вставить. Вот на этом я остановился:
    \documentclass[a4paper,12pt,oneside]{scrartcl}
    \usepackage[english,russian]{babel}
    \usepackage[dvips]{graphicx}
    \graphicspath{{noiseimages/}}

    что дальше нужно сделать?
    Заранее благодарен.

    ОтветитьУдалить
  21. Использую сочетание Ubuntu->Kile, если делать как всё написано, но в конечном pdf-е boundingbox отрисовывается, однако картинки не отображаются.

    А тут всё проще надо просто в преамбулу документа там где писали \usepackage[dvips]{graphicx} добавить всего pdftex и получим
    \usepackage[dvips,pdftex]{graphicx}
    и будет Вам счастье. Только изображения должны быть в формате любом из png, pdf, jpg, mps, tif.
    Так как автор в начале статью указал, что будет рассматриваться драйвер dvips из пакета graphicx, потому и не было описание драйвера pdftex, который умеет вставлять рисунки в документы pdf.
    Дополнительно можно почитать Включение рисунков в LATEX2(автор Сюткин)

    ОтветитьУдалить
  22. "...После этого копируем полученный eps-файл в каталог..." \documentclass[a4paper,12pt,oneside]{scrartcl}
    \usepackage[english,russian]{babel}
    \usepackage[dvips]{graphicx}
    \graphicspath{{noiseimages/}}
    что дальше нужно сделать?
    Заранее благодарен.

    Указать путь к рисунку это строка
    \graphicspath{{noiseimages/}} где в фигурных скобках а unix стиле надо указать путь к рисунку.
    Например если рисунок на рабочем столе:
    С:/Document and Settings/admin/Рабочий стол/
    а потом как в статье описано.
    но лучше рисунок положить там где у Вас документ Latex.

    ОтветитьУдалить
  23. Подскажите, плз, с помощью какой приблуды можно в ЛаТеХе вставлять картинки фоновым изображением. Очень нужно. Наверное, это звучит жутким извращением, но нужно. Вот для плаката (постера) формата А0, к примеру. Ведь Ворд и ХТМЛ позволяют вставлять фоновое изображение... Наверное и ЛаТеХе есть такая возможность?

    ОтветитьУдалить
  24. Добрый день!
    У вас замечательное руководство, но вот я столкнулся с такой проблемой:
    Вставляя рисунки в статью, я размещал сначала метку, а потом рисунок. Выглядело это примерно так:
    \begin{figure}
    \label{fig:figure1}
    \includegraphics[width=1\linewidth]{fig1}
    \vskip-6mm
    \caption{Подпись к рисунку 1}
    \end{figure}

    Но получилось, что при такой расстановке LaTeX отображает совершенно неправильные номера рисунков в ссылках (\ref{fig:figure1}). Дело в том, что читая вашу статью, я нигде не встречал акцента на том, что положение метки внутри блока рисунка может как-то повлиять правильность нумерации. Поэтому очень долго возился и не мог понять, в чём ошибка.
    Почитав разные страницы в интернете по этому поводу попал, наконец на Wikibooks, где пишут, что метку обязательно располагать после "\caption"

    \begin{figure}
    \includegraphics[width=0.5\textwidth]{gull}
    \caption{Close-up of a gull}
    \label{fig:gull}
    \end{figure}

    или даже внутри "\caption"

    \caption{Close-up of a gull\label{gull}}

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

    Спасибо.

    ОтветитьУдалить
  25. Здравствуйте.
    Насколько я понимаю, ЕПС - это векторные изображения, которые получается достаточно корявыми, когда конвертируются из сложых картинок растровых джипегов.
    Поэтому вопрос: есть ли возможность напрямую по-человечески вставлять картинки в формате jpg(или bmp)?

    ОтветитьУдалить
  26. Вы правы, на тот вектор, что imagemagick делает из растра, луч не смотреть. Возможность, конечно же, есть: не нужно для пакета graphicx указывать никаких опций.

    Насчёт EPS: во всём виноват pdflatex, он плохо дружит с eps. Можно сконвертировать EPS в PDF утилитой epspdf из пакета texlive-pictures.

    ОтветитьУдалить
  27. Друзья, подскажите, пожалуйста. никак разобраться не могу (чайник в ЛаТеХе).
    Такой код:

    \begin{figure}[h]
    \center{\includegraphics[width=1\linewidth]{lalal}}
    \caption{график}
    \end{figure}

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

    Подскажите, в чем тут дело?

    Заранее Благодарен!

    ОтветитьУдалить
  28. Подскажите, пожалуйста, как можно обвести рамкой уже сделанный в паскале рисунок графика функции, нанести подписи осей координат и подписать деления на осях координат. Заранее благодарна. Екатерина.

    ОтветитьУдалить
  29. СПАСИБО ОГРОМНОЕ) Нигде не мог найти работающее обтекание)

    ОтветитьУдалить
  30. Спасибо.
    При посике ответов на вопросы ваша статья оказалась самой удачной.

    ОтветитьУдалить
  31. хорошая статья! подскажите пожалуйста как можно уйти от грубой силы \vspace{1cm}
    в формулах изменил. остались рисунки с подписями. задача - нужно чтобы была пустая строка до рисунка, между рисунком и подписью, и после подписи. теоретически нашел, что подпись можно отрегулировать
    \abovecaptionskip=2cm
    \belowcaptionskip=2cm
    но пока не заработало.

    ОтветитьУдалить
  32. Автор здесь.

    Пост обновил, убрал лирику, добавил про subfigure и wrapfigure.

    Quickern
    Ну и вопросики тут в комментариях задают. Товарищи, будьте добры, посмотрите в Львовском


    Жёлтая карточка: если бы во Львовском было всё так просто, поста бы не было. Там дофига того, что вообще никому не нужно. Комментарий снесён.

    @mkevac комментирует...
    Насколько хороши статьи, насколько воняют они своими "поставьте ссылку на оригинал".

    Меня достали идиоты, которые копипастят статьи и пишут под ними: "автор - вася пупкин". Но ссылки на оригинал убрал.

    Да, ещё добавил про subfigures.

    ОтветитьУдалить
  33. Методы создания рисунков у тебя… для диссертации, не меньше; для статей так поступать нельзя, ибо там «чем проще, тем лучше». LaTeX — это не MS Word, а умная и очень гибкая программа вёрстки, а ты рубишь с плеча, не даёшь LaTeX'у проявить себя. Везде только [h] и даже [H] — чтобы уж прибить, так прибить. Вначале осваиваются простые средства, философия LaTeX, а ты пишешь так, как будто без minipage ничего не получится, а от подобного увлечения minipage новичку — только вред.

    Скромно умолчал, что помимо позиций [h], [h!], [H] и [pH] есть ещё и другие. Там же указано, что для [H] нужет дополнительно пакет float. Рисунок внутри wrapfig может не только обтекаться справа/слева, там ещё какие-то хитрые опции.

    С кучей hspace и vspace, мне кажется, ты перемудрил, почему просто не использовать такие возможности includegraphics как trim? Ещё и окружение tabular зачем-то задействовал, хочешь задавить новичков силой интеллекта? Мне видится это лишним, ведь в minipage можно указать не только ширину, но и высоту. Загляни сюда — обнаружишь много полезного про окружения. Подписи в виде «ris:foo» немного режут глаз, общепризнанным считается «fig:foo». Отдельное спасибо за subfigure и то, что метку label на рисунок можно ставить после caption, я всё время помещал только внутрь: \caption{\label{fig:foo}}.

    За изменившуюся раскраску кода можно поблагодарить безмозглых идиотов из команды разработчиков KDE, убравших из Kwrite эту возможность.
    virens, сколько можно, Kwrite создан не для работы, а для красоты же! Другие редакторы работают с большими документы, от которых Kwrite уходит в себя. У тебя же есть vim, вот как раз поле для демонстрации его преимуществ, чтобы всякие имаксеры сильно не задавались.

    ОтветитьУдалить
  34. Подскажите, в чем может быть проблема. При вставке ссылки на рисунок (\ref{бла-бла-бла}) вместо ссылки появляются два "??". Положение \label менял внутри блока - без толку. Документы набираю большие и неудобно вспоминать, где и какой рисунок по номеру идет.

    ОтветитьУдалить
  35. @iv_vl

    LaTeX - это не MS Word, а умная и очень гибкая программа вёрстки
    Для набора диплома не нужна вся гибкость и мощь, и эта серия постов направлена именно на это. Я уже писал в комментах выше.

    За дополнительные ссылки спасибо.

    virens, сколько можно, Kwrite создан не для работы, а для красоты же!
    iv_vl, если я не пользуюсь Емаксом, как ты, это не означает, что я враг народа. У меня свои привычки и я не вижу смысла их менять.

    Kate/Kwrite созданы для работы с текстом - посмотри, пожалуйста, в Help-About. Там предельно ясно обозначено назначение этих программ. И я их использую именно по их прямому назначению - правлю в них текст.

    Разработчики КДЕ - идиоты, потому что они не делают то, что они должны. Разработчик должен создавать новые фичи и фиксить старые баги, а не заниматься хернёй вроде переписывания всего на QT4, попутно вышвыривая в окно половину функций КДЕшных программ.

    И не надо говорить, что "это опенсорс, детка, и тебе никто ничего не должен". Не можешь\не хочешь - не делай. Во всяком случае, не надо портить то, что хорошо работало, и нет, не надо переизобретать текстовый редактор.

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


    @Serzh_M комментирует...
    При вставке ссылки на рисунок (\ref{бла-бла-бла}) вместо ссылки появляются два "??".
    Это значит буквально то, что метка в \label{blah} и то, на что вы ссылаетесь \ref{блабла} не совпадают. Это бывает, если вы используете метки на других языках (вместо английской C в метке может быть русская), или используете неправильные символы (типа процентов, или пробелов).

    Скорее всего, вы поставили ссылку типа \label{blah }, а ссылаетесь на \ref{blah} <- пробела перед последней скобкой нет.

    ОтветитьУдалить
  36. Спасибо за совет, проблема решилась установкой миктеха с нуля вкупе с техстудио, ссылки только на английском были, и все заработало. Тут другая проблема накатилась, в полностью написанной лекции весь русский текст заменился на "?".

    ОтветитьУдалить
  37. Как убрать разрыв между картинкой и текстом?

    ОтветитьУдалить
  38. Здравствуйте. Не получается вставить 3 картинки в горизонтальный ряд с разными подписями. Необходимо чтобы у первых двух картинок была общая подпись, а у оставшейся третьей, отдельная подпись.

    ОтветитьУдалить
  39. >Естественно, что LaTeX - это язык программирования, так что все советы по грамотному написанию программ уместны и здесь.

    Это не язык программирования, это язык разметки!
    Банально, но по глазам резануло.

    И спасибо за статьи!

    ОтветитьУдалить
  40. Самая большая проблема - обтекание рисунков текстом. wrapfigure нормально работает если рисунков... ну... несколько. Если рисунков всего штук 20 и на каждой странице по паре-тройке то... все начинает расползаться ужасным образом. Диплом или диссер не требует обтекания, а автореферат и книжки - требуют. А тут наступает большой и пушистый упс, что ставит крест на идее использования Латеха для книжек.
    ---
    Второе - пусть два рисунка рядом, но подпись к одному занимает две строчки, а к другому три. Выравнивание идет по рисунку ВМЕСТЕ текстом - т.е. рисунки смещаются по вертикали, что неправильно.
    Как быть? Как жить?

    ОтветитьУдалить
  41. Здравствуйте! Спасибо за замечательное руководство. Столкнулась с такой же проблемой, как и Владимир постов 10 назад, но решения не увидела. Я конвертировала файл в eps ( а потом на всякий случай и обратно, чтобы убедиться, что правильная конвертация), подключила библиотеку \usepackage[dvips]{graphicx}, далее использую набор команд, указанные в самом начале статьи для вставки одного рисунка, только на месте image my_im.eps или просто my_im (пробовала и так и так), а также как в Львовском, а также без дополнительных опций после includegrafics перед названием изображения. Результат один и тот же - при конвертации в pdf на месте изображения пустое место. Что же делать? Буду очень благодарна за совет!

    ОтветитьУдалить
  42. очень полезная статья, спасибо

    ОтветитьУдалить
  43. Здравствуйте. Пытаясь вставить рисунок в техе получается постое место. Я его перевела в eps-формат и проверила GSView рисунок есть, а при вставке в текст что-то непонятное. Мой код следующий
    \begin{figure}[bh]
    \noindent\centering{
    \includegraphics[width=120mm]{pic1.eps}
    }
    \caption{ Геометрия спая: $0<r\le r_1$ - стекло и $r_1<r\le r_2$ - металл, пример спая сжатия с металлом}
    \label{pic1}
    \end{figure}
    Рисунка нет, а вот подпись есть. Что недо делать?

    ОтветитьУдалить
  44. Уберите расширение рисунка, напишите
    \includegraphics[width=120mm]{pic1}

    ОтветитьУдалить
  45. Добрый вечер. У меня та же проблема - рисунок при конвертации tex в pdf отсутствует. Проверял свои рисунки в esp, пытался включить из библиотеки TeX - результат отрицательный. Ссылка корректная, место под рисунок резервируется в соответствии с параметрами. В чем может быть еще загвоздка? И еще один вопрос - не центрируется подпись к рисунку. Спасибо.

    ОтветитьУдалить
  46. В добавление к предыдущему. Оказалось, что при обработке в MikTex-Texworks рисунки отсутствуют, а LaTex выдает все нормально. По поводу центрирования подписи к рисунку. Эта ситуация возникла при длинной подписи и пришлось воспользоваться \newline. В этом случае \centering не распространяется на подпись. В принципе ситуация не тупиковая - проблемы разрешимы. Спасибо за прекрасное руководство.

    ОтветитьУдалить