¿Cómo eliminar los espacios en blanco innecesarios al utilizar la opción de rango de líneas?

¿Cómo eliminar los espacios en blanco innecesarios al utilizar la opción de rango de líneas?

Para ser honesto, busco personas que ya hayan leído la listingsdocumentació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}*

ingrese la descripción de la imagen aquí

Mi pregunta es ¿cómo eliminar el espacio en blanco inicial al usar linerangela 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.

ingrese la descripción de la imagen aquí

Limitaciones de la gobbleopción (proporcionadas por listings)

El listingspaquete 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, gobblesufre las siguientes limitaciones.

  • Carece de automatización: el usuario tiene que mirar el listado de antemano para determinar cuántos espacios deben devorarse.
  • La gobbleclave sólo es compatible con listados integrados (es decir, compuestos tipográficos utilizando un lstlistingentorno), más enfáticamentenocon listados que residen en archivos independientes (es decir, escritos usando \lstinputlisting).

Limitaciones de la autogobbleopción (proporcionadas por lstautogobble)

El lstautogobblepaquete 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 gobbleclave. Sin embargo, autogobblesufre 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 gobbleclave, hereda la incompatibilidad de esta última con \lstinputlisting.

Una nueva clave para eliminar los espacios en blanco iniciales:autounindent autodedent

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 firstlineopción o la opción),linerange
  • escompatible con ambos lstlistingy\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 // startmarcador (es decir, la línea que comienza static voiden 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}*

información relacionada