Figure über mehrere Seiten

Schriftbild, Absätze und Auflistungen einstellen


Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Figure über mehrere Seiten

Beitrag von Hugo »

Hallo.

Ich beabsichtige einige Zeilen Code von einem Programm und daneben einige Anmerkungen darzustellen. Gemacht hab ich es mit 2 minipages , in die ich eine verbatim-umgebung bzw. die Anmerkungen gepackt habe.

-----Minimalbeispiel--------
\documentclass{scrartcl}
\begin{document}

\begin{figure}
\begin{minipage}[t]{10cm}
\begin{verbatim}
%Hier einfach einige Zeilen einfügen, damit die umgebung größer als eine %Seite ist
\end{verbatim}
\end{minipage}
\begin{minipage}[t]{3cm}
%hier auch ein paar Zeilen eingeben
\end{minipage}
\end{figure}
\end{document}
Jetzt wird mein Code am unteren Seitenrand abgeschnitten.

Die kernfrage ist also:
Wie kann ich eine beliebige figure-umgebung über mehrere Seiten fließen lassen?

Danke für eure Hilfe!

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

Beitrag von KOMA »

Gar nicht. Gleitumgebungen können nicht über mehrere Seiten umbrochen werden. Eine einfache Lösung könnte sein, auf die figure-Umgebung zu verzichten. Falls es Dir um eine \caption geht, so kann diese außerhalb einer figure-Umgebung ggf. in der Form
\captionof{figure}[Verzeichniseintrag]{Titel}
erreicht werden. Die Anweisung steht in allen KOMA-Script-Klassen (also auch scrartcl) der aktuellen KOMA-Script-Release und wahlweise auch per Paket capt-of oder Paket caption zur Verfügung.

Im übrigen sei noch auf die Pakete listings (← dies ist ein geprüfter Link, der direkt zur Paketkurzbeschreibung auf CTAN führt!) und examplep (← dies ist ein geprüfter Link, der direkt zur Paketkurzbeschreibung auf CTAN führt!) hingewiesen, die bei Deinem Vorhaben eventuell hilfreich sein könnten.

Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Beitrag von Hugo »

Hallo KOMA,

danke für die schnelle Hilfe.
1. um die caption geht es mir nicht.
2. mit der examplep package und der darin empfohlenen sverb package kann man nur "source and sample" machen,d.h. latexcode auf der einen seite und daneben gleich das fertige ergebnis. die formatierung ist so, wie ich sie haben will, aber ich möchte dort wo das sample steht meine eigenen anmerkungen schreiben.

Weißt du dafür vielleicht eine Möglichkeit?
Wenn es wirklich nicht geht, dann muss ich halt den Code in A4-große Stücke zerlegen und mit minipages arbeiten.

Grüße, Hugo

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

Beitrag von KOMA »

Sollen die Anmerkungen an einer bestimmten Stelle relativ zum Quelltext stehen? Sind die Anmerkungen eher kurz (wenige Zeilen) oder eher umfangreich (nehmen eher genausoviel Platz wie der Code ein)? Kurze Anmerkungen könnte man ggf. leichter realisieren (listings, Randeinstellungen, marginnote-ähnliche Hacks ...). Bei wirklich parallelem Text dürfte es ähnliche Probleme wie bei parallelen mehrsprachigen Texten geben (siehe u. a. das Pakete parallels oder so ähnlich). Ich kenne derzeit auch kein Paket, mit dem man einfach zwei komplett unabhängige Spalten über mehrere Seiten nebeneinander setzen kann. Zwar müsste das theoretisch durchaus durch passende Änderung der output-Routine (oder sogar durch eine Erweiterung des framed-Pakets) erreichbar sein, aber solange niemand, der das braucht, das Fachwissen dafür aufbringt ...

Also ich möchte Dir keine große Hoffnungen machen, dass es eine komfortable, vollautomatische Lösung für das Problem gibt. Man kann, wenn man das Problem möglichst eng fasst, eventuell eine brauchbare Lösung finden.

Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Beitrag von Hugo »

Hallo KOMA,

die Anmerkungen sollen an bestimmten Stellen neben dem Quelltext stehen, sind aber nur sehr kurz. Weißt du da eine Lösung?

Viele Grüße

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

Beitrag von KOMA »

Keine fertige Lösung. Man könnte bei listings beispielsweise linewidth auf etwas wie .4\linewidth setzen und dann per escapechar-Option aus dem Listing ausbrechen, um dann via \vadjust die Anmerkungen hinter die aktuelle Zeile zu bekommen. In dem Fall wären die Anmerkungen direkt im Listing anzugeben. Man könnte aber auch das Listing stückweise ausgeben, ebenfalls wieder mit verkleinertem linewidth, wobei die Stücke jeweils an einer Anmerkung beginnen. Die Anmerkung setzt man dann einfach zurechts nach rechts verschoben. In dem Fall wären die Anmerkungen nicht im Listing selbst, sondern würden extra stehen. Hier mal ein Beispiel dafür:
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{listings}

\newsavebox\annotbox
\makeatletter
\newcommand*{\setannot}[1]{%
  \par
  \lstset{linewidth=.5\linewidth}%
  \savebox\annotbox{\parbox[tt]{.4\linewidth}{#1}}%
  \vspace{\dimexpr \ht\annotbox+\dp\annotbox\relax}%
  \vspace{-\dimexpr \ht\annotbox-\dp\annotbox\relax}%
  \hspace*{.6\linewidth}\usebox\annotbox\hspace{-\linewidth}%
  \\[-\dimexpr\ht\annotbox+\dp\annotbox+\lst@aboveskip+\dp\strutbox\relax]%
  \ignorespaces
}
\makeatother


\begin{document}

\lstset{language=[LaTeX]TeX,breaklines}

\section{Das ganze Listing}
\setannot{Dies ist eine Anmerkung zu dem nebenstehenden Listing}
\lstinputlisting{\jobname.tex}

\section{Das Listing st"uckweise mit Anmerkungen}
\setannot{Jede \LaTeX-Datei beginnt mit der Festlegung der Dokumentklasse}
\lstinputlisting[linerange={1-1}]{\jobname.tex}

\setannot{Danach kann man dann die Pakete laden}
\lstinputlisting[linerange={2-3}]{\jobname.tex}

\setannot{Eigene lokalen Definitionen k"onnen folgen.}
\lstinputlisting[linerange={5-20}]{\jobname.tex}

\setannot{Der Rest ist dann das eigentliche Dokument.}
\lstinputlisting[firstline=24]{\jobname.tex}

\end{document}

Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Beitrag von Hugo »

Vielen Dank,
das Minimalbeispiel sieht schon sehr gut aus. ich werde das listingpackage und deinen Code jetzt mal ganz in Ruhe durcharbeiten.

Gruß

Hugo

Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Beitrag von Hugo »

Hallo Koma,

kannst du bitte erklären, wie du die Anmerkung genau eingerückt hast? Also diese Zeilen hier:
\savebox\annotbox{\parbox{.4\linewidth}{#1}}%
\vspace{\dimexpr \ht\annotbox+\dp\annotbox\relax}%
\vspace{-\dimexpr \ht\annotbox-\dp\annotbox\relax}%
\hspace*{.6\linewidth}\usebox\annotbox\hspace{-\linewidth}%
\\[-\dimexpr\ht\annotbox+\dp\annotbox+\lst@aboveskip+\dp\strutbox\relax]%
\ignorespaces
Danke.

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

Beitrag von KOMA »

\savebox\annotbox{\parbox[tt]{.4\linewidth}{#1}}%
Die Anmerkung in einer Box der Breite 0.4\linewidth (das sind 40% der aktuellen Zeilenlänge) setzen und das Ergebnis in dem Boxregister \annotbox speichern (in Wirklichkeit wird da von LaTeX noch eine \hbox drumherum gepackt, aber das ist nicht so wichtig).
\vspace{\dimexpr \ht\annotbox+\dp\annotbox\relax}%
Vertikal um den Wert der Höhe und Tiefe der im Boxregister \annotbox gespeicherten Box nach unten gehen.
\vspace{-\dimexpr \ht\annotbox-\dp\annotbox\relax}%
Vertikal um den Wert der Höhe und Tiefe der im Boxregister \annotbox gespeicherten Box nach oben gehen.
Da \vspace am Seitenende ggf. nur bis zum Anfang der nächsten Seite geht und am Anfang einer Seite gar nichts macht, wird durch die beiden \vspace-Anweisungen sichergestellt, dass die Anmerkungen komplett auf die Seite passen - außer sind sie länger als eine Seite. Es wird also ggf. ein Seitenumbruch erzeugt, wenn die Anmerkung nicht mehr auf die Seite passen würde.
\hspace*{.6\linewidth}%
Um 0.6\linewidth (das sind 60% der aktuellen Zeilenlänge) nach rechts gehen. Aufgrund der Sternvariante passiert das auch am Zeilen-/Absatzanfang. Hm, da gehört eventuell noch ein \noindent davor.
\usebox\annotbox
Die im Boxregister \annotbox gespeicherte Box ausgeben.
\hspace{-\linewidth}%
Da wir jetzt am ende der Zeile sind, fahren wir wieder an den Anfang selbiger. Warum habe ich das eigentlich gemacht? Das ist vollkommen überflüssig weil wir jetzt:
\\[-\dimexpr\ht\annotbox+\dp\annotbox+\lst@aboveskip+\dp\strutbox\relax]%
einen Zeilenumbruch durchführen, dabei aber um die Höhe und Tiefe der im Boxregister \annotbox gespeicherten Box und um den Abstand, den listing am Anfang einer Listings-Umgebung einfügt und die Tiefe einer \strutbox wieder nach oben gehen.

Mit den ganzen vertikalen Abständen muss man eventuell noch ein wenig spielen. So sollte man vielleicht vor dem \hspace* noch ein \vspace{\lst@aboveskip} einfügen und am Ende statt \dp\strutbox sogar \baselineskip verwenden. Keine Ahnung. Kommt darauf an, ob das Ergebnis so schon gut aussieht, oder noch etwas daran stört.

\dimexpr ist übrigens eine e-TeX-Erweiterung. Das sollte aber kein Problem darstellen, da bereits seit Jahren e-TeX als Basis für LaTeX empfohlen wird, und das normalerweise auch bei allen modernen LaTeX-Distributionen so gemacht wird (außer man installiert ein System, das so minimal ist, dass gar kein e-TeX bzw. e-PDFTeX hat).

\savebox und \usebox sind AFAIK im usrguide erklärt und sollten in jeder ausführlichen LaTeX-Einführung zu finden sein (beispielsweise 3. Auflage des Praxisbuchs).

Hugo
Forum-Newbie
Forum-Newbie
Beiträge: 9
Registriert: Mi 2. Jun 2010, 17:33

Beitrag von Hugo »

ok, danke. dimexpr, dsavebox, usebox sind kein problem. ich wusste nur nichts mit den beiden vspaces am anfang und dem zeilenumbrauch am ende anzufangen. daumen hoch für dieses forum!

Antworten