
Ehrlich gesagt suche ich nach Leuten, die die listings
Dokumentation bereits vollständig gelesen haben. Wenn diese Leute das Problem auch nicht lösen können, dann steht in der Dokumentation nichts dazu. Entschuldigen Sie die Unannehmlichkeiten.
Aber ich kann Ihnen zumindest meine Bemühungen zeigen, indem ich Ihnen das minimale funktionierende Beispiel zur Verfügung stelle.
\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}*
Meine Frage ist, wie man das führende Leerzeichen entfernt, wenn man linerange
eine Option verwendet?
Bearbeiten
Betrachten Sie unten einige Extremfälle.
Fall 1
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
Der Code sollte wie folgt dargestellt werden
mitincludrangemarker=true
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
mitincluderangemarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
Fall 2
namespace Delegate
{
class Program
{
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
Der Code sollte wie folgt dargestellt werden
mit includerangemarker=true
,
// start
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
// stop
mitincluderangermarker=false
static void Main(string[] args)
{
for (int x = 0; x < 10; x++)
Console.WriteLine(x);
}
}
}
Antwort1
Hier ist eine Lösung. Weitere Details folgen.
Einschränkungen der gobble
Option (bereitgestellt von listings
)
Das listings
Paket stellt einen Schlüssel namens zur Verfügung gobble
, der es dem Benutzer ermöglicht, einenFestAnzahl der Zeichen (Leerzeichen oder andere), die am Anfang jeder Zeile verschlungen werden sollen. Allerdings gobble
unterliegt diese Funktion den folgenden Einschränkungen.
- Dabei fehlt die Automatisierung: Der Nutzer muss sich vorab die Auflistung anschauen, um zu ermitteln, wie viele Plätze belegt werden sollen.
- Der
gobble
Schlüssel ist nur mit eingebetteten Listen kompatibel (d. h. mit einerlstlisting
Umgebung gesetzt), insbesonderenichtbei Auflistungen, die sich in eigenständigen Dateien befinden (d. h. mit gesetzt\lstinputlisting
).
Einschränkungen der autogobble
Option (bereitgestellt von lstautogobble
)
Das lstautogobble
Paket stellt einen Booleschen Schlüssel namens bereit autogobble
, der das Verschlingen führender Leerzeichen automatisiert; genauer gesagt misst er die führenden Leerzeichenin der allerersten Zeile(ob gesetzt oder nicht) der gesamten Auflistung und übergibt diesen Wert an den gobble
Schlüssel. Allerdings autogobble
unterliegt es den folgenden Einschränkungen.
- Da führende Leerzeichen bereits in der ersten Zeile der Auflistung gezählt werden, werden führende Leerzeichen möglicherweise nicht in ausreichender Menge entfernt, wenn der Zeilensatz nicht mit Zeile 1 beginnt.
- Da es auf dem Schlüssel basiert
gobble
, erbt es dessen Inkompatibilität mit\lstinputlisting
.
Ein neuer Schlüssel zum Entfernen führender Leerzeichen:autounindent
autodedent
autounindent
Der folgende Ansatz definiert einen Booleschen Schlüssel namensautounindent
autodedent
, welche,
- wenn gesetzt, werden führende Leerzeichen entfernt, auch wenn nur ein Zeilenbereich gesetzt wird (also wenn entweder die
firstline
Option oder dielinerange
Option verwendet wird), - Istkompatibel mit beiden
lstlisting
und\lstinputlisting
.
Bekannte Einschränkungen
Der folgende Code verarbeitet Tabulatorzeichen noch nicht richtig.
Darüber hinaus ist das gewünschte Verhalten in derExtremfällein Ihrer Bearbeitung behandelt wird, scheint sehr schwierig zu implementieren, da es zwei Durchgänge erfordern würde. Ich bin überfordert! Das Beste, was ich tun kann, ist, so viele Leerzeichen zu verschlingen, wie am Anfang der Zeile direkt nach dem // start
Marker vorhanden sind (also die Zeile, die static void
in Ihrem Code mit beginnt).
Bitte benachrichtigen Sie mich bei weiteren Problemen.
Aktualisieren: Ich habe den Schlüssel in umbenannt autodedent
(was einfacher zu lesen und zu schreiben ist als autounindent
). Ich habe auch einenvom OP gemeldetes Problem, entsprechenddiese Antwort von Heiko Oberdiek. Schließlich habe ich diese Funktion der Einfachheit halber in einem kleinen Paket namens implementiert lstautodedent
; die Alpha-Version ist verfügbar unterhttps://github.com/jubobs/lstautodedent
Code
\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}*