줄 번호 대신 전체 코드 줄 참조

줄 번호 대신 전체 코드 줄 참조

이 코드는 내 요구 사항에 아주 잘 맞습니다.

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{lipsum}
\usepackage{hyperref}

\usepackage{lstlinebgrd}
\definecolor{myComment}{rgb}{0.0,0.5,0.0}
\definecolor{myKeyword}{rgb}{0.0,0.0,0.5}


\lstset
{
  aboveskip=\bigskipamount,
  belowskip=\bigskipamount,
  frame=tb,
  framesep=2pt,
  basicstyle=\scriptsize\ttfamily,
  keywordstyle=\color{myKeyword},
  commentstyle=\color{myComment}\itshape,
  captionpos=b,
  showstringspaces=false,
  fontadjust=true,
  language=Delphi,
  breaklines=true,
  numbers=left,
  numberstyle=\tiny,
  linebackgroundcolor={\ifodd\value{lstnumber}\color{gray!25}\fi},
  numbersep=5pt,
  escapeinside={(*@}{@*)},
}

\newcommand\coderef[1]{%
  $\Rightarrow$~\ref{#1}:~~%%
}%

\usepackage{hyperref}

\begin{document}

\begin{lstlisting}
program FileTest;

var
  myFile: file of Integer;

begin
  Assign(myFile, 'c:/test.ext'); (*@\label{FileTest-1}@*)
  Rewrite (myFile); (*@\label{FileTest-2}@*)
  Write(myFile, 1); (*@\label{FileTest-3}@*)
  Write(myFile, 2);
  Close(myFile); (*@\label{FileTest-4}@*)
end.
\end{lstlisting}


\coderef{FileTest-1} \lipsum[1]
\coderef{FileTest-2} \lipsum[2]
\coderef{FileTest-3} \lipsum[3]
\coderef{FileTest-4} \lipsum[4]

\end{document}

그러나 어떤 경우에는 줄 번호 대신 전체 코드 줄을 반복하는 것이 좋을 수도 있습니다. 외부 소스 파일을 사용하면 어느 정도 가능하다고 생각합니다.

\lstinputlisting[firstline=x,lastline=x] 

더 이상 조사하지는 않았지만. 그러나 환경의 소스로 이것이 가능합니까 lstlisting? 그리고 어떻게?

답변1

@FloDD, 귀하에게 적합한 숫자를 얻기 위해 귀하의 솔루션을 약간 변경했습니다.

귀하의 매크로 \lst@PlaceNumber는 필요하지 않습니다. 다음 MWE에서 이에 대해 언급했습니다.

각 라인에 대해 올바른 번호를 얻으려면 firstnumber=\thelstlinereffirst매크로 호출에 \lstinputlisting.

이제 결과는 올바른 숫자입니다.

약간 예쁜 인쇄가 포함된 새로운 MWE:

\RequirePackage{filecontents}
\begin{filecontents*}{source.pas}
program FileTest;

var
  myFile: file of Integer;

begin
  Assign(myFile, 'c:/test.ext'); (*@\label{FileTest-1}@*)
  Rewrite (myFile); (*@\label{FileTest-2}@*)
  Write(myFile, 1); (*@\label{FileTest-3}@*)
  Write(myFile, 2);
  Close(myFile); (*@\label{FileTest-4}@*)
end.
\end{filecontents*}


\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{lstlinebgrd}
\usepackage{refcount,lipsum}
\usepackage{hyperref}

\definecolor{myComment}{rgb}{0.0,0.5,0.0}
\definecolor{myKeyword}{rgb}{0.0,0.0,0.5}


\lstset
{
  aboveskip=\bigskipamount,
  belowskip=\bigskipamount,
  frame=tb,
  framesep=2pt,
  basicstyle=\scriptsize\ttfamily,
  keywordstyle=\color{myKeyword},
  commentstyle=\color{myComment}\itshape,
  captionpos=b,
  showstringspaces=false,
  fontadjust=true,
  language=Delphi,
  breaklines=true,
  numbers=left,
  numberstyle=\tiny,
  linebackgroundcolor={\ifodd\value{lstnumber}\color{gray!25}\fi},
  numbersep=5pt,
  escapeinside={(*@}{@*)},
}

\newcommand\coderef[1]{%
  $\Rightarrow$~\ref{#1}:~~%%
}%

\newcounter{lstlinereffirst}
\newcounter{lstlinereflast}
\makeatletter
\let\rc@refused\refused% See http://tex.stackexchange.com/q/32807/5764
\newcommand{\lineref}[3]{{%
  \let\label\@gobble%
  \setcounterref{lstlinereffirst}{#1}%
  \setcounterref{lstlinereflast}{#2}%
  \lstinputlisting[%
    firstline=\thelstlinereffirst,%
    lastline=\thelstlinereflast,%
    firstnumber=\thelstlinereffirst%
  ]{#3}
}}

%\def\lst@PlaceNumber{\llap{\normalfont% http://tex.stackexchange.com/q/110187/5764
                %\lst@numberstyle{\the\lst@lineno}\kern\lst@numbersep}}%\lst@linebgrd}

\makeatother

\begin{document}

\lstinputlisting{source.pas}

\coderef{FileTest-1} \lipsum[1]
\coderef{FileTest-2} \lipsum[2]
\lineref{FileTest-1}{FileTest-3}{source.pas} \lipsum[3]
\coderef{FileTest-4} \lipsum[4]

\end{document}

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

답변2

이것이 정확히 당신이 추구하는 것인지는 확실하지 않지만 합리적인 결과를 제공합니다.

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

\documentclass{article}
\usepackage{xcolor,listings,hyperref}% http://ctan.org/pkg/{xcolor,listings,hyperref}
\usepackage{filecontents,refcount,lipsum}% http://ctan.org/pkg/{filecontents,refcount,lipsum}
\lstset
{
  aboveskip=\bigskipamount,
  belowskip=\bigskipamount,
  frame=tb,
  framesep=2pt,
  basicstyle=\scriptsize\ttfamily,
  keywordstyle=\color{myKeyword},
  commentstyle=\color{myComment}\itshape,
  captionpos=b,
  showstringspaces=false,
  fontadjust=true,
  language=Delphi,
  breaklines=true,
  numbers=left,
  numberstyle=\tiny,
  numbersep=5pt,
  escapeinside={(*@}{@*)},
}
\definecolor{myComment}{rgb}{0.0,0.5,0.0}
\definecolor{myKeyword}{rgb}{0.0,0.0,0.5}

\newcommand{\coderef}[1]{%
  $\Rightarrow$~\ref{#1}:~~%%
}%
\newcounter{lstlineref}
\makeatletter
\let\rc@refused\refused% See https://tex.stackexchange.com/q/32807/5764
\newcommand{\lineref}[2]{{%
  \let\label\@gobble%
  \setcounterref{lstlineref}{#1}%
  \lstinputlisting[firstline=\thelstlineref,lastline=\thelstlineref]{#2}
}}
\def\lst@PlaceNumber{\llap{\normalfont% https://tex.stackexchange.com/q/110187/5764
                \lst@numberstyle{\the\lst@lineno}\kern\lst@numbersep}}
\makeatother


\begin{document}

\begin{filecontents*}{source.p}
program FileTest;

var
  myFile: file of Integer;

begin
  Assign(myFile, 'c:/test.ext'); (*@\label{FileTest-1}@*)
  Rewrite (myFile); (*@\label{FileTest-2}@*)
  Write(myFile, 1); (*@\label{FileTest-3}@*)
  Write(myFile, 2);
  Close(myFile); (*@\label{FileTest-4}@*)
end.
\end{filecontents*}
\lstinputlisting{source.p}

\coderef{FileTest-1} \lipsum[1]
\coderef{FileTest-2} \lipsum[2]
\lineref{FileTest-3}{source.p} \lipsum[3]
\coderef{FileTest-4} \lipsum[4]

\end{document}

아이디어는 파일에 코드를 작성하는 것입니다(사용하여filecontents) 그런 다음 전체 목록을 입력합니다. 이렇게 하면 소스 코드가 .tex다른 곳에 독립형 파일로 포함되지 않고 소스 내부에 포함되어 이식성이 향상됩니다. 또한 새로운 매크로를 사용하여 라인을 쉽게 추출할 수 있습니다 \lineref{<ref>}{<source>}. <source>참조가 포함된 행을 인쇄합니다 <ref>.refcount카운터에 대한 참조 인터페이스를 제공합니다. 또한 \label중복 라벨이 생성되는 것을 방지하기 위해 현지화된 무작동(no-op)이 시작됩니다.

범위를 가져오고 원본 소스와 일관된 번호 매기기를 유지하려는 경우 행 번호 수정이 필요합니다.linerange사양 과 일치하는 줄 번호 나열.

배포 날짜에 따라 의 정의가 짧을 수 있습니다 \rc@refused. 나는 포함했다패치오류가 발생한 경우에만 사용해야 합니다.

답변3

@Werner: 내 요구 사항에 더 잘 맞도록 귀하의 답변을 약간 수정했습니다.

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{filecontents,refcount,lipsum}
\usepackage{hyperref}

\usepackage{lstlinebgrd}
\definecolor{myComment}{rgb}{0.0,0.5,0.0}
\definecolor{myKeyword}{rgb}{0.0,0.0,0.5}


\lstset
{
  aboveskip=\bigskipamount,
  belowskip=\bigskipamount,
  frame=tb,
  framesep=2pt,
  basicstyle=\scriptsize\ttfamily,
  keywordstyle=\color{myKeyword},
  commentstyle=\color{myComment}\itshape,
  captionpos=b,
  showstringspaces=false,
  fontadjust=true,
  language=Delphi,
  breaklines=true,
  numbers=left,
  numberstyle=\tiny,
  linebackgroundcolor={\ifodd\value{lstnumber}\color{gray!25}\fi},
  numbersep=5pt,
  escapeinside={(*@}{@*)},
}

\newcommand\coderef[1]{%
  $\Rightarrow$~\ref{#1}:~~%%
}%

\newcounter{lstlinereffirst}
\newcounter{lstlinereflast}
\makeatletter
\let\rc@refused\refused% See http://tex.stackexchange.com/q/32807/5764
\newcommand{\lineref}[3]{{%
  \let\label\@gobble%
  \setcounterref{lstlinereffirst}{#1}%
  \setcounterref{lstlinereflast}{#2}%
  \lstinputlisting[firstline=\thelstlinereffirst,lastline=\thelstlinereflast]{#3}
}}

\def\lst@PlaceNumber{\llap{\normalfont% http://tex.stackexchange.com/q/110187/5764
                \lst@numberstyle{\the\lst@lineno}\kern\lst@numbersep}\lst@linebgrd}

\makeatother

\begin{document}

\begin{filecontents*}{source.pas}
program FileTest;

var
  myFile: file of Integer;

begin
  Assign(myFile, 'c:/test.ext'); (*@\label{FileTest-1}@*)
  Rewrite (myFile); (*@\label{FileTest-2}@*)
  Write(myFile, 1); (*@\label{FileTest-3}@*)
  Write(myFile, 2);
  Close(myFile); (*@\label{FileTest-4}@*)
end.
\end{filecontents*}
\lstinputlisting{source.pas}


\coderef{FileTest-1} \lipsum[1]
\coderef{FileTest-2} \lipsum[2]
\lineref{FileTest-1}{FileTest-3}{source.pas} \lipsum[3]
\coderef{FileTest-4} \lipsum[4]

\end{document}

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

이제 다양한 코드 줄을 지정하고 얼룩말 스타일의 배경도 그릴 수 있습니다. 당신의 도움을 주셔서 감사합니다!

관련 정보