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에 있으면 상자 주석을 사용하여 해당 줄에 주의를 환기시키는지 확인합니다.

배경색 방법, 색상이 지정된 줄 번호 방법, 강조 표시된 상자 방법, 세 가지 모두, 이들의 일부 조합 또는 완전히 다른 방법을 선택할 수 있으며 모두 매크로 정의를 통해 사용자 정의됩니다. 패키지는 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}

여기에 이미지 설명을 입력하세요

관련 정보