Seite 1 von 2

newenvironment für shell-ausgaben soll verbatim nutzen

Verfasst: Mi 24. Nov 2010, 10:28
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]

Verfasst: Mi 24. Nov 2010, 11:20
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}

Verfasst: Mi 24. Nov 2010, 12:08
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)
:?:

Verfasst: Mi 24. Nov 2010, 13:58
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...

Verfasst: Mi 24. Nov 2010, 14:20
von KOMA
Füge vor dem \singlespacing ein \par ein oder erweitere den basicstyle um \linespead{1}\selectfont oder \setspace{1}.

Verfasst: Mi 24. Nov 2010, 14:42
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?

Verfasst: Mi 24. Nov 2010, 14:55
von KOMA
\endgraf statt \par verwenden

Verfasst: Mi 24. Nov 2010, 15:00
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.

Verfasst: Mi 24. Nov 2010, 15:02
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!

Verfasst: Mi 24. Nov 2010, 15:32
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 :)