
Para ser sincero, procuro pessoas que já tenham lido a listings
documentaçã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}*
Minha pergunta é como remover o espaço em branco inicial ao usar linerange
a 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.
Limitações da gobble
opção (fornecidas por listings
)
O listings
pacote 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, gobble
sofre 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
gobble
chave só é compatível com listagens incorporadas (ou seja, compostas usando umlstlisting
ambiente), mais enfaticamentenãocom listagens residentes em arquivos independentes (ou seja, digitados usando\lstinputlisting
).
Limitações da autogobble
opção (fornecidas por lstautogobble
)
O lstautogobble
pacote 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 gobble
chave. No entanto, autogobble
sofre 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
gobble
chave, herda a incompatibilidade desta última com o\lstinputlisting
.
Uma nova chave para remover espaços em branco iniciais:autounindent
autodedent
autounindent
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
firstline
opção ou alinerange
opção for usada), - écompatível com ambos
lstlisting
e\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 // start
marcador (ou seja, a linha que começa static void
em 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}*