Como remover os espaços em branco desnecessários ao usar a opção linerange?

Como remover os espaços em branco desnecessários ao usar a opção linerange?

Para ser sincero, procuro pessoas que já tenham lido a listingsdocumentação na íntegra. Se essas pessoas também não conseguirem resolver, então a documentação não menciona nada a respeito. Desculpe por esse inconveniente.

Mas pelo menos posso mostrar meu esforço fornecendo um exemplo prático mínimo.

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

insira a descrição da imagem aqui

Minha pergunta é como remover o espaço em branco inicial ao usar linerangea opção?

Editar

Considere alguns casos extremos abaixo.

Caso 1

namespace Delegate
{
    class Program
    {
        // start
        static void Main(string[] args)
        {
            for (int x = 0; x < 10; x++)
                Console.WriteLine(x);
        }      
    }        
}
// stop

O código deve ser renderizado da seguinte forma

comincludrangemarker=true

        // start
        static void Main(string[] args)
        {
            for (int x = 0; x < 10; x++)
                Console.WriteLine(x);
        }      
    }        
}
// stop

comincluderangemarker=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

O código deve ser renderizado da seguinte forma

com includerangemarker=true,

    // start
        static void Main(string[] args)
        {
            for (int x = 0; x < 10; x++)
                Console.WriteLine(x);
        }      
    }        
}
    // stop

comincluderangermarker=false

        static void Main(string[] args)
        {
            for (int x = 0; x < 10; x++)
                Console.WriteLine(x);
        }      
    }        
}

Responder1

Aqui está uma solução. Mais detalhes seguem.

insira a descrição da imagem aqui

Limitações da gobbleopção (fornecidas por listings)

O listingspacote fornece uma chave chamada gobble, que permite ao usuário especificar umfixonúmero de caracteres (espaços ou outros) a serem engolidos no início de cada linha. No entanto, gobblesofre das seguintes limitações.

  • Falta automação: o usuário tem que olhar a listagem com antecedência para determinar quantos espaços devem ser engolidos.
  • A gobblechave só é compatível com listagens incorporadas (ou seja, compostas usando um lstlistingambiente), mais enfaticamentenãocom listagens residentes em arquivos independentes (ou seja, digitados usando \lstinputlisting).

Limitações da autogobbleopção (fornecidas por lstautogobble)

O lstautogobblepacote fornece uma chave booleana chamada autogobble, que automatiza a devoração de espaços iniciais; mais especificamente, mede os espaços principaislogo na primeira linha(seja formatado ou não) de toda a listagem e passa esse valor para a gobblechave. No entanto, autogobblesofre das seguintes limitações.

  • Como conta os espaços em branco iniciais na primeira linha da listagem, ele pode não remover a quantidade apropriada de espaços em branco iniciais se o intervalo de linhas compostas não começar na linha 1.
  • Por ser baseado na gobblechave, herda a incompatibilidade desta última com o \lstinputlisting.

Uma nova chave para remover espaços em branco iniciais:autounindent autodedent

A abordagem abaixo define uma chave booleana chamadaautounindent autodedent, qual,

  • se definido, remove os espaços em branco à esquerda, mesmo que apenas um intervalo de linhas seja composto (ou seja, se a firstlineopção ou a linerangeopção for usada),
  • écompatível com ambos lstlistinge\lstinputlisting.

Limitações conhecidas

O código abaixo ainda não lida com caracteres de tabulação corretamente.

Além disso, o comportamento desejado noCasos extremosabordado em sua edição parece muito complicado de implementar, porque exigiria duas passagens. Estou fora do meu alcance! O melhor que posso fazer é engolir quantos espaços houver no início da linha logo após o // startmarcador (ou seja, a linha que começa static voidem seu código).

Por favor, avise-me sobre qualquer outro problema.

Atualizar: renomeei a chave para autodedent(que é mais fácil de ler e escrever do queautounindent ). Eu também corrigi umproblema relatado pelo OP, de acordo comesta resposta de Heiko Oberdiek. Finalmente, por conveniência, implementei esse recurso em um pequeno pacote chamadolstautodedent ; a versão alfa está disponível emhttps://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}*

informação relacionada