lstlisting zu breit

Schriftbild, Absätze und Auflistungen einstellen


kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

lstlisting zu breit

Beitrag von kFieLd »

Hallo zusammen,

das Paket "listings" bereitet mir momentan zwei Probleme.

1. Das erzeugte Listing ist zu breit. D.h. es ragt über \textwidth hinaus. Ich hab in der Doku zu listings leider keine Einstellungsmöglichkeit für die Breite gefunden. Die im Minimalbeispiel auskommentierte resizebox erzeugt leider einige Kompilierfehler.
Es wäre glaube ich in Ordnung, wenn die Zeilennummerierung in den linken Rand hineinragt, jedoch soll die Box wirklich so breit sein wie \textwidth und nicht in den Rand ragen.

2. Das Listing hat zwar wie gewünscht abgerundete Ecken, jedoch scheint (beim Hineinzoomen im PDF-Betrachter und auf dem Papierausdruck) das Grau an den Ecken hinaus (so weit, als wären die Ecken nicht abgerundet).


Hier ist mal mein Minimalbeispiel:
\documentclass{scrreprt}

\usepackage{listings}
\usepackage{graphicx}
\usepackage{color}
\definecolor{listgray}{rgb}{0.88,0.88,0.88}


\begin{document}

%lstlisting Einstellungen
\lstset{
language=Matlab,
tabsize=2,
showspaces=false,
showstringspaces=false,
backgroundcolor=\color{listgray},
float=[htb],
captionpos=b,
basicstyle=\footnotesize,
frame=tbrl, %t: top, r, b, l
frameround=tttt,
numbers=left, 
numberstyle=\tiny,
numberblanklines=false,
}

%%%%%%%%
%Linie um die Textbreite darzustellen
\rule{\textwidth}{1mm}

%\resizebox{\textwidth}{!}
{
	\begin{lstlisting}[float,caption={Beschriftung},label=fig:matlab]
	Var = A ./ B;
	A = Var .* B;
	\end{lstlisting}
}
\end{document}
Hoffe, ihr könnt mir helfen.

Danke,
kFieLd

Edit: Am liebsten hätte ich den Quelltext in einer Figure-Umgebung (wegen der fortlaufenden Beschriftung als "Abbildung")
\begin{figure}
	\begin{lstlisting}
	Var = A ./ B;
	A = Var .* B;
	\end{lstlisting}
	\caption{Beschriftunglabel \label{fig:matlab}}
\end{figure}
Jedoch bleiben hier obige Probleme bestehen.

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

Beitrag von KOMA »

listings setzt nicht das Listing innerhalb des Rahmens, sondern legt den Rahmen um das Listing. Anders gesagt, das Listing hat die aktuell zulässige Breite und der Rahmen ragt darüber hinaus. Ich habe jetzt in der Anleitung nicht nachgelesen, ob man das ändern kann, weil es für das, was Du willst, eine einfache Lösung gibt: Rahmen rausrechnen:
\documentclass{scrreprt} 

\usepackage{listings} 
\usepackage{graphicx} 
\usepackage{color} 
\definecolor{listgray}{rgb}{0.88,0.88,0.88} 


\begin{document} 

% lstlisting Einstellungen 
\lstset{ 
  language=Matlab, 
  tabsize=2, 
  showspaces=false, 
  showstringspaces=false, 
  backgroundcolor=\color{listgray}, 
  float=[htb], 
  captionpos=b, 
  basicstyle=\footnotesize, 
  frame=tbrl, %t: top, r, b, l 
  frameround=tttt, 
  numbers=left, 
  numberstyle=\tiny, 
  numberblanklines=false, 
} 
 
%%%%%%%% 
% Linie um die Textbreite darzustellen 
\noindent\rule{\textwidth}{1mm} 

\begin{figure}
\hspace*{\dimexpr\fboxsep+\fboxrule}%
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule}
\begin{lstlisting}
    Var = A ./ B; 
    A = Var .* B; 
\end{lstlisting} 
\end{minipage}
\caption{Beschriftung}\label{fig:matlab}
\end{figure}
\end{document}
Falls die Nummerierung, die ebenfalls außerhalb des aktuell gültigen Bereichs erfolgt, auch noch herausgerechnet werden soll, muss man die dafür verwendete Breite ebenfalls abziehen und den Abstand links entsprechend erhöhen. Die verwendete Breite ist allerdings von der größten verwendeten Zeilennummer abhängig. Man wird da also einen über den Daumen gepeilten einheitlichen Bereich reservieren müssen, beispielsweise:
\documentclass{scrreprt} 

\usepackage{listings} 
\usepackage{graphicx} 
\usepackage{color} 
\definecolor{listgray}{rgb}{0.88,0.88,0.88} 


\begin{document} 

% lstlisting Einstellungen 
\lstset{ 
  language=Matlab, 
  tabsize=2, 
  showspaces=false, 
  showstringspaces=false, 
  backgroundcolor=\color{listgray}, 
  float=[htb], 
  captionpos=b, 
  basicstyle=\footnotesize, 
  frame=tbrl, %t: top, r, b, l 
  frameround=tttt, 
  numbers=left, 
  numberstyle=\tiny, 
  numberblanklines=false, 
} 
 
%%%%%%%% 
% Linie um die Textbreite darzustellen 
\noindent\rule{\textwidth}{1mm} 

\begin{figure}
\hspace*{\dimexpr\fboxsep+\fboxrule+2em}%
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule-2em}
\begin{lstlisting}
    Var = A ./ B; 
    A = Var .* B; 
\end{lstlisting} 
\end{minipage}
\caption{Beschriftung}\label{fig:matlab}
\end{figure}
\end{document}
Übrigens: Danke für das tolle Minimalbeispiel. Das hat sich sehr schön auf das beschränkt, worum es geht, und war ideal, um meine Lösungsidee auszuprobieren.

Achja: lstlisting ist eine Umgebung, die ähnlich wie verbatim mit allerlei Tricks arbeitet und deshalb in der Regel nicht im Argument einer Anweisung verwendet werden kann (dann liest nämlich diese Anweisung das Argument und lstlisting hat nicht mehr die Möglichkeit, seine Tricks anzubringen). Deshalb dürfte der \resizebox-Versuch daneben gegangen sein.

Da fällt mir noch etwas ein: Oben passt vermutlich der Abstand zwischen Listing und caption nicht. In dem Fall hilft ein "belowskip=0pt" bei \lstset.

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

Hallo KOMA,

vielen Dank für die schnelle Antwort und das Lob!

Das "belowskip=0pt" habe ich gleich eingefügt.

Ich habe deinen ersten Ansatz weiter verfolgt, und durch probieren die Dimensionen noch etwas genauer bestimmt:
\hspace*{\dimexpr\fboxsep+\fboxrule+0.55pt}%
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule-1.1pt} 
Das wollte ich nun als eine neue Umgebung definieren (habs vorher noch nie gemacht) mit
\newenvironment{mylisting}%
{\hspace*{\dimexpr\fboxsep+\fboxrule+0.55pt}%
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule-1.1pt}%
\begin{lstlisting}%
}%
{\end{lstlisting}%
\end{minipage}%
}
Beim Kompilieren erhalte ich damit jedoch einen "Emergency stop".

Wie wird's richtig gemacht?

Nachdem Problem 1 jetzt so gut wie gelöst ist, bleibt die Frage, ob man auch das 2. Problem aus meinem ersten Posting noch beheben kann. Ich befürchte ja mal, dass sich das nicht so leicht ändern lässt...

Viele Grüße,
kFieLd

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

Beitrag von KOMA »

In der listings-Anleitung steht irgendwo, wie man eigene Umgebungen definiert, die lstlistings verwenden. Ich komme gerade vom Streichen und fühle mich von der lösemittelarmen Holzlasur so besoffen, dass Du das besser selbst nachschlägst. :P :shock: :lol: :oops:

Ich vermute, dass die -1.1pt durch das Abrunden der Ecken kommt. Kann aber auch sein, dass listings gar nicht \fboxsep für den Abstand und \fboxrule für die Linienbreite verwendet. Egal. Hauptsache, Du kommst klar.

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

KOMA hat geschrieben:In der listings-Anleitung steht irgendwo, wie man eigene Umgebungen definiert, die lstlistings verwenden. Ich komme gerade vom Streichen und fühle mich von der lösemittelarmen Holzlasur so besoffen, dass Du das besser selbst nachschlägst.
Hehe, ja, Farbe kann schon mal ganz schön verwirrend wirken :)

Hab zwar den entsprechenden Abschnitt in der Anleitung gefunden, aber mit diesem Code funktioniert es leider nicht:
\lstnewenvironment{mylisting}%
{\hspace*{\dimexpr\fboxsep+\fboxrule+0.55pt}%
\begin{minipage}{\dimexpr\textwidth-2\fboxsep-2\fboxrule-1.1pt}%
% \begin{lstlisting}%
}{%
% \end{lstlisting}%
\end{minipage}%
}
So bekomme ich wieder einen "Emergency stop".

Wenn ich das \begin{lstlisting} und \end{lstlisting} drin hab, erhalte ich beim Kompilieren "Missing \endcsname inserted \begin{mylisting}"

Die listings-Anleitung beschreibt auch nur den Fall, dass ich verschiedene lstset-Definitionen in das \lstnewenvironment einbringe.


Kann mir da noch wer weiterhelfen?

Danke,
kFieLd

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

Beitrag von KOMA »

Bei mir funktioniert:
\documentclass{scrreprt} 
 
\usepackage{listings} 
\usepackage{graphicx} 
\usepackage{color} 
\definecolor{listgray}{rgb}{0.88,0.88,0.88} 

\lstnewenvironment{mylisting}{%
  \hspace*{\dimexpr\fboxsep+\fboxrule+.55pt}%
  \minipage{\dimexpr\textwidth-2\fboxsep-2\fboxrule-1.1pt}% 
}{%
  \endminipage
}

\begin{document} 

% lstlisting Einstellungen  
\lstset{ 
  language=Matlab, 
  tabsize=2, 
  showspaces=false, 
  showstringspaces=false, 
  backgroundcolor=\color{listgray}, 
  float=[htb], 
  captionpos=b, 
  basicstyle=\footnotesize, 
  frame=tbrl, %t: top, r, b, l  
  frameround=tttt, 
  numbers=left, 
  numberstyle=\tiny, 
  numberblanklines=false, 
} 
   
%%%%%%%% 
% Linie um die Textbreite darzustellen  
\noindent\rule{\textwidth}{1mm} 
 
\begin{figure} 
 \begin{mylisting} 
     Var = A ./ B; 
     A = Var .* B; 
 \end{mylisting} 
 \caption{Beschriftung}\label{fig:matlab} 
 \end{figure} 
\end{document}

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

Interessant!

Wie kommt man darauf, dass man in Definitionen das \begin{minipage} durch \minipage ersetzen muss?

Jedenfalls besten Dank KOMA!
So funktioniert es auch bei mir.

Viele Grüße,
kFieLd

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

Beitrag von KOMA »

"Man" weiß, dass bei LaTeX Umgebungen als \foo und \endfoo definiert sind, hat Anleitungen wie die zum Paket verbatim mal gelesen, hat vielleicht irgendwann einmal festgestellt, dass bei etwas wie:
\documentclass{article}
\newenvironment{FOO}{\begin{quote}}{\end{quote}}
\begin{document}
\begin{FOO}
Test
\end{falsch}
\end{document}
die Fehlermeldung für den Anwender eher verwirrend ist, wenn er die Definition von FOO nicht kennt. Hat vielleicht auch verstanden, warum diese verwirrende Fehlermeldung das Resultat sein muss, und deshalb auch verstanden, dass dies hier:
\documentclass{article}
\newenvironment{FOO}{\quote}{\endquote}
\begin{document}
\begin{FOO}
Test
\end{falsch}
\end{document}
Vorteile bringt und kommt deshalb schon gar nicht mehr auf die Idee, es anders zu machen (seltene Ausnahme ist die lrbox-Umgebung, die speziell darauf getrimmt ist in der Definition einer anderen Umgebung verwendet zu werden).

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

Dankeschön für die Erklärung.

Bezüglich des 2. Problems (der graue Hintergrund ragt über die abgerundeten Ecken hinaus) habe ich gerade eine E-Mail an den listings-Paketautoren Brooks Moses geschrieben. Mal schauen, was er dazu sagt.

kFieLd
Forum-Anfänger
Forum-Anfänger
Beiträge: 13
Registriert: Mi 18. Feb 2009, 10:18

Beitrag von kFieLd »

kFieLd hat geschrieben: Bezüglich des 2. Problems (der graue Hintergrund ragt über die abgerundeten Ecken hinaus) habe ich gerade eine E-Mail an den listings-Paketautoren Brooks Moses geschrieben. Mal schauen, was er dazu sagt.
Leider hat er bisher nicht auf die E-Mail geantwortet. Möglicherweise ist sie ja in seinem Spam-Ordner gelandet...

Antworten