リスティング パッケージはソース コードを自動的にインデントできますか?

リスティング パッケージはソース コードを自動的にインデントできますか?

この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渡すか、formatslistings

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

関連情報