Date Редакция Категория comp Теги LaTeX / beamer

Как оформлять исходный код в документах LaTeX описано на этой странице. Здесь мы рассматриваем особенности представления кода в презентациях.

Используем опцию fragile

Если вы хотите разместить на слайде исходный код программы или другой дословный (verbatim) текст, то нужно указать для этого слайда опцию fragile. Для окружения verbatim это выглядит так:

\begin{frame}[fragile]{Код}
\begin{verbatim}
#include <stdio.h>

int main()
{
  printf("Hello, world!\n");
}
\end{verbatim}
\end{frame}

Для пакета listings:

\lstset{language=C}
...
\begin{frame}[fragile]{Код}
\begin{lstlisting}
#include <stdio.h>

int main()
{
  printf("Hello, world!\n");
}
\end{lstlisting}
\end{frame}

Для пакета minted:

\begin{frame}[fragile]{Код}
\begin{minted}[fontsize=\footnotesize]{c}
#include <stdio.h>

int main()
{
  printf("Hello, world!\n");
}
\end{minted}
\end{frame}

Команду \end{frame} нужно обязательно поместить в следующей строке после \end{verbatim} или подобных ей команд. Это связано с особенностью современной реализации verbatim, которая состоит в том, что текст, следующий за \end{verbatim} в той же строке, полностью игнорируется. Если этим текстом окажется \end{frame}, то LaTeX выдаст сообщение об ошибке, означающее отсутствие закрывающей скобки:

! File ended while scanning use of \next.

\end{frame} должно располагаться в начале строки, и после него в той же строке нельзя размещать код или комментарии.

Масштабирование размеров кода

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

Резон в этом есть. Тем не менее, могут возникнуть ситуации, когда от этого правила лучше отступить. Например, если исходный код лишь слегка не помещается на слайд, а разбивать его на два слайда нет логических оснований. Или когда нужно выделить более крупно какой-то фрагмент кода. Все эти задачи можно решить без привлечения возможностей beamer. Основных путей решения здесь два:

  1. изменить размер шрифта кода в настройках minted или listings;
  2. масштабировать фрагмент кода.

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

Команды масштабирования \scalebox и \resizebox из пакета graphics не работают с окружениями verbatim, а именно через такие окружения реализовано представление исходного кода. Вместо них существует окружение adjustbox из одноименного пакета, специально предназначенного для работы с verbatim. Выглядит оно так:

\begin{adjustbox}{width=ширина,height=высота,keepaspectratio}
  code
\end{adjustbox}

Необязательная опция keepaspectratio позволяет сохранить пропорции при масштабировании.

Пример совместного использования adjustbox и listings:

\documentclass{beamer}
\usepackage{listings}
\usepackage{adjustbox}

\begin{document}

\newlength\someheight
\setlength\someheight{2cm}

\begin{frame}[fragile]
    \frametitle{Source File}
    \begin{adjustbox}{width=\textwidth,height=\someheight,keepaspectratio}
    \begin{lstlisting}
      #include <stdio.h>

      int main()
      {
        printf("Hello, world!\n");
      }
    \end{lstlisting}
    \end{adjustbox}
\end{frame}

\end{document}

Управляя размером \someheight, мы задаем тот или иной масштаб отображения кода.

При использовании пакета minted нужно дополнительно поместить оформленный с его помощью код в окружение minipage. В остальном идея остается та же

\documentclass{beamer}

\usepackage{minted}
\usepackage{adjustbox}

\begin{document}

\newlength\someheight
\setlength\someheight{3cm}

\begin{frame}[fragile]
  \frametitle{Blah}
  \begin{adjustbox}{width=\textwidth,height=\someheight,keepaspectratio}
    \begin{minipage}{\linewidth}
      \begin{minted}[fontsize=\footnotesize]{c}
        #include <stdio.h>

        int main()
        {
          printf("Hello, world!\n");
        }
      \end{minted}
    \end{minipage}
  \end{adjustbox}
\end{frame}

\end{document}

— варьируя \someheight управлять масштабом отображения. Естественно, в качестве изменяемого размера можно было использовать ширину, а также оба размера одновременно.



Комментарии

comments powered by Disqus