newenvironment für shell-ausgaben soll verbatim nutzen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


ChrisPZV
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mi 24. Nov 2010, 09:23

newenvironment für shell-ausgaben soll verbatim nutzen

Beitrag von ChrisPZV »

Moin Leute,

ich möchte gerne innerhalb einer Arbeit Ausgaben von Shell-Befehlen angeben. Die Arbeit selbst nutzt einen Zeilenabstand von 1,5 (\linespread{1.5}).
Ausgaben der Shell kann ich ganz leicht mit
\begin{verbatim}
foo ~# ausgabe
\end{verbatim}
einbauen. Um mehrzeilige Ausgaben nicht unnötig Platz verbraten zu lassen habe ich davor noch mit \singlesspacing und \onehalfspacing gearbeitet:
\singlesspacing
\begin{verbatim}
foo ~# ausgabe
\end{verbatim}
\onehalfspacing
Bis hierher funktionerit das auch wunderbar aber ab der zweiten Shell-Ausgabe will aus dem spacing-verbatim-Konstrukt doch gerne ein environment basteln (Jetzt als Minimalbeispiel):
\documentclass[10pt, a4paper]{article}				% 10pt schriftgröße, DIN A4, Artikel
\usepackage[a4paper,left=2.5cm,right=2cm,top=2.5cm,bottom=2.5cm]{geometry}
\linespread{1.5} 									% Zeilenabstand 1,5
\usepackage{setspace}								% \singlesspacing | \onehalfspacing
\usepackage[ngerman]{babel}							% deutsche rechtschreibprüfung/silbentrennung
\usepackage[utf8]{inputenc}							% utf8 codierte .tex dateien
\usepackage[T1]{fontenc}							% korrekte umlaute im ausgabedokument
\usepackage[style=numeric-comp,hyperref]{biblatex}	% Literaturverzeichnis-Style
\usepackage{blindtext}

\newenvironment{shell} {
	\singlesspacing
	\begin{verbatim}
	} {
	\end{verbatim}
	\onehalfspacing
}



\begin{document}
\section{Meine Verbatimumgebung will nicht so wie ich wohl will}
Die folgende Shell-Ausgabe sollte nicht wie dieser Text hier mit 1,5-zeiligem Abstand erfolgen sondern mit einzeiligem Zeilenabstand. \blindtext

\begin{shell}
~ $ lsusb
Bus 002 Device 023: ID 0ac8:307b Z-Star Microelectronics Corp. USB 1.1 Webcam
Bus 002 Device 015: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
~ $
\end{shell}

\end{document}
Fehlermeldungen:
  • Undefined control sequence \begin{shell}
  • File ended while scanning use of \@xverbatim
Vor allem die zweite Meldung in Verbindung mit mit diesem Forenbeitrag hat mich auch das hier probieren lassen:
\newenvironment{shell} {
	\singlesspacing
	\verbatim % hier...
	} {
	\endverbatim %... und hier wurde geändert
	\onehalfspacing
}
Allerdings bleiben exakt die gleichen Fehlermeldungen und weil ich den genannten Forenbeitrag nicht wirklich verstehen konnte hier nun meine Anfrage: Wie bekomme ich diese gewünschte Ausgabe in verbatim und einzeilig, mit Hilfe eines neuen environments oder mit einer anderen eleganten Lösung?[/url]
Gruß
Christian

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

Wie wärs mit dem listings-Paket statt verbatim? Damit kann man das ganz komfortabel machen:
\documentclass[10pt, a4paper]{article}            % 10pt schriftgröße, DIN A4, Artikel 
\usepackage[a4paper,left=2.5cm,right=2cm,top=2.5cm,bottom=2.5cm]{geometry} 
\linespread{1.5}                            % Zeilenabstand 1,5 
\usepackage{setspace}                        % \singlesspacing | \onehalfspacing 
\usepackage[ngerman]{babel}                     % deutsche rechtschreibprüfung/silbentrennung 
\usepackage[ansinew]{inputenc}                     % utf8 codierte .tex dateien 
\usepackage[T1]{fontenc}                     % korrekte umlaute im ausgabedokument 
%\usepackage[style=numeric-comp,hyperref]{biblatex}   % Literaturverzeichnis-Style 
\usepackage{blindtext} 
\usepackage{listings}

\lstnewenvironment{shell}{%
\singlespacing  
\lstset{columns=fullflexible, basicstyle=\ttfamily}%
}{%
\onehalfspacing
} 

\begin{document} 
\section{Meine Verbatimumgebung will nicht so wie ich wohl will} 
Die folgende Shell-Ausgabe sollte nicht wie dieser Text hier mit 1,5-zeiligem Abstand erfolgen sondern mit einzeiligem Zeilenabstand. \blindtext 

\begin{shell} 
~ $ lsusb 
Bus 002 Device 023: ID 0ac8:307b Z-Star Microelectronics Corp. USB 1.1 Webcam 
Bus 002 Device 015: ID 0e0f:0002 VMware, Inc. Virtual USB Hub 
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 
~ $ 
\end{shell} 

\blindtext

\end{document}

ChrisPZV
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mi 24. Nov 2010, 09:23

Beitrag von ChrisPZV »

Perfekt, das war die richtige Fährte!

Weil ich aber ebenso im Dokument auch Listings benutze und mir dafür mein eigenes Layout geschnitzt habe, bin ich natürlich nicht darauf gekommen. Die von dir gezeigte Lösung scheint sich aber mit meiner Listingskonfiguration zu vertragen, gelöst habe ich das ganze jetzt wie folgt:
\documentclass[10pt, a4paper]{article}            % 10pt schriftgröße, DIN A4, Artikel
\usepackage[a4paper,left=2.5cm,right=2cm,top=2.5cm,bottom=2.5cm]{geometry}
\linespread{1.5}                            % Zeilenabstand 1,5
\usepackage{setspace}                        % \singlesspacing | \onehalfspacing
\usepackage[ngerman]{babel}                     % deutsche rechtschreibprüfung/silbentrennung
\usepackage[ansinew]{inputenc}                     % utf8 codierte .tex dateien
\usepackage[T1]{fontenc}                     % korrekte umlaute im ausgabedokument
\usepackage[style=numeric-comp,hyperref]{biblatex}   % Literaturverzeichnis-Style
\usepackage{blindtext}
\usepackage{xcolor}
\usepackage{listings}

% mein setup f\"{u}r c/c++-Listings, darf nicht ver\"{a}ndert werden
\definecolor{darkblue}{rgb}{0,0,.75}
\definecolor{darkred}{rgb}{.75,0,0}
\definecolor{darkgreen}{rgb}{0,.75,0}
\definecolor{red}{rgb}{.98,0,0}

\lstset{
	language=C++,
	showstringspaces=false,
	basicstyle=\ttfamily\small,
	keywordstyle=\color{darkblue},
	commentstyle=\color{darkgreen},
	stringstyle=\color{darkred},
	numbers=left,
	tabsize=4,
	breaklines=true,
	breakatwhitespace= true,
	frame=tlrb
}


\lstnewenvironment{shell}{
	\singlespacing  
	\lstset{
		columns=fullflexible,
		language=bash,
		showstringspaces=false,
		basicstyle=\ttfamily,
		keywordstyle=\color{black},
		commentstyle=\color{black},
		stringstyle=\color{black},
		numbers=none,
		tabsize=4,
		breaklines=true,
		breakatwhitespace= true,
		frame=none
}
}{}

\begin{document}
\section{Meine Verbatimumgebung will nicht so wie ich wohl will}
Die folgende Shell-Ausgabe sollte nicht wie dieser Text hier mit 1,5-zeiligem Abstand erfolgen sondern mit einzeiligem Zeilenabstand. \blindtext

\begin{shell}
~ $ lsusb
Bus 002 Device 023: ID 0ac8:307b Z-Star Microelectronics Corp. USB 1.1 Webcam
Bus 002 Device 015: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
~ $
\end{shell}

\section{Vergleichslisting mit C/C++ - Code}
Hier mein listing:
\begin{lstlisting}[caption=Listing direkt im Quelltext]
/* Kommentar: eine for - Schleife */
for (unsigned char x = 0; x < BUFFERSIZE; x++) {
	if (x == 0) {
		fprintf(stdout, "data[%#4x] =\n", BUFFERSIZE);
	}
}
\end{lstlisting}
\blindtext
\end{document}
Ich musste nur in dem \lstenvironment Rahmen und Zeilennummern abstellen sowie die styles explizit auf Schwarz stellen, damit sie nicht die Einstellungen von meinem globalen \lstset erben und dann funktionert es. Übrigens besser als ich dachte, ich muss nicht einmal den Zeilenabstand nach dem env. zurücksetzen, das macht die Sache deutlich flexibler.
Tausend Dank!

P.S.: ich muss das package 'biblatex' mit einbinden, sonst:
This is BibTeX, Version 0.99c (TeX Live 2009/Debian)
The top-level auxiliary file: minimalbeispiel_verbatim_spacing.aux
I found no \citation commands---while reading file minimalbeispiel_verbatim_spacing.aux
I found no \bibdata command---while reading file minimalbeispiel_verbatim_spacing.aux
I found no \bibstyle command---while reading file minimalbeispiel_verbatim_spacing.aux
(There were 3 error messages)
:?:
Gruß
Christian

ChrisPZV
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mi 24. Nov 2010, 09:23

Beitrag von ChrisPZV »

Einen kleinen Bug habe ich in der Lösung doch noch gefunden, der im Minimalbeispiel nicht auftaucht: Die Wirkung des \singlespacing weitet sich manchmal auf den vorhergehenden ( ! ) Absatz aus, dessen Zeilen stehen dann auch näher beieinander. Das kann man erst einmal umgehen, wenn man einfach vor dem \begin{shell} eine Leerzeile im Quelltext einfügt. Genau das widerspricht aber ja dem Prinzip der Vereinfachung durch das neue Environment...

Ich habe versucht, das eleganter zu lösen, indem ich ein weiteres Environment um das \lstenvironment schachtele aber mit
\lstnewenvironment{lstshell}{
	\lstset{
		columns=fullflexible,
		language=bash,
		showstringspaces=false,
		basicstyle=\ttfamily,
		keywordstyle=\color{black},
		commentstyle=\color{black},
		stringstyle=\color{black},
		numbers=none,
		tabsize=4,
		breaklines=true,
		breakatwhitespace=true,
		frame=none}
}{}

\newenvironment{shell}{
	\singlespacing
	\begin{lstshell}
}
{
	\end{lstshell}
}
bin ich gescheitert. Der Compiler gibt mir damit einen "Emergency stop".
Ich nehme an, dass ich da auf das im oben verlinkten Thread beschriebene Problem stoße...
Gruß
Christian

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Füge vor dem \singlespacing ein \par ein oder erweitere den basicstyle um \linespead{1}\selectfont oder \setspace{1}.

ChrisPZV
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mi 24. Nov 2010, 09:23

Beitrag von ChrisPZV »

KOMA hat geschrieben:Füge vor dem \singlespacing ein \par ein [...]
Stimmt an ein \par einfügen habe ich auch schon mal gedacht aber das quittiert der Kompiler mit "Paragraph ended before \lstnewenvironment@ was complete \par".
KOMA hat geschrieben:[...] erweitere den basicstyle um \linespead{1}\selectfont [...]
Das kompiliert, aber ändert nicht den Zeilenabstand in den Zeilen über dem \begin{shell}.
KOMA hat geschrieben:[...] erweitere den basicstyle um [...] \setspace{1}.
Der Versuch endet mit derFehlermeldung "Undefined control sequence \begin{shell}".
:-| Danke dir trotzdem, jeder plausibel klingende Vorschlag macht ein bißchen Hoffnung...
Habt ihr noch weitere Ideen?
Gruß
Christian

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

\endgraf statt \par verwenden

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

ChrisPZV hat geschrieben:
KOMA hat geschrieben:[...] erweitere den basicstyle um \linespead{1}\selectfont [...]
Das kompiliert, aber ändert nicht den Zeilenabstand in den Zeilen über dem \begin{shell}.
Du musst im Gegenzug zu der Änderung das \singlespacing natürlich aus der Definition der Umgebung entfernen.
KOMA hat geschrieben:Füge vor dem \singlespacing ein \par ein oder erweitere den basicstyle um \linespead{1}\selectfont oder \setspace{1}.
Fehler meinerseits. Das muss natürlich \setstretch{1} und nicht \setspace{1} heißen. Auch da gilt dann natürlich, dass im Gegenzug das \singlespacing entfernt werden muss.

ChrisPZV
Forum-Anfänger
Forum-Anfänger
Beiträge: 17
Registriert: Mi 24. Nov 2010, 09:23

Beitrag von ChrisPZV »

Klasse, so funktioniert's!
Hier noch mal meine funktionierende Environment-Deklaration für die Nachwelt:
\lstnewenvironment{shell}{
	\endgraf
	\singlespacing
	\lstset{
		columns=fullflexible,
		language=bash,
		showstringspaces=false,
		basicstyle=\ttfamily,
		keywordstyle=\color{black},
		commentstyle=\color{black},
		stringstyle=\color{black},
		numbers=none,
		tabsize=4,
		breaklines=true,
		breakatwhitespace=true,
		frame=none}
}{}
Vielen vielen vielen Dank für eure, mir geschenkte, Freizeit!
Gruß
Christian

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

So höflichen und vorbildlichen Fragestellern, die ein lauffähiges Minimalbeispiel mit aussagekräftiger Fehlerbeschreibung und eigenen Versuchen liefern und dann auch noch Rückmeldung geben, wie sie es gelöst haben, hilft man immer wieder gern :)

Antworten