Verweisen auf eine ganze Codezeile statt auf eine Zeilennummer

Verweisen auf eine ganze Codezeile statt auf eine Zeilennummer

Dieser Code erfüllt meine Anforderungen ganz gut:

\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}

In manchen Fällen kann es jedoch sinnvoll sein, die gesamte Codezeile anstelle der Zeilennummer zu wiederholen. Ich denke, dass dies mit externen Quelldateien einigermaßen machbar ist, indem man

\lstinputlisting[firstline=x,lastline=x] 

obwohl ich das nicht weiter untersucht habe. Aber ist es mit Quellen in einer lstlistingUmgebung machbar? Und wie?

Antwort1

@FloDD, ich habe deine Lösung ein wenig geändert, um die richtigen Zahlen für dich zu erhalten.

Ihr Makro \lst@PlaceNumberist nicht notwendig, ich habe es im folgenden MWE kommentiert.

Um für jede Zeile die richtigen Zahlen zu erhalten, müssen Sie diese firstnumber=\thelstlinereffirstin Ihren Makroaufruf einfügen \lstinputlisting.

Das Ergebnis sind nun die richtigen Zahlen.

Das neue MWE mit etwas hübscherem Aufdruck:

\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}

Ergebnis: Bildbeschreibung hier eingeben

Antwort2

Ich bin nicht ganz sicher, ob es genau das ist, wonach Sie suchen, aber die Ausgabe ist angemessen.

Bildbeschreibung hier eingeben

\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}

Die Idee besteht darin, den Code in eine Datei zu schreiben (mitfilecontents) und geben Sie dann die gesamte Auflistung ein. Dies fördert die Portabilität, da der Quellcode in Ihrer Quelle enthalten ist und .texnicht als eigenständige Datei an anderer Stelle eingefügt werden muss. Außerdem ermöglicht dies das einfache Extrahieren einer Zeile mithilfe des neuen Makros \lineref{<ref>}{<source>}. Es druckt die Zeile aus, <source>die die Referenz enthält <ref>.refcountstellt die Referenz-Zähler-Schnittstelle bereit. Außerdem \labelwird ein lokalisierter No-Op für initiiert, um die Erstellung doppelter Beschriftungen zu vermeiden.

Eine Zeilennummernkorrektur ist erforderlich, wenn Sie einen Bereich importieren und die Nummerierung mit der Originalquelle konsistent halten möchten, dankAuflistung der Zeilennummern, die der linerangeSpezifikation entsprechen.

Abhängig von Ihrem Verteilungsdatum fehlt Ihnen möglicherweise eine Definition von \rc@refused. Ich habe Folgendes beigefügtein Patchdie Sie nur verwenden sollten, wenn Sie Fehler erhalten.

Antwort3

@Werner: Ich habe Ihre Antwort ein wenig modifiziert, um sie meinen Bedürfnissen besser anzupassen:

\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}

Bildbeschreibung hier eingeben

Jetzt kann ich eine Reihe von Codezeilen angeben und auch den Zebra-Hintergrund zeichnen. Danke für Ihre Hilfe!

verwandte Informationen