Sie sind hier

caption width nur für eine Umgebung definieren

Hallo.

Mit koma script definiere ich

\setcapwidth[l]{\mycapbesidewidth}

Ausserdem habe ich mit floatrow eine eigene Umgebung für Abbildungen:

\floatsetup[myfigure]{
capposition=beside,
capbesideposition={bottom,inside},
capbesidewidth=\mycapbesidewidth,
}

Nun würde ich gerne nur für lstlistings die caption Größe ändern, weil hier die caption am Kopf und nicht daneben steht. Ein Zeilenumbruch verschwendet Platz. lstlistings übernimmt auch die koma-Einstellung für captions.
Da alle meine Abbildungen in myfigure Umgebungen stehen, könnte ich mit Koma \setcapwidth ändern. Seltsamerweise richten sich aber auch diese Abbildungen alle nach der Koma-Einstellung, und nicht nach der eigenen Option capbesidewidth=.

Wie stelle ich am einfachsten die caption Größe nur für die lstlistings um? Eine eigene Option hat das Paket nicht.

Bild von Markus Kohm

Zunächst einmal ist mir nur halb klar, was Dein Problem sein könnte. Wenn ich richtig vermute und Du außerdem die listings nicht gleiten lässt, dann könnte eine Gruppe um die Listings-Umgebung helfen. Innerhalb dieser Gruppe kannst Du dann \setcapwidth lokal verwenden. Mit gleitenden Listings-Umgebungen funktioniert das aber nicht.

Wobei mir absolut unklar ist, warum Du in dem Zusammenhang das floatrow-Paket überhaupt erwähnst.

Ich lasse die Listings nicht gleiten. Und wenn, dann auch mit floatrow.

Ich möchte für listings eine andere caption Weite haben, als für Abbildungen. Ich erwähnte das floatrow Paket, weil ich plante, die captions der Abbildungen mit floatrow einzustellen. Dann könnte ich die globale Einstellung für die listings verwenden.

Eine Gruppe? Du meinst, das Listing zusammen mit \setcapwidth in {} Klammern?
Könnte ich auch eine Umgebung \begin{mylisting} definieren, mit einem \setcapwidth darin?

Bild von Markus Kohm

Der Betreff sollte die Frage bereits beantworten. Ich bevorzuge für explizite Gruppen ohne eigene Umgebung übrigens \begingroup...\endgroup, weil das ggf. besser zu finden ist als geschweifte Klammern.

BTW: Statt solche Dinge nachzufragen, würde ich empfehlen, es einfach mal auszuprobieren. Das geht oft schneller und das Erfolgserlebnis aber auch die Erkenntnis bei Misserfolgt ist dann oft größer. Es spricht natürlich trotzdem nichts gegen weitere Nachfragen - sei es, um sich zu vergewissern, dass die gefundene Lösung gut ist, oder um eine bessere oder überhaupt eine Lösung zu erhalten. Auch dafür sind dann vollständige Minimalbeispiele nützlich.

D.h. ich würde alle lstlisting durch mylisting ersetzen, und die Optionen weitergeben.
Folgendes Beispiel kompiliert nicht:

%%
\documentclass{scrbook}
\usepackage{listings}
\setcapwidth[l]{5cm}
\newenvironment{mylisting}[1][]%
{\setcapwidth[l]{\textwidth}\begin{lstlisting}[#1]}%
{\end{lstlisting}\setcapwidth[l]{5cm}}

\begin{document}
\begin{mylisting}[caption={gpsd svn-Arbeitskopie auschecken}]
$ svn checkout http://svn.berlios.de/svnroot/repos/gpsd/trunk
\end{mylisting}
\end{document}

Das hat nun vlt. wenig mit Komascript zu tun, ich dachte ursprünglich es gäbe etwas Geschickteres, als für jede Umgebung die Einstellung hin- und zurückzustellen.

Bild von Markus Kohm

Natürlich geht das so nicht. lstlisting ist keine normale Umgebung, sondern hat wie alle verbatim-Umgebungen seine Eigenarten. Deshalb kann man sie nicht einfach innerhalb einer selbstdefinierten Umgebung verwenden. Damit man aber eigene Listing-Umgebungen definieren kann, verfügt listings über eine eigene Anweisung (siehe Listings-Anleitung, Abschnitt 4.16, »Environments«). Übrigens brauchst Du am Ende der Umgebung die caption-Breite nicht wieder zurückändern. Da die Änderung am Anfang der Umgebung nur lokal für die Umgebung gilt, ist nach der Umgebung automatisch wieder das gültig, was vor der Umgebung gültig war. (Fragt mich jetzt nicht, wer den letzten Satz verstehen soll.)

\documentclass{scrbook}
\usepackage{listings}
\setcapwidth[l]{5cm}
\lstnewenvironment{mylisting}[1][]{%
  \lstset{#1}%
  \setcapwidth[l]{\textwidth}%
}{%
% Am Ende ist nichts weiter zu tun.
}
\begin{document}
\noindent\hrulefill% nur, um die Breite des Satzspiegels zu sehen

\begin{mylisting}[caption={gpsd svn-Arbeitskopie auschecken und
    noch etwas  mehr an Text um zu sehen, dass es funktioniert}]
$svn checkout http://svn.berlios.de/svnroot/repos/gpsd/trunk
\end{mylisting}%$ <— Klammerpaarausgleich
\end{document}

Vielen Dank für die Hausaufgaben (?) :)
Das Ergebnis ist einwandfrei, mit dem Wissen über eigene lstlisting-Umgebungen öffnen sich mir noch weitere Möglichkeiten.

Allerdings kommt das Highlighting von kile damit ziemlich aus der Reihe. Durch $ in den Listings erscheint damit mal schnell der ganze Text grün wie Mathe.

Paolo

Bild von Markus Kohm

Bei emacs + auctex ist es so, dass das Syntax-Highlighting wieder stimmt, wenn man nach den Listings einen Kommentar einfügt, in dem man $ ausgleicht. Es stimmt dann natürlich erst, nach diesem Kommentar wieder, aber das ist schon sehr nützlich. Dieser Trick funktioniert übrigens nicht nur für $, sondern auch für andere Klammerpaare.

Falls das bei kile so nicht geht, wäre das vielleicht einen Feature-Request wert.

BTW: Ich habe die Erfahrung gemacht, dass auch Anfänger mit einem aktuellen emacs mit auctex (darin ist previewlatex bereits integriert) sehr gut zurecht kommen. Die Tastenkürzel sind zwar zunächst etwas ungewohnt – wobei man zumindest Copy&Paste-Kürzel per Menü anpassen kann – aber die meisten Anfänger verwenden heute ohnehin keine Tastaturkürzel, sondern nehmen die Maus, um in den Menüs und der Toolbar etwas auszuwählen. Das gilt übrigens auch für Windows-Benutzer, für die es auf den auctex-Seiten einen kompletten emacs mit vorinstalliertem auctex gibt. Ich erwähne das nicht, weil ich Leute von ihrem Lieblingseditor zu emacs bekehren will. Ich bin im Gegenteil der Meinung, dass jeder das nehmen sollte, womit er am besten zurecht kommt. Ich erwähne es nur, weil gegen emacs die absurdesten Vorurteile in Umlauf sind, die sich alle an emacs-Versionen orientieren, die schon seit zehn Jahren veraltet sind. Übrigens gilt das für vi ganz ähnlich.

Comments for "caption width nur für eine Umgebung definieren" abonnieren