O pacote de listagens pode recuar automaticamente o código-fonte?

O pacote de listagens pode recuar automaticamente o código-fonte?

O listingspacote destaca automaticamente palavras-chave no código-fonte e faz com que tenha uma boa aparência. É possível recuar automaticamente o programa? Por exemplo, em listings, se o código a seguir for digitado,

#include<stdio.h>
void main()
{
printf("\n Hello World");
}

a saída deve ser

#include<stdio.h>

void main()
{
    printf("\n Hello World");
}

Posso listingsfazer isso e, em caso afirmativo, como devo configurá-lo?

Responder1

O listingspacote fornece essa funcionalidade; consulte a subseção 5.6 do manual. Certifique-se de que o formatsaspecto esteja carregado, o que pode ser feito passando formatscomo uma opção de pacote para listings,

\usepackage[formats]{listings}

ou usando a \lstloadaspectsmacrodepoiscarregando o listingspacote,

\usepackage{listings}
...
\lstloadaspects{formats}

Em seguida, use a \lstdefineformatmacro para definir um "formato", ou seja, instruções sobre o que listingsdeve ser feito ao encontrar determinados caracteres. A definição de formato mostrada abaixo foi retirada diretamente do manual.

Esteja ciente de que esse recurso permanece experimental; de acordo com o manual,

A formatação automática do código-fonte está longe de ser boa. Em primeiro lugar, não existem regras gerais sobre como o código-fonte deve ser formatado. Portanto, as 'definições de formato' devem ser flexíveis. Essa flexibilidade requer uma interface complexa, um poderoso analisador de 'definição de formato' e muitas linhas de código nos bastidores. Atualmente, as definições de formato não são flexíveis o suficiente (possivelmente não as definições, mas os resultados).

Saída

\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}

informação relacionada