листинг кода в latex
Оформление исходного кода в документах LaTeX
verbatim
Простейший способ — использовать окружение \begin
Управление размером шрифта в окружении verbatim (установлен \footnotesize ):
listings
Фрагмент кода внутри строки оформляется следующим образом
Проблема с UTF-8
При попытке вставить в код текст на кириллице (не в комментарий, а именно в код — текст должен был выводиться в графическом окне) было получено сообщение об ошибке вида:
При этом кодировка основного документа — UTF-8, что указано в преамбуле:
Сообщения об ошибках исчезнут, если указать в настройках \lstset использование не-ASCII символов:
Однако при этом остается проблема с русскоязычными комментариями, в которых слова оказываются склеены. Окончательно решает эту проблему следующий пакет.
minted
Вставим в документ код на C++ шрифтом размера \footnotesize :
и получим после трансляции
Теперь все будет работать.
Еще раз напомню, в версиях minted > 2.0 все работает «из коробки».
Оформление листингов в виде рисунков
Для этого поместим листинг, оформленный с помощью minted в окружение figure :
Картинка-листинг будет выровнена по левому краю страницы
Для выравнивания по центру нужно поставить в преамбуле документа:
Короткое имя и настройка макросов
Чтобы не писать всякий раз
или нечто подобное, можно ввести собственное название для макросов вставки кода на заданном языке с заданными настройками. Делается это при помощи команды \newminted :
Например, указав в преамбуле документа
мы сможем использовать для вставки кода новое окружение mycode
Заметим, что даже если вы не задаете никаких настроек, а просто хотите переопределить имя макроса, пустые скобки, обозначающие место вставки настроек, должны присутствовать
Код внутри строки текста
Чтобы вставить код прямо в строку текста, используем команду \mintinline
Например, создадим новое окружение для вставки Perl-кода:
Вот как это работает:
Какие языки поддерживает minted
Узнать, какие языки поддерживает minted можно, набрав в командной строке
На данный момент таких языков более 300.
Читайте также
Комментарии
Дмитрий Храмов
Компьютерное моделирование и все, что с ним связано: сбор данных, их анализ, разработка математических моделей, софт для моделирования, визуализации и оформления публикаций. Ну и за жизнь немного.
Записки разработчика
Страницы
вторник, 14 января 2014 г.
minted: Оформляем исходный код в LaTeX
Помнится, ещё на студенческой скамье я встречал задачу оформления исходного кода в LaTeX. В ту пору я использовал пакет listings. И я страдал. О, как же я страдал! Русские буквы не хотели дружить с UTF-8, а глаза мои текли кровавыми слезами при взгляде на итоговое форматирование. И вот, вновь я встретился с этой тяжёлой задачей. В поисках решения я наткнулся на замечательный пост в записках дебианщика Как оформить исходный код программ в LaTeX без адских страданий. Название подсказывало мне, что развлечение это не простое. Я аккуратно перепробовал все рецепты из статьи, но ни один меня не устроил. И в самом конце поста я обнаружил ссылку на замечательный пакет minted, который должен был положить конец моим страданиям.
Пакет minted базируется на Python-овской библиотеке Pygments, которая умеет на отличненько раскрашивать код, поддерживается около 300 разных языков и форматов разметки. Для начала нам понадобится её установить (предполагаем, что Python и easy_install уже имеются):
Переходим в любимый LaTeX-редактор и начинаем писать код (опять-таки предполагаем, что версия нашего LaTeX-дистрибутива включает пакет minted и все его зависимости):
Проблемы возникнут, если мы захотим в UTF-8 кодировке использовать русские буквы. Но мне удалось найти другой замечательный пост, в котором приводилось немного магии в преамбуле для поддержки кириллицы. Оттранслируем следующий файл:
И возрадуемся появлению русских букв:
Пакет содержит большое количество опций для стилизации листингов: можно добавить рамку, номера строк и кучу прочих вкусностей.
Больше информации вы найдёте на GitHub-е и в документации
LaTeX/Source Code Listings
Help and Recommendations
Contents
Using the listings package [ edit | edit source ]
Using the package listings you can add non-formatted text as you would do with \begin < verbatim >but its main aim is to include the source code of any programming language within your document. If you wish to include pseudocode or algorithms, you may find Algorithms and Pseudocode useful also.
To use the package, you need:
The listings package supports highlighting of all the most common languages and it is highly customizable. If you just want to write code within your document the package provides the lstlisting environment:
Another possibility, that is very useful if you created a program on several files and you are still editing it, is to import the code from the source itself. This way, if you modify the source, you just have to recompile the LaTeX code and your document will be updated. The command is:
in the example there is a Python source, but it doesn’t matter: you can include any file but you have to write the full file name. It will be considered plain text and it will be highlighted according to your settings, that means it doesn’t recognize the programming language by itself. You can specify the language while including the file with the following command:
You can also specify a scope for the file.
This comes in handy if you are sure that the file will not change (at least before the specified lines). You may also omit the firstline or lastline parameter: it means everything up to or starting from this point.
This is a basic example for some Pascal code:
Supported languages [ edit | edit source ]
It supports the following programming languages:
For some of them, several dialects are supported. For more information, refer to the documentation that comes with the package, it should be within your distribution under the name listings-*.dvi.
Settings [ edit | edit source ]
You can modify several parameters that will affect how the code is shown. You can put the following code anywhere in the document (it doesn’t matter whether before or after \begin < document >), change it according to your needs. The meaning is explained next to any line.
There are many more options, check the official documentation.
Style definition [ edit | edit source ]
The package lets you define styles, i.e. profiles specifying a set of settings.
In our example, we only set two options globally: the default style and the escape character. Usage:
The C part will print as
Automating file inclusion [ edit | edit source ]
If you have a bunch of source files you want to include, you may find yourself doing the same thing over and over again. This is where macros show their real power.
In this example, we create one command to ease source code inclusion. We set the default style to be customc. All listings will have their name as caption: we do not have to write the file name twice thanks to the macro. Finally we list all listings with this command from the listings package.
See Macros for more details.
Encoding issue [ edit | edit source ]
By default, listings does not support multi-byte encoding for source code. The extendedchar option only works for 8-bits encodings such as latin1.
To handle UTF-8, you should tell listings how to interpret the special characters by defining them like so
The above table will cover most characters in latin languages. For a more detailed explanation of the usage of the literate option check section 5.4 in the Listings Documentation.
Customizing captions [ edit | edit source ]
The minted package [ edit | edit source ]
minted is an alternative to listings which has become popular. It uses the external Python library Pygments for code highlighting, which as of February 2021 boasts over 500 supported languages and text formats.
As the package relies on external Python code, the setup require a few more steps than a usual LaTeX package, so please have a look at their GitHub repo and their manual.
References [ edit | edit source ]
A lot more detailed information can be found in a PDF by Carsten Heinz and Brooks Moses.
Details and documentation about the Listings package can be found at its CTAN website.
Записки дебианщика
В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.
Как оформить исходный код программ в LaTeX без адских страданий
Иногда в документ LaTeX нужно вставить кусок программного кода или псевдокод, поясняющий алгоритм. В зависимости от языка программирования и целей, подсветка кода в LaTeX достигается подключаемыми пакетами расширений разной степени кривизны и безумия документации.
cblas_dgemv(CblasRowMajor, CblasNoTrans, 3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);
Просто, дёшево, сердито и безболезненно.
А вот для него код:
Как оформить псевдокод в LaTeX?
Часто приводить дословно исходный код программы не требуется, но нужно пояснить общий ход алгоритма псевдокодом. Для оформления псевдокодов и алгоритмов наиболее вменяемый пакет называется algorithm2e доступный отсюда.
Скачиваем стилевой файл algorithm2e.sty и прописываем его в преамбуле документа:
Вот как выглядит алгоритм, оформленный пакетом algorithm2e::
\begin < algorithm >[H]
\SetAlgoLined %% Это соединяет линиями логические части
%% алгоритма типа if-then-else
\KwData < experiment.data>%% здесь можно указать исходные параметры
\KwResult < output, xoptimal >%% результат работы программы
// Step lenght computation: %% это комментарий, который будет виден.
// Compute the termination constant %% это комментарий, который будет виден.
И вот что мы увидим в документе:
Для примера вставим исходный код программы на С в документ LaTeX с помощью listings.
Сначала правим преамбулу документа:
\usepackage
\usepackage
\usepackage
%% код ниже нарисует серую рамочку вокруг заголовка кода.
\DeclareCaptionFormat
\captionsetup [lstlisting]
Теперь уже внутри документа настраиваем вид оформление исходника программы на С. Здесь я привёл основные параметры с пояснениями, что они делают:
Вставляем приведённые выше заклинания в тело документа и после этого куска кода вставляем, собственно, оформление исходника:
\begin < lstlisting >[label=some-code,caption=Some Code]
int main(void) // main routine
<
int i, j; // Initialisation of counters
// The code below prints the 3×3 matrix
for (i=0; i
for (j=0; j
putchar(‘\n’);
>
cblas_dgemv(CblasRowMajor, CblasNoTrans,
3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);
Это всё должно скомпилироваться и выдать следующий результат:
предложенный здесь (в комментариях), но listings не работает нормально с русским текстом, состоящим более, чем из одного слова
Зато listings работает с олдскульной и ортодоксальной koi8-r. Для это вставляем в преамбулу:
\usepackage [T2A]
\usepackage [koi8-r]
\renewcommand <\lstlistingname>
и далее меняем оформление исходника на это:
\begin < lstlisting >[label=some-code,caption= ]
int main(void) // главная программа
<
int i, j; // инициализация счётчиков
// Сей код множит матрицу величиною 3×3
for (i=0; i
for (j=0; j
putchar(‘\n’);
>
// Вызов басурманской библиотеки BLAS
cblas_dgemv(CblasRowMajor, CblasNoTrans,
3, 3, 1.0, m, 3, x, 1, 0.0, y, 1);
// Подаём челобитную на экран
for (i=0; i
В итоге мы получим кириллизованный фрагмент кода:
Нашедшие рабочий рецепт с listings и комментариями на русском в utf8 приглашаются им поделиться в комментариях.
Итоги дискуссии по оформлению программного кода с русскими комментариями в listings: решение в использовании команд escapechar= или конвертацией документа в koi8/cp1251. Больше подробностей по этим ссылкам. Спасибо Роману Химову и Alexanius за ценные замечения в комментариях.
Тем не менее, listings, хотя и не идеален, но представляет собой наиболее гибкое решение.
Альтернативы
Есть и другие способы добиться от LaTeX большой и чистой любви раскраски и подсветки исходного кода.
То есть раскрасить исходный код из файла и выдать в теховский файл code.tex для вставки в документ. Выхлоп source-highlight выглядит вот так:
В общем, запасайтесь дьяволы гробами. Выглядит результат вот так:
В целом, это костыль, конечно, но он, скажем так, работает.
32 комментариев: |высказаться!| RSS-лента дискуссии.|
В описании mcode, не рисунке красуется заглавие «MATAB Code», так и задумано?
Джигиты используют listings, который не только не поддерживает раскраску некоторых современных языков (виват, JavaScript!), но и с кириллицей почти никак. Тем не менее, приведу свои параметры:
inputencoding=utf8, extendedchars=\true, keepspaces=true
Теперь шнапс с тебя, или что вы там пьёте в иноземье 😉
Есть такой хороший пакет alltt, который дает окружение alltt, которое лично я для кода использую вместо verbatim, поскольку в нем можно выделять цветом, жирным и т.д., тогда как переносы строк и пробелы вполне «вербатимные». Лично мне это удобнее, чем то, что автоматом делает listings. И с русским языком никаких проблем.
Для решения проблемы listing с пробелами перенес код в отдельные файлы и преобразовал их в cp1251. При этом нужно в lstset указать кодировку:
inputencoding=cp1251
а код добавлять командой:
\lstinputlisting
@iv_vl комментирует…
В описании mcode, не рисунке красуется заглавие “MATAB Code”, так и задумано?
Джигиты используют listings
Да это-то понятно: джигиты они и на С напишут раскраску. Документация у пакета, скажем мягко, писана давно и неправда.
не поддерживает раскраску некоторых современных языков (виват, JavaScript!)
Ху из ит, Дринкинс?! 🙂 Да разве это язык, чтоб его ещё поддерживать? Там вон маркдаун-то не все поддерживают (Kate не знает), а тут какой-то яваскрипт….
Только тормозит minted, ибо дергает внешнюю прогу на питоне.
внешнюю прогу на питоне.
Теперь шнапс с тебя, или что вы там пьёте в иноземье 😉
А за что шнапс-то? Ты давай выкладывай на своём мегапортале про minted, и как ты всё это делал. С примерами. А то ишь, заскочил, посветил издалека костылями на питоне и уж ему тут шнапс наливай. Реквестирую руководство к действию по Pygment и minted для солдат и беременных женщин 🙂
@Иван Шихалев комментирует…
Есть такой хороший пакет alltt, который дает окружение alltt, которое лично я для кода использую вместо verbatim
О, это ценное замечание. Надо бы его в пост воткнуть.
Лично мне это удобнее, чем то, что автоматом делает listings.
Проблема listings в том, что это большая помойка: оно много чего может, но мало кто знает, как от него этого добиться. А кто знает, тот молчит и посылает в маны. А там посылают ещё дальше.
Если серьёзнее, то да: с юникодом есть проблемы, часто приходится втыкать кои8, чтобы оно заработало. Хотя мне чаще всего приходится писать на latin1, а там всё работает.
P.S> Норма по троллингу выполнена, к конструктивным дебатам готов 🙂
About listings and Russian:
\usepackage
\lstinputlisting
@virens комментирует.
> (виват, JavaScript!)
Ху из ит, Дринкинс?! 🙂 Да разве это язык, чтоб его ещё поддерживать?
Табличка «сарказм» где? Или дебианщики настолько суровы, что отключают JavaScript при входе в Gmail? В listings и Python нету, удачи с ним!
Не дОлжно требовать сторонних костылей (и на пистоне!) для такой простой вещи.
Ты уже нашёл способ подружить TeX’овские варианты с кириллицей и утаиваешь эту волшебную таблетку от нас? Вывод listings для более-менее объемного текста на русском заставлял меня ругаться очень нехорошими словами. Ты книгу Кнута «Всё про TeX» читал? А я читал, и считаю, что на нём писать могут только ну очень большие энтузиасты.
> на питоне.
Ну ты понял, да? 🙂
Один раз прогнать так, чтобы научник прибалдел, будет достаточно.
> alltt, которое лично я для кода использую вместо verbatim
О, это ценное замечание. Надо бы его в пост воткнуть.
Михаил, только распиши, что там к чему, а то по листку документации я ничего не понял.
А кто знает, тот молчит и посылает в маны.
Ты не поверишь. но в манах написано всё, что он умеет.
@Иван Шихалев комментирует.
@Yaroslav Klyuyev комментирует.
About listings and Russian
Hmm. Yaroslav, the problem is that \usepackage
Furthermore, in my case it doesn’t work at all. Apparently, I’m not the only one, and the solution there is far from obvious.
Anyway, thanks for sharing.
BTW, your Google+ page consumes enormous bandwidth for some reason.
@iv_vl комментирует.
Табличка «сарказм» где?
Еда! 🙂 Извини, я не мог удержаться.
Вывод listings для более-менее объемного текста на русском
В общем, да это проблема. Я стараюсь не писать код с кириллическими комментариями. Ярослав выше присоветовал listingsutf8, но работает оно, скажем так, не очень. У меня, например, оно с комментариями на русском в питоновском скрипте не заработало.
И да, Йоханес Браамс (автор alltt) там жжот глаголом, аж на целых две страницы:
This package defines the alltt environment, which is like the verbatim environment except that \, <, and >have their usual meanings.
their usual meanings.
Ну мы поняли всё. Как и название пакета, которое хорошо вписывается в опенсорц-стиль, вместе с cdparanoia, brainfuck, qtpfsgui, pornview и gimp.
Ты не поверишь. но в манах написано всё, что он умеет.
Дык, отец, в том и проблема: там всё написано, но этого так много, и оно свалено в такую кучу, что разобраться в этом получается не сразу.
стиль подачи поста оценил 🙂 автору респект
слава богу, мне пока с LaTeX-ом не приходилось сталкиваться…)
Пожалуйста. Пост на самом деле был готов неделю назад, и написан сравнительно быстро (мне тут пришлось для публикации выискивать оформление кода).
Только вот, наверное, стоит подправить
Да, поправил. Спасибо.
Плюс к тому плюшки от UTF-8 в связке с minted, плюс которого
. знаешь только ты 🙂
слава богу, мне пока с LaTeX-ом не приходилось сталкиваться
Он не так страшен, как ты думаешь. В основном беда из-за расширений, которые налабали нерадивые скубенты и прочая школота (beamerposter, listings, moderncv. ). А так оно rock solid. Вон я даже всю систему GTD в нём реализовал.
Пост ещё немного поправлен, убраны очепятки и немного лирики.
Касательно lstlistings. Мне удалось получить примерно такой результат с utf8. Т.е. единственной проблемой осталась кривая подсветка синтаксиса, но если всё делать одним цветом, то сойдёт. Если в кратце, то добился этого так:
\lstset
columns=fullflexible,
flexiblecolumns,
numbers=left,
numberstyle=<\footnotesize>,
extendedchars=\true
>
\lstdefinelanguage
language=C,
ndkeywordstyle=\color
identifierstyle=\color
morecomment=[n]**><*/>,
commentstyle=\color
stringstyle=\color
morestring=[b]»,
showstringspaces=false,
morecomment=[l][\color
keepspaces=true,
escapechar=\%,
texcl=true
>
Вообще через escapechar можно отдавать куски на обработку латеху
например выделить строки курсивом и окружить кавычками:
\lstset
Latex, кириллица и listings. Кажется, было здесь:
http://roman.khimov.ru/2011/05/19/latex-listings-cyrillic/
[OpenID чего-то не захотел работать для «подписи»]
Пытался делать таким способом, не получилось. Мои потуги есть здесь если что.
@alexanius: Если проблема именно в цвете, то в моём специфичном случае он не был нужен, поэтому я проблемы с цветом не увидел. Касаемо однобайтности, в стандартном латехе, ЕМНИП, всё равно шрифты выходят однобайтные, поэтому работает при использовании utf8 на входе и шрифтах T2A. Это уже в XeTeX полноценный ввод-вывод юникодный.
@Анонимный комментирует.
Вообще через escapechar можно отдавать куски
Анонимус, это вообще-то костыли, к которым хотелось бы не прибегать вообще. Тем не менее, спасибо, что поделился.
@Роман комментирует.
Latex, кириллица и listings.
Странно, я этот пост проморгал, хотя на твой фид подписан.
[OpenID чего-то не захотел работать для «подписи»]
Обычно он работает.
Итоги дискуссии по оформлению программного кода с русскими комментариями в listings: решение в использовании команд escapechar= или конвертацией документа в koi8/cp1251.
И еще, как ты подписи от руки делал на примере с alltt? Моя хотеть уметь так же.
Решение чего? С моими параметрами (см. выше) listings испытывает проблемы с многострочными комментариями
Решение проблемы вставки кириллицы в комментариях кода. Частичное, хотя бы.
Хотелось бы экшена
В посте же есть. Потом, я ж не Сильвестр Сталоне чтоб тут базукой размахивать и экшн доставлять 🙂
По теме alltt: у автора оного творения не хватило мозгов проверить это даже на Си, где оно не работает вообще. Можно было бы придумать что-то пооригинальнее, и чтобы оно код не жевало.
Магия LaTeX: замени putchar(‘\\n’) на putchar(‘\textbackslash<>n’).
Я как бы в курсе, но вот это и есть жуткий костыль. Не дОлжно править код, оно должно быть as is.
И еще, как ты подписи от руки делал на примере с alltt? Моя хотеть уметь так же.
Патентованный метод, 500 баксов роялти в кассу 🙂
На самом деле это сделано в Gimp с помощью стилуса моего ноутбука с тачскрином. Латеховский выхлоп конвертим в PS, открываем Гимп и рисуем. Ручная работа! %-)
У вас какие-то специфичные проблемы дебианщиков, чини локаль. УМВР, локаль UTF-8, inputencoding указана та же.
по крайней мере КДЕ4, которое в Сквизи, тупо не работает. [еда]
Увы, нет еды. Gentoo и KDE 4.9.3 просто работают.
МПо теме alltt: у автора оного творения не хватило мозгов проверить это даже на Си, где оно не работает вообще.
С какой стати проверять на Си? Это ведь не пакет для подсветки синтаксиса, не listings, а простой verbatim с плюшками. Поведение пакета alltt предсказуемо, LaTeX код внутри интерпретируется как положено. Всё, большего не надо.
KDE 4.9.3
.
просто работают
Мда. Надо было дожить до беты ПЯТОЙ версии Qt, чтобы KDE ПРОСТО заработало (впрочем это не может не радовать)!
А по теме, спасибо автору, самому намедни пришлось поколупаться со вставкой кода в LaTeX, моим решением данной проблемы оказался тупой и незатейливый PrintScreen (да-да, начинаем дружно показывать пальцем и ржать в голос), в оправдание таких топорных методов могу сказать лишь, что кусочек кода был небольшим, кусочек времени еще меньше, а почти все остальное было уже готово.
@iv_vl комментирует.
Это ведь не пакет для подсветки синтаксиса, не listings, а простой verbatim с плюшками.
ОК, согласен.
[И да, ссылочку на свой мегапортал в readme на гитхабе я бы очень попросил поставить.]
Кстати, я добавил ещё немножко ссылок в конец поста.
@virens комментирует.
iv_vl, реквестирую описание minted в твоём неподражаемом исполнении («для настоящих мужЫков»)
Хотелось бы научить minted понимать явное указание кодировки, поскольку по умолчанию Pygments использует latin1, и кириллические комментарии в пролете. Уже появилать возможность указать кодировку в Pygments, но в minted ее не включили. Призываются в комментарии специалисты по TeX’y. Я читал «Все про TeX», поэтому, возможно, управлюсь сам (но времени нужно больше), вот тогда будет описание «для настоящих мужЫков».
Воссоздал minted на GitHub, посмотрим, что выйдет.
Расскажите, как выделять цветом в пакете altt? И вопрос, есть ли возможность какая-нибудь подружить mcode с русским языком?
Ссылки для algorithm2e пакета ведут на 404.
@Рома комментирует.
Расскажите, как выделять цветом в пакете altt?
И вопрос, есть ли возможность какая-нибудь подружить mcode с русским языком?
I write all my documents in English, therefore, I don’t really care.
@Ruslan Kiianchuk комментирует.
Ссылки для algorithm2e пакета ведут на 404.
Там оно работает. В других версиях не проверял.
Оказалось, что связка «minted + UTF-8 + русские буквы» делается не совсем очевидно. Для этого нужно добавить немного магии в преамбулу.
Очень интересная статья, но мне бы что-нибудь попроще, я с латехом недавно знаком 🙂 Верстаю книжку на околоматематическую тему, и в тексте часто встречаются примеры разных задачек. Хочется их оформить красиво, чтобы в рамочке и в уголке подпись «пример № такой-то», и ещё чтобы всё это не было ограничено одной страницей. Не подскажете, как реализовать такое попроще?