Listings: Zeilennummerierung bei minimierten Codeblöcken

Schriftbild, Absätze und Auflistungen einstellen


19gonzo04
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Fr 31. Aug 2018, 12:48

Listings: Zeilennummerierung bei minimierten Codeblöcken

Beitrag von 19gonzo04 »

Guten Tag,
meine Frage bezieht sich auf das Package "Listings". Ich würde gerne verschiedene Teile meines Quellcodes in meiner Bachelorarbeit preisgeben. Allerdings sind viele meiner Codeblöcke minimiert und so soll es auch bleiben. Das Problem ist, dass die Zeilennummern fortlaufen sind.
Ist es möglich, die Zeilennummern manuell zu setzten?
Beispiel:
01 int i;
02
03 minimierte_methode()[...]
15 //weiterer Code

oder

01 int i;
02
03 minimierte_methode()
04 [...]
15 //weiterer Code

Ich weiß bis jetzt nur von "firstnumber" und packe im Moment mehrere Listings zusammen und füge nur bei der letzten eine Caption bei. Das ist natürlich geschummelt und man sieht die Abstände zwischen den einzelnen Listings.

Vielen Dank im voraus.

Mit freundlichen Grüßen
19gonzo04

Gast

Beitrag von Gast »

Die Frage ist für mich unklar. Ist das Problem, dass die Zeilennummern fortlaufend angezeigt werden, obwohl sie im tatsächlichen Listing nicht fortlaufend sind oder dass Du sie fortlaufend haben willst, sie aber nicht fortlaufend angezeigt werden? Ich vermute ersteres (müsste aber nicht extra fragen, wenn Du ein Minimalbeispiel eingefügt hättest, wie das hier aus gutem Grund ständig nachgefragt wird).

Abstände vor und nach Listings sind übrigens konfigurierbar.

19gonzo04
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Fr 31. Aug 2018, 12:48

Beitrag von 19gonzo04 »

Ich bitte um Entschuldigung, ich habe nicht erwartet hier ein Minimalbeispiel anführen zu müssen, aber dies hole ich natürlich gerne nach:
\documentclass[a4paper,12pt]{scrreprt}
\usepackage[left= 2.5cm,right = 2cm, bottom = 4 cm]{geometry}
\usepackage[onehalfspacing]{setspace}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
%Schriftpakete
\usepackage[T1]{fontenc}

\usepackage{listings}
\usepackage{xcolor}
\lstloadlanguages{C,C++,csh,Java}

%Farben für schlüsselwörter
\definecolor{bluekeywords}{rgb}{0,0,1}
\definecolor{greencomments}{rgb}{0,0.5,0}
\definecolor{redstrings}{rgb}{0.64,0.08,0.08}
\definecolor{xmlcomments}{rgb}{0.5,0.5,0.5}
\definecolor{types}{rgb}{0.17,0.57,0.68}

\lstset{language=[Sharp]C,
captionpos=b,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
numbers=left, %Nummerierung
%numberstyle=\tiny, % kleine Zeilennummern
frame=lines, % Oberhalb und unterhalb des Listings ist eine Linie
showspaces=false,
showtabs=false,
breaklines=true,
showstringspaces=false,
breakatwhitespace=true,
escapeinside={(*@}{@*)},
commentstyle=\color{greencomments},
morekeywords={partial, var, value, get, set},
keywordstyle=\color{bluekeywords},
stringstyle=\color{redstrings},
basicstyle=\ttfamily\small,
lineskip=1pt,
literate={ö}{{\"o}}1
         {ä}{{\"a}}1
         {ü}{{\"u}}1
}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{%
  \hspace*{-0.4pt}\colorbox{blue}{\parbox{\dimexpr\textwidth-2\fboxsep+.8pt\relax}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

\lstdefinestyle{sharpc}{language=[Sharp]C, frame=lr, rulecolor=\color{blue!80!black}}

\begin{document}

\begin{lstlisting}[language={[Sharp]C}, firstnumber=242]
private void ModBus_Tx(string aModBus_String)[...]
\end{lstlisting}
\begin{lstlisting}[language={[Sharp]C}, caption={Modbus-Protokoll Tabpage}, label=rtxtmb, firstnumber=272]
private void ModBus_Rx(string aModBus_String)[...]
\end{lstlisting}

\end{document}
Hoffe es ist für ein Minimalbeispiel nicht zu lang, habe schon nur die Stellen rauskopiert, die ich für die Erstellung dieses Problem brauche.


Wie Du richtig vermutet hast, ist ersteres der Fall. Im tatsächlichen Code sind minimierte Codeblöcke und das sieht dann so aus, wie im Minimalbeispiel. Würde ich dieses Beispiel in eine Liste packen, wäre die zweite Zeile mit der Zahl "243" nummeriert. Ich möchte es so, wie es jetzt aussieht, nur halt in einer Liste.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

Hier werden gewöhnlich fast immer Minimalbeispiel erwartet.

Du könntest \thelstnumber ändern:
\documentclass[fontsize=12pt]{scrreprt}
\usepackage[left= 2.5cm,right = 2cm, bottom = 4 cm]{geometry}
\usepackage[onehalfspacing]{setspace}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
%Schriftpakete
\usepackage[T1]{fontenc}

\usepackage{listings}
\usepackage{xcolor}
\lstloadlanguages{C,C++,csh,Java}

%Farben für schlüsselwörter
\definecolor{bluekeywords}{rgb}{0,0,1}
\definecolor{greencomments}{rgb}{0,0.5,0}
\definecolor{redstrings}{rgb}{0.64,0.08,0.08}
\definecolor{xmlcomments}{rgb}{0.5,0.5,0.5}
\definecolor{types}{rgb}{0.17,0.57,0.68}

\lstset{language=[Sharp]C,
captionpos=b,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
numbers=left, %Nummerierung
%numberstyle=\tiny, % kleine Zeilennummern
frame=lines, % Oberhalb und unterhalb des Listings ist eine Linie
showspaces=false,
showtabs=false,
breaklines=true,
showstringspaces=false,
breakatwhitespace=true,
escapeinside={(*@}{@*)},
commentstyle=\color{greencomments},
morekeywords={partial, var, value, get, set},
keywordstyle=\color{bluekeywords},
stringstyle=\color{redstrings},
basicstyle=\ttfamily\small,
lineskip=1pt,
literate={ö}{{\"o}}1
         {ä}{{\"a}}1
         {ü}{{\"u}}1
}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{%
  \hspace*{-0.4pt}\colorbox{blue}{\parbox{\dimexpr\textwidth-2\fboxsep+.8pt\relax}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

\lstdefinestyle{sharpc}{language=[Sharp]C, frame=lr, rulecolor=\color{blue!80!black}}

\begin{document}
{%
\renewcommand*{\thelstnumber}{%
	\ifnum\value{lstnumber}=243
		\setcounter{lstnumber}{272}%
	\fi
	\arabic{lstnumber}%
}
\begin{lstlisting}[language={[Sharp]C}, caption={Modbus-Protokoll Tabpage}, label=rtxtmb, firstnumber=242]
private void ModBus_Tx(string aModBus_String)[...]
private void ModBus_Rx(string aModBus_String)[...]
\end{lstlisting}}% <- geändert
\end{document}
Wenn der englische Name "Listing" vor der gewählten Beschriftung keine Vorgabe ist, dann kann dieser ersetzt werden.

Nachtrag: In meinem Beispiel fehlte die schließende geschweifte Klammer nach dem Ende der lstlisting-Umgebung.
Zuletzt geändert von Bartman am Fr 31. Aug 2018, 23:56, insgesamt 3-mal geändert.

Gast

Beitrag von Gast »

Wie gesagt, kann man die Abstände über und unter Listings ändern. Und man kann auch nur mit einer Linie arbeiten:
\documentclass[a4paper,12pt]{scrreprt}
\usepackage[left= 2.5cm,right = 2cm, bottom = 4 cm]{geometry}
\usepackage[onehalfspacing]{setspace}

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
%Schriftpakete
\usepackage[T1]{fontenc}

\usepackage{listings}
\usepackage{xcolor}
\lstloadlanguages{C,C++,csh,Java}

%Farben für schlüsselwörter
\definecolor{bluekeywords}{rgb}{0,0,1}
\definecolor{greencomments}{rgb}{0,0.5,0}
\definecolor{redstrings}{rgb}{0.64,0.08,0.08}
\definecolor{xmlcomments}{rgb}{0.5,0.5,0.5}
\definecolor{types}{rgb}{0.17,0.57,0.68}

\lstset{language=[Sharp]C,
captionpos=b,
frame=single,
framesep=\fboxsep,
framerule=\fboxrule,
numbers=left, %Nummerierung
%numberstyle=\tiny, % kleine Zeilennummern
frame=lines, % Oberhalb und unterhalb des Listings ist eine Linie
showspaces=false,
showtabs=false,
breaklines=true,
showstringspaces=false,
breakatwhitespace=true,
escapeinside={(*@}{@*)},
commentstyle=\color{greencomments},
morekeywords={partial, var, value, get, set},
keywordstyle=\color{bluekeywords},
stringstyle=\color{redstrings},
basicstyle=\ttfamily\small,
lineskip=1pt,
literate={ö}{{\"o}}1
         {ä}{{\"a}}1
         {ü}{{\"u}}1
}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{%
  \hspace*{-0.4pt}\colorbox{blue}{\parbox{\dimexpr\textwidth-2\fboxsep+.8pt\relax}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}

\lstdefinestyle{sharpc}{language=[Sharp]C, frame=lr, rulecolor=\color{blue!80!black}}

\begin{document}

\begin{lstlisting}[language={[Sharp]C}, firstnumber=242,frame=t,belowskip=0pt]
private void ModBus_Tx(string aModBus_String)[...]
\end{lstlisting}
%$\vdots$
\begin{lstlisting}[language={[Sharp]C}, caption={Modbus-Protokoll Tabpage}, label=rtxtmb, firstnumber=272,frame=b,aboveskip=0pt]
private void ModBus_Rx(string aModBus_String)[...]
\end{lstlisting}

\end{document}
und natürlich könntest Du so zwischen den beiden Listings auch Pünktchen einfügen. Dazu einfach das % am Anfang der \vdots-Zeile entfernen.

19gonzo04
Forum-Newbie
Forum-Newbie
Beiträge: 8
Registriert: Fr 31. Aug 2018, 12:48

Vielen Dank

Beitrag von 19gonzo04 »

Vielen Dank für Eure Hilfe!
Ich habe es mit der Methode von Bartman gemacht, allerdings sahen beide Methoden optisch gleich aus. Allerdings hat Bartman es in einem Listings gepackt, was wahrscheinlich nachher für ein Quellcodeverzeichnis besser ist (Ja, ich weiß, das man die anderen künstlich herausnehmen kann).

Man kann die Funktion von Bartman beliebig erweitern, wie ich es gemacht habe:
\renewcommand*{\thelstnumber}{
   \ifnum\value{lstnumber}=105
      \setcounter{lstnumber}{151}
   \fi
   \ifnum\value{lstnumber}=152
      \setcounter{lstnumber}{191}
   \fi
   \ifnum\value{lstnumber}=192
      \setcounter{lstnumber}{242}
   \fi
   \ifnum\value{lstnumber}=243
      \setcounter{lstnumber}{272}
   \fi
   \ifnum\value{lstnumber}=273
      \setcounter{lstnumber}{299}
   \fi
   \ifnum\value{lstnumber}=300
      \setcounter{lstnumber}{303}
   \fi
   \arabic{lstnumber}
}
Ich schließe damit den Eintrag.

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Re: Vielen Dank

Beitrag von Bartman »

19gonzo04 hat geschrieben:Allerdings hat Bartman es in einem Listings gepackt, was wahrscheinlich nachher für ein Quellcodeverzeichnis besser ist (Ja, ich weiß, das man die anderen künstlich herausnehmen kann).
Die Einträge im Quelltextverzeichnis richten sich nach den Zuweisungen an die caption-Option. Das geschieht im Beispiel des Gastes nur einmal. Teste es einfach mit dem entsprechenden Befehl des Pakets.

Antworten