PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : makecaption und minipage



stator
08-11-2007, 20:39
Hi!

Ich schreibe grade eine Arbeit mit Latex und da ist eine Styledatei vorgeschrieben, die ich verwenden muss. In dieser Datei sind die captions für die figures umdefiniert worden. Für captions die über mehrere Zeilen gehen funktioniert das bei einer reinen figures Umgebung sehr gut. Allerdings wenn ich zwei Bilder mittels minipages nebeneinander platziere und dort ebenfalls captions über mehrere Zeilen habe spinnt die Ausgabe. Ich verstehe mich zwar relativ gut mit Latex, aber mit style-Dateien hatte ich noch nie was am Hut. Vielleicht könnt ihr mir weiterhelfen. Ich hab schon gegooglet und hier im Forum gesucht, allerdings hab ich nichts brauchhaftes gefunden. Eventuell weiß ja auch jemand, ob es irgendwo eine Beschreibung für solche Styledateien gibt. Vielen Dank schonmal!

Hier nochmal das Minimalbeispiel.

test.tex:
\documentclass{article}
\usepackage{teststyle}

\begin{document}

\begin{figure}
\centering
\begin{minipage}[b]{.4\linewidth}
{\rule{5cm}{5cm}}
\caption{test test test test test test test test test test test test test test test test test test test test test test test test test test}
\end{minipage}
\hfill
\begin{minipage}[b]{.4\linewidth}
{\rule{5cm}{5cm}}
\caption{test test test test test test test test test test test test test test test test test test test test test test test test test test}
\end{minipage}
\end{figure}

\begin{figure}
\centering
{\rule{5cm}{5cm}}
\caption{test test test test test test test test test test test test test test test test test test test test test test test test test test}
\end{figure}

\end{document}


teststyle.sty:
\newlength{\captwidth}
\setlength{\captwidth}{\linewidth}
\addtolength{\captwidth}{-10mm}
\newlength{\captind}
\setlength{\captind}{10mm}

\renewcommand\figurename{Abb.}

\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{{\footnotesize \textsc{#1}: #2}}%
\ifdim \wd\@tempboxa > \captwidth
\hspace{\captind}\parbox[t]{\captwidth}{{\footnotesize \textsc{#1}.: #2}} %
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip
}

localghost
08-11-2007, 21:18
Den ganzen Murks aus der STY-Datei kannst Du dir eigentlich sparen. Lies mal in der Anleitung zu caption (http://dante.ctan.org/CTAN/help/Catalogue/entries/caption.html) nach, wie Du diese Anpassungen vornehmen kannst. Dazu musst Du vielleicht mal vergleichen, wie deine Beschreibungen gesetzt werden sollen und wie Standard-LaTeX sie setzt. Dann kannst Du diese Einstellungen bestimmt auch komplett mit caption (http://dante.ctan.org/CTAN/help/Catalogue/entries/caption.html) vornehmen. Schriftgrößen und -stile sind da schon mal kein Problem.


MfG und einem herzlichen Willkommen an Board
Thorsten

sommerfee
09-11-2007, 07:57
Ich verstehe mich zwar relativ gut mit Latex, aber mit style-Dateien hatte ich noch nie was am Hut.

In diesem Falle braucht man damit nicht viel am Hut zu haben, man muß in diesem Falle lediglich wissen, wofür \@makecaption gut ist - es setzt im Endeffekt den Text der \caption. (Wird allerdings nur von den Standard-Umgebung figure und table verwendet, nicht von longtable, von mit \newfloat definierten Umgebungen, ... Nicht umsonst enthält das caption-Paket Anpassungen an 15 andere Pakete.)

Wir können den Code ja mal zusammen durchgehen:


\newlength{\captwidth}
\setlength{\captwidth}{\linewidth}
\addtolength{\captwidth}{-10mm}

Es wird eine Länge \captwidth definiert, die angeben soll, wie breit die Abbildungsbeschriftung später gesetzt werden soll. Diese Länge wird auf \linewidth - 10mm gesetzt.

Fehler #1: Wird \linewidth später geändert, dann wird \captwidth nicht angepasst - daraus resultiert auch dein Problem mit den Minipages.



\newlength{\captind}
\setlength{\captind}{10mm}

Diese Länge bestimmt den linken Rand vor der Abbildungsbeschriftung.

Fehler #2: Wenn man diesen Wert nachträglich verändert, wird \captwidth nicht automatisch auf \linewidth - \captind angepasst, so daß die Ausgabe wieder sinnvoll wird.



\renewcommand\figurename{Abb.}

Der Name der Abbildungen wird von "Abbildung" auf "Abb." gesetzt.

Fehler #3: So funktioniert das nicht zusammen mit dem Babelpaket, da bleibt diese Zeile ohne Wirkung.

Nun der eigentliche Code, der die Beschriftung setzt:


\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{{\footnotesize \textsc{#1}: #2}}%
\ifdim \wd\@tempboxa > \captwidth
\hspace{\captind}\parbox[t]{\captwidth}{{\footnotesize \textsc{#1}.: #2}} %
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip
}

Wenn man dies mit dem Originalcode aus article.cls/report.cls/book.cls vergleicht, sieht man sehr schön die Unterschiede:

1. Der Text wird in \footnotesize gesetzt
2. Das Label wird zusätzlich in Small Caps gesetzt
3. Die Beschriftung wird - sobald breiter als \captwidth - in eine \parbox mit der Breite \captwidth gesetzt, ansonsten zentriert.

Fehler #4: Die Labelbeschriftung ist inkonsistent, "kurze" Beschriftungen werden als "\textsc{#1}:", lange aber als "\textsc{#1}.:" (also mit einem Punkt vor dem Doppelpunkt) gesetzt.

Wie localghost schon angedeutet hat, kann man genau dieses Ergebnis, allerdings ohne die vier Fehler, auch mit dem caption-Paket erreichen. Ich würde dies wie folgt codieren:



\usepackage[figurename=Abb.]{caption}[2007/10/25]
\DeclareCaptionStyle{test}[margin=5mm,justification=centering]{font=footnotesize,labelfont=sc,margin={10mm,0mm}}
\captionsetup{style=test}


ACHTUNG: Funktioniert so erst ab dem caption-Paket v3.1, nicht mit älteren Versionen.

Wenn allerdings das fehlerhafte Paket "teststyle.sty" von dir verwendet werden MUSS, dann melde mich nochmal kurz, damit ich dir einen Workaround diesbezüglich basteln kann. Oder du hälst dem Autor des Paketes die vier Fehler unter die Nase.

Liebe Grüße,
Axel

stator
09-11-2007, 20:01
Hi!

Erstmal danke für die schnelle Hilfe, theoretisch spricht nichts gegen das Benutzten des caption-Pakets. So wie ich das verstanden habe macht das caption Paket genau das gleiche nur halt besser und mit weniger Fehlern.

Leider ist mir da noch was aufgefallen, ich benutzte die documentclass report und zwar mit der twoside Option (stimmt bei meinem Minimalbeispiel oben nicht). Ich hab in der caption Beschreibung nachgeschaut und dort ebenfalls eine twoside Option gefunden, leider funktioniert die nicht so wie ich will (auf den geraden Seitenzahlen wird die caption margin 10mm hinten der Zeile eingefügt und nicht davor) bzw. weiß ich nicht genau wo ich diese Option eintragen muss. Mit dem teststyle-Packet funktioniert das. Hoffe ihr versteht was ich meine ansonsten kann ich nochmal ein Beispiel posten.

Gruß

stator

sommerfee
10-11-2007, 11:49
Ich hab in der caption Beschreibung nachgeschaut und dort ebenfalls eine twoside Option gefunden, leider funktioniert die nicht so wie ich will (auf den geraden Seitenzahlen wird die caption margin 10mm hinten der Zeile eingefügt und nicht davor) bzw. weiß ich nicht genau wo ich diese Option eintragen muss.

Die Anleitung des aktuellen caption-Paketes hinkt leider der Implementation etwas hinterher. (Sie wird aber hoffentlich dieses Jahr noch fertig.) Was dort leider noch nicht zu finden ist:

Gibt man mit "margin={x,y}" unterschiedliche Ränder an, dann werden diese Ränder bei zweiseitigen Dokumenten automatisch auf geraden Seiten vertauscht. Unterbinden kann man dies mit "twoside=false", also in deinem Falle z.B.:


\usepackage{caption}[2007/10/25]
\DeclareCaptionStyle{test}[margin=5mm,justification=centering]{font=footnotesize,labelfont=sc,margin={10mm,0mm}, twoside=false}
\captionsetup{style=test,figurename=Abb.}


Gruß,
Axel

stator
10-11-2007, 12:55
Da bleibt nur noch eins zu sagen: Vielen Dank!