¿Puede el paquete de listados sangrar automáticamente el código fuente?

¿Puede el paquete de listados sangrar automáticamente el código fuente?

El listingspaquete resalta automáticamente las palabras clave en el código fuente y lo hace lucir agradable. ¿Es posible sangrar automáticamente el programa? Por ejemplo, en listings, si se escribe el siguiente código,

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

la salida debe ser

#include<stdio.h>

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

¿Puedo listingshacer eso y, de ser así, cómo debo configurarlo?

Respuesta1

El listingspaquete proporciona esa funcionalidad; consulte la subsección 5.6 del manual. Asegúrese de que el formatsaspecto esté cargado, lo que se puede hacer pasando formatscomo opción de paquete a listings,

\usepackage[formats]{listings}

o usando la \lstloadaspectsmacrodespuéscargando el listingspaquete,

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

Luego, use la \lstdefineformatmacro para definir un "formato", es decir, instrucciones sobre lo que listingsdebe hacer al encontrar ciertos caracteres. La definición de formato que se muestra a continuación está tomada directamente del manual.

Tenga en cuenta que esta característica sigue siendo experimental; según el manual,

El formateo automático del código fuente está lejos de ser bueno. En primer lugar, no existen reglas generales sobre cómo se debe formatear el código fuente. Por tanto, las "definiciones de formato" deben ser flexibles. Esta flexibilidad requiere una interfaz compleja, un potente analizador de 'definición de formato' y muchas líneas de código detrás de escena. Actualmente, las definiciones de formato no son lo suficientemente flexibles (posiblemente no las definiciones sino los resultados).

Producción

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

información relacionada