Date Редакция Категория comp Теги LaTeX / верстка
  • Если нужно просто вставить исходный код в документ, без подсветки синтаксиса, то выбирайте окружение verbatim.
  • Если нужна подсветка синтаксиса, и в комментариях не используется русский язык (а также другие нелатинские символы Unicode), выбирайте пакет listings.
  • Если нужно все и сразу, выбирайте пакет minted.

verbatim

Простейший способ — использовать окружение \begin{verbatim}...\end{verbatim}. Разумеется, подсветки синтаксиса при этом не будет. Для кода в строке используется "короткий verbatim", который удобно настроить с помощью пакета fancyvrb:

\documentclass{article}

\usepackage{fancyvrb}
\DefineShortVerb{\|}

\begin{document}
This is some inline code |for i=1;i<20;i++| and more \ldots
\end{document}

Управление размером шрифта в окружении verbatim (установлен \footnotesize):

\makeatletter
\def\verbatim{\footnotesize\@verbatim \frenchspacing\@vobeyspaces \@xverbatim}
\makeatother

listings

Гораздо больше возможностей для оформления исходного кода предоставляет пакет listings. Вот пример его использования:

\documentclass{article}
\usepackage{listings}             % Подключаем пакет listings
\begin{document}
\lstset{language=Pascal}          % Задаем язык исходного кода
\begin{lstlisting}                % Начало блока кода
for i:=maxint to 0 do
begin
{ do nothing }
end;
Write(’Case insensitive ’);
Write(’Pascal keywords.’);
\end{lstlisting}                  % Конец блока кода
\end{document}

Фрагмент кода внутри строки оформляется следующим образом

\lstinline$void itoa(int n, str *s)$

listings входит в состав пакета texlive-latex-recommended, и если вы уже установили TeX Live, то и listings у вас также установлен.

Более подробно о listings можно прочитать в: * Краткое руководство по listings (англ.) * Как оформить исходный код программ в LaTeX без адских страданий (рус.)

Проблема с UTF-8

При попытке вставить в код текст на кириллице (не в комментарий, а именно в код — текст должен был выводиться в графическом окне) было получено сообщение об ошибке вида:

Package inputenc Error: Unicode char \u8:�\lst@FillFixed@ not set up for use

При этом кодировка основного документа — UTF-8, что указано в преамбуле:

\documentclass[a4paper,12pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[russian,english]{babel}

Сообщения об ошибках исчезнут, если указать в настройках \lstset использование не-ASCII символов:

\lstset{extendedchars=\true}

Важно: именно \true, а не true, как указано, например, здесь.

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

minted

Для использования пакета minted нужно не только его подключить, но и использовать опцию -shell-escape при вызове latex (pdflatex).

Вставим в документ код на C++ шрифтом размера \footnotesize:

\usepackage{minted}
...
\begin{document}
...
\begin{minted}[fontsize=\footnotesize]{c++}
class Particle // класс частиц
{
protected:
    double inverseMass;
    Vector3 position;
    Vector3 velocity;
    Vector3 acceleration;

public:
    void integrate(double duration);
};
\end{minted}
...
\end{document}

и получим после трансляции

minted2.png

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

Для пользователей minted версии < 2.0

В minted 2.0 (01.2015) и выше эта проблема устранена.

Вот что получится, если обработать tex'ом представленный выше текст (не забудьте про опцию -shell-escape):

minted1.png

Для нормального отображения русских букв в преамбуле документа, после подключения minted, нужно поставить:

\makeatletter
\newcommand{\minted@write@detok}[1]{%
  \immediate\write\FV@OutFile{\detokenize{#1}}}%

\newcommand{\minted@FVB@VerbatimOut}[1]{%
  \@bsphack
  \begingroup
    \FV@UseKeyValues
    \FV@DefineWhiteSpace
    \def\FV@Space{\space}%
    \FV@DefineTabOut
    %\def\FV@ProcessLine{\immediate\write\FV@OutFile}% %Old, non-Unicode version
    \let\FV@ProcessLine\minted@write@detok %Patch for Unicode
    \immediate\openout\FV@OutFile #1\relax
    \let\FV@FontScanPrep\relax
%% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures)
    \let\@noligs\relax
%% DG/SR modification end
    \FV@Scan}
    \let\FVB@VerbatimOut\minted@FVB@VerbatimOut

\renewcommand\minted@savecode[1]{
  \immediate\openout\minted@code\jobname.pyg
  \immediate\write\minted@code{\expandafter\detokenize\expandafter{#1}}%
  \immediate\closeout\minted@code}
\makeatother

Теперь все будет работать.

Еще раз напомню, в версиях minted > 2.0 все работает "из коробки".

Оформление листингов в виде рисунков

Для этого поместим листинг, оформленный с помощью minted в окружение figure:

\begin{figure}[h]
\begin{center}
\begin{minted}[fontsize=\footnotesize]{c++}
class Particle
{
 ...
};
\end{minted}
\end{center}
\caption{Фрагмент кода класса Particle}
\label{fig:particle}
\end{figure}

Картинка-листинг будет выровнена по левому краю страницы

minted3.png

Для выравнивания по центру нужно поставить в преамбуле документа:

\RecustomVerbatimEnvironment{Verbatim}{BVerbatim}{}

Короткое имя и настройка макросов

Чтобы не писать всякий раз

\begin{minted}[fontsize=\footnotesize]{c++}
...
\end{minted}

или нечто подобное, можно ввести собственное название для макросов вставки кода на заданном языке с заданными настройками. Делается это при помощи команды \newminted:

\newminted[имя_макроса]{язык}{настройки отображения кода}

Например, указав в преамбуле документа

\newminted[mycode]{c++}{fontsize=\footnotesize}

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

\begin{mycode}
...
\end{mycode}

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

\newminted[mycode]{c++}{}

Код внутри строки текста

Чтобы вставить код прямо в строку текста, используем команду \mintinline

\mintinline{perl}{my $foo = $bar;}

Действует она подобно \verb.

Для настройки \mintinline есть своя команда \newmintinline, аналогичная \newminted:

\newmintinline[имя_макроса]{язык}{настройки отображения кода}

Например, создадим новое окружение для вставки Perl-кода:

\newmintinline[perl]{perl}{}

Вот как это работает:

Текст \perl/my $foo = $bar;/ снова текст.

mintinline.png

Какие языки поддерживает minted

Узнать, какие языки поддерживает minted можно, набрав в командной строке

pygmentize -L lexers

На данный момент таких языков более 300.



Комментарии

comments powered by Disqus