- Если нужно просто вставить исходный код в документ, без подсветки синтаксиса, то выбирайте окружение
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}
и получим после трансляции
Впрочем, если вы используете старую версию minted
, а в программе встречаются нелатинские символы Unicode, то возникнут некоторые проблемы. Пусть и совсем небольшие. Посмотрим, как их преодолеть. Пользователи minted
2.0 и выше могут пропустить следующий пункт.
Для пользователей minted версии < 2.0
В minted 2.0 (01.2015) и выше эта проблема устранена.
Вот что получится, если обработать tex'ом представленный выше текст (не забудьте про опцию -shell-escape
):
Для нормального отображения русских букв в преамбуле документа, после подключения 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}
Картинка-листинг будет выровнена по левому краю страницы
Для выравнивания по центру нужно поставить в преамбуле документа:
\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;/ снова текст.
Какие языки поддерживает minted
Узнать, какие языки поддерживает minted
можно, набрав в командной строке
pygmentize -L lexers
На данный момент таких языков более 300.
Комментарии
comments powered by Disqus