ドキュメントにはソース コードのブロックが多数あります (それぞれ 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}