Может ли пакет листингов автоматически делать отступы в исходном коде?

Может ли пакет листингов автоматически делать отступы в исходном коде?

Пакет 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}

Связанный контент