LaTeX でソース コードのブロックを強調表示するにはどうすればよいですか?

LaTeX でソース コードのブロックを強調表示するにはどうすればよいですか?

ドキュメントにはソース コードのブロックが多数あります (それぞれ 40 行以上)。これらのコード ブロックの一部をフォーマットし、できれば右側に注釈を付けたいと思っています。いくつかの行の周囲に色付きのフレームを配置するだけを考えていました。

これを行う標準的な方法はありますか? 使用できるパッケージはありますか?

現在、listingsパッケージを使用しており、ドキュメント内のソース コードは次のように挿入されています。

\begin{lstlisting}
#include <stdio.h>
#define N 10
/* Block
 * comment */

int main()
{
    int i;

    // Line comment.
    puts("Hello world!");

    for (i = 0; i < N; i++)
    {
        puts("LaTeX is also great for programmers!");
    }

    return 0;
}
\end{lstlisting}

\lstinputlisting[caption=Scheduler, style=customc]{hello.c}

答え1

パッケージを使用するとverbatimbox、オプションの引数 (マクロの形式) をパッケージの逐語環境に渡すことができます。これにより、あらゆる種類のカスタマイズが可能になります。以下の私の MWE では、コード行番号をテストします。8 ~ 18 の範囲内であれば、\colorfieldリストに背景が適用されます。また、コード行番号がその範囲内であれば赤い行番号を適用し、範囲外であれば黒い行番号を適用します (デフォルトでは行番号なし)。

さらに、コード行 11 にある場合は、ボックス コメントでその行に注意を喚起していることを確認します。

背景色方式、色付き行番号方式、強調表示されたボックス方式、3 つすべて、それらの組み合わせ、またはまったく異なる方法を選択できます。これらはすべて、マクロ定義を通じてカスタマイズされます。パッケージは、VerbboxLineNoマクロで使用できるカウンターを通じて行番号を追跡します。

\documentclass{article}
\usepackage{verbatimbox,xcolor,lipsum}
% VERBATIMBOX PREP
\usepackage{verbatimbox}
\def\codesize{\footnotesize}
\newsavebox\thecolorfield
\newcommand\setcolorfield[1][blue!19!gray!18]{%
  \savebox{\thecolorfield}{\codesize%
    \makebox[0pt][l]{\textcolor{#1}{%
    \rule[-\dp\strutbox]{\textwidth}{\dimexpr\ht\strutbox+\dp\strutbox}}}}%
}

\def\colorfield{\usebox{\thecolorfield}}

\setcolorfield

\newcommand*\ifline[4]{%
  \ifnum\value{VerbboxLineNo}<#1#4\else
    \ifnum\value{VerbboxLineNo}>#2#4\else#3\fi
  \fi
}

\newcommand\rednum{\makebox[0ex][r]{\color{red}\arabic{VerbboxLineNo}:}\hspace{1ex}}

\newcommand\blacknum{\makebox[0ex][r]{\arabic{VerbboxLineNo}:}\hspace{1ex}}

\newcommand\boxcomment[1]{\fboxsep=1pt\smash{\rlap{%
    \textcolor{red!30}{\rule[-1pt]{.75\textwidth}{1pt}}%
    \colorbox{red!30}{\fbox{\parbox[b]{.2\textwidth}{\rmfamily #1}}%
  }}}%
}
\newcommand\commentA{\boxcomment{I am drawing attention to ``Hello World''}}
\begin{document}
\lipsum[3]
\begin{verbnobox%
  }[\codesize\ifline{8}{18}{\colorfield\rednum}{\blacknum}\ttfamily\ifline{11}{11}{\commentA}{}]
#include <stdio.h>
#define N 10
/* Block
 * comment */

int main()
{
    int i;

    // Line comment.
    puts("Hello world!");

    for (i = 0; i < N; i++)
    {
        puts("LaTeX is also great for programmers!");
    }

    return 0;
}
\end{verbnobox}
\lipsum[4]
\end{document}

ここに画像の説明を入力してください

関連情報