
이 코드는 내 요구 사항에 아주 잘 맞습니다.
\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}
이제 다양한 코드 줄을 지정하고 얼룩말 스타일의 배경도 그릴 수 있습니다. 당신의 도움을 주셔서 감사합니다!