
Para ser honesto, busco personas que ya hayan leído la listings
documentación por completo. Si esas personas tampoco pueden resolverlo, entonces la documentación no menciona nada al respecto. Perdón por las molestias.
Pero al menos puedo mostrar mi esfuerzo brindándoles un ejemplo mínimo de trabajo.
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{Program.cs}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
// stop
}
}
\end{filecontents*}
\usepackage{accsupp}
\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}
\usepackage{xcolor}
\usepackage{listings}
\lstdefinestyle{Common}
{
language={[Sharp]C},
numbers=left,
numbersep=1em,
numberstyle=\tiny\noaccsupp,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
rulecolor=\color{red},
xleftmargin=\dimexpr\fboxsep+\fboxrule,
xrightmargin=\dimexpr\fboxsep+\fboxrule,
breaklines=true,
breakindent=0pt,
tabsize=2,
columns=flexible,
includerangemarker=false,
rangeprefix=//\ ,
}
\lstdefinestyle{A}
{
style=Common,
backgroundcolor=\color{yellow!10},
basicstyle=\scriptsize\ttfamily,
keywordstyle=\color{blue}\bf,
identifierstyle=\color{black},
stringstyle=\color{red},
commentstyle=\color{green}
}
\begin{document}
\section*{Full Code}
\lstinputlisting[style=A]{Program.cs}
\section*{Code Snippet}
\lstinputlisting[style=A,linerange=start-stop]{Program.cs}
\end{document}*
Mi pregunta es ¿cómo eliminar el espacio en blanco inicial al usar linerange
la opción?
Editar
Considere algunos casos extremos a continuación.
Caso 1
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
El código debe representarse de la siguiente manera.
conincludrangemarker=true
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
conincluderangemarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
Caso 2
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
El código debe representarse de la siguiente manera.
con includerangemarker=true
,
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
conincluderangermarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
Respuesta1
Aquí hay una solución. Más detalles siguen.
Limitaciones de la gobble
opción (proporcionadas por listings
)
El listings
paquete proporciona una clave llamada gobble
, que permite al usuario especificar unfijadoNúmero de caracteres (espacios o no) que se devorarán al principio de cada línea. Sin embargo, gobble
sufre las siguientes limitaciones.
- Carece de automatización: el usuario tiene que mirar el listado de antemano para determinar cuántos espacios deben devorarse.
- La
gobble
clave sólo es compatible con listados integrados (es decir, compuestos tipográficos utilizando unlstlisting
entorno), más enfáticamentenocon listados que residen en archivos independientes (es decir, escritos usando\lstinputlisting
).
Limitaciones de la autogobble
opción (proporcionadas por lstautogobble
)
El lstautogobble
paquete proporciona una clave booleana llamada autogobble
, que automatiza la devoración de espacios iniciales; más específicamente, mide los espacios principalesen la primera línea(ya sea tipográfico o no) de todo el listado y pasa ese valor a la gobble
clave. Sin embargo, autogobble
sufre las siguientes limitaciones.
- Debido a que cuenta los espacios en blanco iniciales en la primera línea de la lista, es posible que no elimine la cantidad adecuada de espacios en blanco iniciales si el rango de líneas tipográficas no comienza en la línea 1.
- Debido a que se basa en la
gobble
clave, hereda la incompatibilidad de esta última con\lstinputlisting
.
Una nueva clave para eliminar los espacios en blanco iniciales:autounindent
autodedent
autounindent
El siguiente enfoque define una clave booleana llamadaautounindent
autodedent
, cual,
- si está configurado, elimina los espacios en blanco iniciales incluso si solo se escribe un rango de líneas (es decir, si se usa la
firstline
opción o la opción),linerange
- escompatible con ambos
lstlisting
y\lstinputlisting
.
Limitaciones conocidas
El siguiente código aún no maneja correctamente los caracteres de tabulación.
Además, el comportamiento deseado en elcasos extremoscubierto en su edición parece muy complicado de implementar, porque requeriría dos pasadas. ¡Estoy fuera de mi alcance! Lo mejor que puedo hacer es engullir tantos espacios como haya al principio de la línea justo después del // start
marcador (es decir, la línea que comienza static void
en su código).
Por favor avíseme de cualquier otro problema.
Actualizar: Cambié el nombre de la clave a autodedent
(que es más fácil de leer y escribir que autounindent
). También corregí unproblema reportado por el OP, de acuerdo aesta respuesta de Heiko Oberdiek. Finalmente, para mayor comodidad, implementé esa característica en un pequeño paquete llamado lstautodedent
; la versión alfa está disponible enhttps://github.com/jubobs/lstautodedent
Código
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{filecontents}
\begin{filecontents*}{Program.cs}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
// stop
}
}
\end{filecontents*}
\usepackage{accsupp}
\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{lstautodedent}
\lstdefinestyle{Common}
{
language={[Sharp]C},
numbers=left,
numbersep=1em,
numberstyle=\tiny\noaccsupp,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
rulecolor=\color{red},
xleftmargin=\dimexpr\fboxsep+\fboxrule,
xrightmargin=\dimexpr\fboxsep+\fboxrule,
breaklines=true,
breakindent=0pt,
tabsize=2,
columns=flexible,
includerangemarker=false,
rangeprefix=//\ ,
}
\lstdefinestyle{A}
{
style=Common,
backgroundcolor=\color{yellow!10},
basicstyle=\scriptsize\ttfamily,
keywordstyle=\color{blue}\bf,
identifierstyle=\color{black},
stringstyle=\color{red},
commentstyle=\color{green}
}
\begin{document}
\section*{Full Code}
\lstinputlisting[style=A]{Program.cs}
\section*{Code Snippet}
\lstinputlisting[style=A,linerange=start-stop,autodedent]{Program.cs}
\end{document}*