Пакет listings
автоматически выделяет ключевые слова в исходном коде и делает его красивым. Возможно ли автоматически сделать отступ в программе? Например, в listings
, если ввести следующий код,
#include<stdio.h>
void main()
{
printf("\n Hello World");
}
выход должен быть
#include<stdio.h>
void main()
{
printf("\n Hello World");
}
Можно ли listings
это сделать, и если да, то как это настроить?
решение1
Пакет listings
предоставляет эту функциональность; см. подраздел 5.6 руководства. Убедитесь, что formats
аспект загружен, что можно сделать, передав его formats
как опцию пакета в listings
,
\usepackage[formats]{listings}
или с помощью \lstloadaspects
макросапослезагрузка listings
пакета,
\usepackage{listings}
...
\lstloadaspects{formats}
Затем используйте \lstdefineformat
макрос для определения "формата", т.е. инструкций о том, что listings
следует делать при обнаружении определенных символов. Определение формата, показанное ниже, взято прямо из руководства.
Имейте в виду, что эта функция остается экспериментальной; согласно руководству,
Автоматическое форматирование исходного кода далеко от хорошего. Во-первых, нет общих правил того, как должен форматироваться исходный код. Поэтому «определения формата» должны быть гибкими. Эта гибкость требует сложного интерфейса, мощного парсера «определения формата» и множества строк кода за кулисами. В настоящее время определения формата недостаточно гибкие (возможно, не определения, а результаты).
\documentclass{article}
\usepackage[formats]{listings}
\lstdefineformat{C}
{
\{=\newline\string\newline\indent,%
\}=\newline\noindent\string\newline,%
;=[\ ]\string\space,%
}
\lstset{basicstyle=\ttfamily}
\usepackage{filecontents}
\begin{filecontents*}{sample.c}
#include<stdio.h>
void main()
{
printf("\n Hello World");
}
\end{filecontents*}
\begin{document}
\section*{``Raw'' listing}
\lstinputlisting{sample.c}
\section*{With automatic formatting}
\lstinputlisting[format=C]{sample.c}
\end{document}