Wie entferne ich die führenden, unnötigen Leerzeichen, wenn ich die Linerange-Option verwende?

Wie entferne ich die führenden, unnötigen Leerzeichen, wenn ich die Linerange-Option verwende?

Ehrlich gesagt suche ich nach Leuten, die die listingsDokumentation 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}*

Bildbeschreibung hier eingeben

Meine Frage ist, wie man das führende Leerzeichen entfernt, wenn man linerangeeine 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.

Bildbeschreibung hier eingeben

Einschränkungen der gobbleOption (bereitgestellt von listings)

Das listingsPaket 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 gobbleunterliegt 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 gobbleSchlüssel ist nur mit eingebetteten Listen kompatibel (d. h. mit einer lstlistingUmgebung gesetzt), insbesonderenichtbei Auflistungen, die sich in eigenständigen Dateien befinden (d. h. mit gesetzt \lstinputlisting).

Einschränkungen der autogobbleOption (bereitgestellt von lstautogobble)

Das lstautogobblePaket 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 gobbleSchlüssel. Allerdings autogobbleunterliegt 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

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 firstlineOption oder die linerangeOption verwendet wird),
  • Istkompatibel mit beiden lstlistingund\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 // startMarker vorhanden sind (also die Zeile, die static voidin 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}*

verwandte Informationen