
Este código se adapta bastante bien a mis necesidades:
\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}
Pero en algunos casos podría ser bueno repetir toda la línea de código en lugar del número de línea. Creo que es algo factible con archivos fuente externos, usando
\lstinputlisting[firstline=x,lastline=x]
aunque no he investigado más. ¿Pero es factible con fuentes en un lstlisting
entorno? ¿Y cómo?
Respuesta1
@FloDD, cambié un poco tu solución para obtener los números correctos para ti.
Tu macro \lst@PlaceNumber
no es necesaria, lo comenté en el siguiente MWE.
Para obtener los números correctos para cada línea, debe agregar firstnumber=\thelstlinereffirst
su macro llamada de \lstinputlisting
.
El resultado ahora son los números correctos.
El nuevo MWE con una impresión un poco bonita:
\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}
Resultado:
Respuesta2
No estoy del todo seguro de si esto es exactamente lo que busca, pero proporciona un resultado razonable.
\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}
La idea es escribir el código en un archivo (usandofilecontents
) y luego ingrese la lista completa; esto promueve la portabilidad con el código fuente contenido dentro de su fuente .tex
en lugar de incluirlo como un archivo independiente en otro lugar. Además, esto permite extraer fácilmente una línea usando la nueva macro \lineref{<ref>}{<source>}
. Imprime la línea que <source>
contiene la referencia <ref>
.refcount
proporciona la interfaz de referencia a contador. Además, se inicia una prohibición de operación localizada \label
para evitar que se realicen etiquetas duplicadas.
Se requiere una corrección del número de línea al importar un rango y querer mantener una numeración consistente con la fuente original, gracias aNúmeros de línea de listados que coinciden con la linerange
especificación.
Dependiendo de su fecha de distribución, es posible que le falte una definición de \rc@refused
. he incluidoun parcheque sólo debes utilizar si obtienes errores.
Respuesta3
@Werner: He modificado un poco tu respuesta para adaptarla mejor a mis necesidades:
\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}
Ahora puedo especificar un rango de líneas de código y dibujar también el fondo con estilo de cebra. ¡Gracias por tu ayuda!