PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : newfloat ignoriert Befehle?



e. hindman
20-08-2007, 20:51
Hallo Leute,
mit sind bei der Verwendung von \newfloat und dem caption Paket paar Kleinigkeiten aufgefallen.

\usepackage{float}
\usepackage{caption}
\captionsetup{format=hang,font=small,labelfont={bf ,sf}, textfont=sf, singlelinecheck=false}


\newfloat{diagram}{htbp}{foo}
\floatname{diagram}{Diagramm}

\setlength{\abovecaptionskip}{.5ex}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %
\begin{document}

\begin{diagram}[htbp]
\centering
\fbox{PLATZHALTER}
\captionsetup{width=12em}
\caption{eine fbox}
\end{diagram}


\begin{figure}[htbp]
\centering
\fbox{PLATZHALTER}
\captionsetup{width=12em}
\caption{eine fbox}
\end{figure}

\end{document}

Im Vergleich zur normalen figure Umgebung fällt auf, dass das Diagramm leicht nach links verschoben ist. Da beide ein \centering enthalten sollte das eigentlich nicht sein, oder? Verzichtet man auf \caption stimmt zumindest die horizontale Ausrichtung.
Zudem wird die Länge abovecaptionskip von den Umgebungen umterschiedlich umgesetzt, beim Diagramm ist die Beschriftung näher dran.

Ich kann mir das Verhalten nicht erklären, auch nicht anhand der Doku zu float und caption. Weiß einer von euch woran das liegen kann?

sommerfee
20-08-2007, 22:28
Im Vergleich zur normalen figure Umgebung fällt auf, dass das Diagramm leicht nach links verschoben ist. Da beide ein \centering enthalten sollte das eigentlich nicht sein, oder? Verzichtet man auf \caption stimmt zumindest die horizontale Ausrichtung.

Alternativ kann man auch ein % hinter den \fbox und \caption-Befehl schreiben, dann stimmt es auch wieder.

Das unterschiedliche Verhalten ergibt sich daraus, daß das float-Paket leider nicht erlaubt, "normale" Gleitumgebungen neu zu definieren, sondern nur welche, die einen bestimmten \floatstyle haben. Dieser ist per default auf "plain" gesetzt, was aber - wie du gemerkt hast - nur für ein ähnliches Aussehen sorgt.

Beim float-Paket wird der Inhalt von \caption zunächst in eine Box gesetzt und erst später verwendet. Dies hat zur Folge, daß das Leerzeichen hinter \fbox{...} und vermutlich auch dasjenige hinter \caption{...} tatsächlich als Leerzeichen gesetzt wird, so daß die Box leicht um links verschoben scheint. Ob dies nun ein Seiteneffekt oder ein Bug ist, darüber läßt sich streiten, denn mit einer geschickteren Implementation innerhalb des float-Paketes ließe sich das sicherlich vermeiden. (Ich werde mal versuchen, ob ich das im caption-Paket wieder geradegebogen bekomme.)

Bei der \caption innerhalb von "figure" hingegen wird ein \par sowohl vor als auch hinter der \caption ausgeführt, was dazu führt, daß diese Zeilenenden hinter \fbox{...} und \caption{...} nicht als Leerzeichen gedeutet, sondern ignoriert werden.

Was den unterschiedlichen Abstand der \caption angeht: Dies geht auch darauf zurück, daß bei "diagramm" die \caption zunächst in einer Box zwischengespeichert wird und erst später Bild+\caption zusammengesetzt wird. Durch die Limitierung von TeX, daß es bei Boxen nur eine Basislinie gibt, ergeben sich so leider leicht unterschiedliche Abstände. Man vergleiche z.B.:

\blindtext\par
\vspace{10pt}%
\parbox[b]\linewidth{\blindtext}%
\vspace{10pt}%
\blindtext\par

und

\blindtext\par
\vspace{10pt}%
\parbox[t]\linewidth{\blindtext}%
\vspace{10pt}%
\blindtext\par

In beiden Fällen ist der Abstand zur \parbox jeweils unterschiedlich, einmal der obere, das andere mal der untere größer.

(Aus dem gleichen Grund ist leider auch der Abstand bei deinem Beispiel leicht anders, wenn man das caption-Paket einbindet.)

Was kann man nun dagegen tun:

1. Auch "figure" mit Hilfe des float-Paketes umdefinieren (mit \restylefloat{figure}), dann ist es wenigstens konsistent

2. Nicht das float-Paket verwenden, sondern stattdessen ein Paket, welches ein \newfloat ohne Stil, d.h. ohne Schicki-Micki anbietet. (Gibt es eines? Wenn nicht, ist es auch nicht sooo schwer, sich "diagram" selber zu definieren, eigentlich muß man sich nur die "figure"-Definitionen aus article.cls rauskopieren und modifizieren. Irgendwo im Usenet hatte ich auch mal ein \unstylefloat veröffentlicht, welches aus einer mit \newfloat definierten Umgebung eine "normale" Gleitumgebung macht.)

Liebe Grüße,
Axel

sommerfee
21-08-2007, 10:49
2. Nicht das float-Paket verwenden, sondern stattdessen ein Paket, welches ein \newfloat ohne Stil, d.h. ohne Schicki-Micki anbietet. (Gibt es eines?

Es scheint (endlich) eines zu geben:

http://www.tex.ac.uk/tex-archive/help/Catalogue/entries/trivfloat.html

(Ich habe es mir selber noch nicht angeschaut.)

Liebe Grüße,
Axel

e. hindman
21-08-2007, 15:19
Das trivfloat Paket kann leider auch nicht ganz was es verspricht.
Die Grafiken sind auch etwas nach links verrutscht, mit einigen % lässt sich das aber umgehen. Ist ja auch nicht viel, aber wenn zwei verschiedene floats untereinander liegen, dann fällt's auf.
Aber der Abstand zur caption wird leider auch anders verstanden, hab noch keinen Trick hierzu gefunden.

sommerfee
22-08-2007, 08:29
Das trivfloat Paket kann leider auch nicht ganz was es verspricht.

Ja, das habe ich gestern abend auch gemerkt. Das "triv" bezieht sich lediglich auf die Syntax, mit der neue floats angelegt werden, intern wird das float-Paket verwendet. :mad:

Das Versprechen "the new floats should behave exactly the same as |figure| and |table| environments" in der Anleitung des Paketes entpuppt sich so leider als unhaltbares Werbeversprechen - sehr schade. Denn ich warte schon seit Ewigkeiten auf ein kleines aber feines Paket, welches einfach nur neue Gleitumgebungen definiert, ohne Schiki-Miki, klein aber fein, ganz geradeaus, ohne die vielen Probleme, die das float-Paket macht. Und dessen Gleitumgebungen am besten auch mit rotating, sidecap, picinpar, floatflt, wrapfig etc. zusammenarbeiten.

Ich habe gestern Abend mal spaßeshalber sowas selber gemacht, ich denke ich werde das in mein subcaption-Demonstrations-Paket einbauen, das sollte dann ab 3.9. auch (als Teil des caption-Paketes v3.1) der Öffentlichkeit zur Verfügung stehen.



Aber der Abstand zur caption wird leider auch anders verstanden, hab noch keinen Trick hierzu gefunden.

Eine Idee habe ich noch:
Packe mal ein \restylefloat*{diagram} unter dein \newfloat{diagram}{...}. Dann macht zwar das float-Paket intern immer noch einen Haufen Kram, aber wenigstens die \caption wird dann halbwegs normal gesetzt.

Die Sache hat allerdings einen Haken: Wird das hyperref-Paket geladen, so ist das \restylefloat* wieder wirkungslos. :( Dieses Problem wird aber ab dem nächsten hyperref-Release behoben sein, zusammen mit einem anderen Problem in der Interaktion float-hyperref.

Noch 'ne Idee: Wenn man entweder "figure" oder "table" nicht benötigt, kann man auch die einfach umbenennen, anstatt eine neue Umgebung mit \newfloat anzulegen.

Liebe Grüße,
Axel

e. hindman
22-08-2007, 10:02
Leider brauch ich drei Floats für Tabellen, Abbildungen und Diagramme.

Ich hab folgendes überlegt, die Zeile:


\setlength{\abovecaptionskip}{.5ex}

wirkt auf alle Floats, wenn sie in der Präambel steht. Nur eben nicht auf gleiche Weise.
Schreibt man sie jeweils in die Float-Umgebung rein, wirkt sie bei figure, nicht aber in den selber erstellten Floats. Man kann somit durch zwei verschiedene Maße in der Präambel und in figure (mit einigem Ausprobieren) den gleichen Abstand bekommen.
Nicht sehr elegant, aber wenn's derzeit nix besseres gibt...

sommerfee
22-08-2007, 10:45
Nicht sehr elegant, aber wenn's derzeit nix besseres gibt...

Du könntest versuchen, den speziellen Zeilenabstand für "diagram" mit

\floatevery{diagram}{\setlength\abovecaptionskip{. ..}}

einmalig in der Preambel zu setzen, vielleicht klappt das?

Gruß,
Axel

sommerfee
22-08-2007, 10:48
Noch 'ne Idee:

Nicht das float, sondern das floatrow-Paket zum Definieren von "diagram" verwenden. Da gibt es dann eine Option namens "RawFloat" (oder so ähnlich), die hoffentlich kompatibler ist als das \newfloat vom float-Paket...

Gruß,
Axel

e. hindman
22-08-2007, 14:02
Dass so ne Kleinigkeit solchen Aufwand auslösen kann :)
Ich bastel mir vorerst mal sowas wie:

newcommand\figurestyle{\centering \setlength{\abovecaptionskip}{.5ex}}
dann kann ich auch gleich meine Templates für die Floats entrümpeln.

Danke für die Hilfe.

e. hindman
22-08-2007, 22:34
Hab nochmal bisschen an der Sache getüftelt.

1. setzt man im newfloat die Caption wie bei einer Tabelle üblich darüber, kommt sie dennoch unten hin

2. bindet man dazu eine externe Grafik ein, ist diese plötzlich nicht mehr horizontal verschoben. Beim Beispiel oben mit einer fbox als Platzhalter ist diese aber dennoch etwas verschoben, dann aber nach rechts. :confused:

3. das newfloat braucht bei der Länge \abovecaptionskip einen "Vorsprung" von 1.2ex damit die Caption mit der von figure auf gleicher Höhe ist

Irgendwie scheint da der Wurm drin zu sein.

e. hindman
22-08-2007, 23:23
Ich mach zwar momentan den Alleinunterhalter, aber ich glaube zu einer Lösung gekommen zu sein:

Wie oben mit newfloat eine neue Gleitumgebung einrichten. Damit werden auch die entsprechenden Zähler und Strukturen für ein entsprechendes Verzeichnis angelegt. Eventuell kommt man zu den Sachen auch noch eleganter, weiß ich nicht.
Da das neue Float aber zicken würde, wird es nie verwendet, sondern dies nur vorgetäuscht:

\begin{figure}[htbp]
\centering
\fbox{Platzhalter}
\captionof{diagram}{ein Diagramm}
\label{dia}
\end{figure}

sommerfee
23-08-2007, 03:58
1. setzt man im newfloat die Caption wie bei einer Tabelle üblich darüber, kommt sie dennoch unten hin

Natürlich, das soll so. Bei dem \floatstyle{plain}, der vom float-Paket voreingestellt ist, ist die \caption immer unter dem Inhalt, bei \floatstyle{plaintop} hingegen immer über dem Inhalt, unabhängig davon, wo das \caption-Kommando platziert ist. Siehe float-Dokumentation.

Gruß,
Axel

sommerfee
07-09-2007, 15:52
Ich habe mal in caption 3.1 (ab sofort auf CTAN) testweise ein Kommando \DeclareFloatingEnvironment eingebaut, mit


\DeclareFloatingEnvironment{diagram}

sollten sich deine Probleme nicht mehr ergeben.

Über Rückmeldungen würde ich mich freuen.

Liebe Grüße,
Axel

e. hindman
08-09-2007, 16:14
Toll, dass du daran noch gedacht hast.
Zwei Kleinigkeiten sind mir beim ausprobieren aufgefallen.

1. Stellt man die Sprache mit Babel auf ngerman ergibt sich folgendes:

\listofdiagrams erzeugt "List of Diagrams"
\listoftables erstellt ein "Tabellenverzeichnis"

Denke da solltest du "Diagrammverzeichnis" draus machen, ein besseres Wort fällt mir grad nicht ein.

2. Könntest du den normalen Abstand der caption zum Objekt so groß machen wie bei table bzw. figure? Btw, sollte man ein Diagramm darüber oder darunter beschriften? Ich denk eher darüber.

sommerfee
08-09-2007, 18:48
\listofdiagrams erzeugt "List of Diagrams"
\listoftables erstellt ein "Tabellenverzeichnis"

Denke da solltest du "Diagrammverzeichnis" draus machen, ein besseres Wort fällt mir grad nicht ein.

Automatisiert geht das leider nur in Englisch. Man sieht es ja z.B. bei Abbildung und Tabelle, dort wird ein "Abbildungsverzeichnis" bzw. ein "Tabellenverzeichnis" daraus. Wie soll der Code aus "diagram" ein "Diagrammverzeichnis machen"?

Am besten definiert man sich also anschließend \listdiagramname selber um.



2. Könntest du den normalen Abstand der caption zum Objekt so groß machen wie bei table bzw. figure?

Eigentlich sollte sich eine Gleitumgebung, die so definiert wird, wirklich exakt genauso wie figure bzw. table verhalten. Ist bei dir der Abstand unterschiedlich? Hast du ein Minimalbeispiel für mich?

Bei mir zumindest ergeben sich gleiche Abstände:


\documentclass{article}
\usepackage{caption}
\DeclareFloatingEnvironment{diagram}

\begin{document}

\begin{figure}
\centering Text
\caption{Beschriftung}
\end{figure}

\begin{diagram}
\centering Text
\caption{Beschriftung}
\end{diagram}

\end{document}


Liebe Grüße,
Axel

e. hindman
08-09-2007, 20:38
Wenn man die Caption als Überschrift setzt, ist der Abstand deutlich unterschiedlich:

\begin{figure}
\caption{Beschriftung}
\fbox{Text}
\end{figure}

\begin{diagram}
\caption{Beschriftung}
\fbox{Text}
\end{diagram}
In deinem Fall hast du beide Gleitumgebungen unterhalb beschriftet, da passt's dann zusammen.

Und das mit dem Verzeichnisnamen, ich bin davon ausgegangen, dass das irgendwo als Wort im Quelltext steht. Macht aber wirklich keinen Sinn, das neue Float kann man ja selber benennen...

sommerfee
09-09-2007, 05:26
Wenn man die Caption als Überschrift setzt, ist der Abstand deutlich unterschiedlich:

Mit article als Dokumentenklasse nicht, mit einer KOMA-Klasse ja. Dies liegt daran, daß KOMA-Script bestimmt, ob die \caption als \captionabove oder \captionbelow gesetzt wird, diese Einstellung überschreibt die "position=" Einstellungen des caption-Paketes. (Siehe auch caption-Doku, Abschnitt über KOMA-Script)

KOMA bietet aber nur für "table" eine passende Option "tablecaptionabove" an, um dieses Verhalten zu ändern; \captions von "figure" können also mit KOMA-Script nur sinnvoll unter den Inhalt gesetzt werden. (Siehe auch KOMA-Doku, wo u.a. zu finden ist: "\caption verhält sich bei Abbildungen immer wie \captionbelow")

Wollte man dies ändern, so geht dies nur, in dem man die KOMA-Definition von "figure" (1) ändert, z.B. direkt nach dem \documentclass mit



\makeatletter
\renewenvironment{figure}{%
\let\caption\captionabove\@float{figure}%
}{%
\end@float
}
\makeatother

oder, wenn man diese "Befehlsgewalt" von KOMA über \caption für "figure" aufheben möchte:


\makeatletter
\renewenvironment{figure}{\@float{figure}}{\end@fl oat}
\makeatother


Was die Benennung von neuen gleitenden Umgebungen angeht, so habe ich jetzt bei \DeclareFloatingEnvironment zwei optionale Argumente angehängt, so daß man z.B. auch


\DeclareFloatingEnvironment{diagram}[Diagramm][Diagrammverzeichnis]

schreiben kann. Ab caption v3.1a wird das dann drin sein, so daß man \diagramname und \listdiagramname nicht mehr selber umdefinieren muß.

Liebe Grüße,
Axel

(1) Die Originaldefinition von KOMA ist:

\newenvironment{figure}{%
\let\caption\captionbelow\@float{figure}%
}{%
\end@float
}

e. hindman
09-09-2007, 10:56
Interessant, wie viele Pakete auf die Caption einfluss nehmen. Es geht nicht speziell um figure die werden nach Konvention ja unten beschriftet, das stand bei mir zum ausprobieren drin.
Aber wenn man die caption als Überschrift wie bei der Tabelle setzt, so ergeben sich auch unterschiedliche Abstände (im vgl. zur table). Auch auf verändern der Länge \abovecaptionskip reagieren die beiden verschieden.
Würde man das neue Float also unten beschriften, wär alles gut :)

Den erweiterten DeclareFloatingEnvironment Befehl find ich sehr gut, da ist dann alles am Platz.

sommerfee
09-09-2007, 11:17
Interessant, wie viele Pakete auf die Caption einfluss nehmen.

Wenn ich das vorher gewußt hätte, hätte ich das caption-Paket wohl nie geschrieben. Die Handvoll Dokumentenklassen und 15 Pakete, die ich mittlerweile unterstütze, sind nur die Spitze des Eisbergs. (Ich habe mich einfach "nur" auf die Pakete beschränkt, die in Kapitel 5 des LaTeX Begleiters Erwähnung finden.)



Aber wenn man die caption als Überschrift wie bei der Tabelle setzt, so ergeben sich auch unterschiedliche Abstände (im vgl. zur table). Auch auf verändern der Länge \abovecaptionskip reagieren die beiden verschieden.
Würde man das neue Float also unten beschriften, wär alles gut :)

Das kann ich nicht nachvollziehen:


\documentclass[tablecaptionabove]{scrartcl}
\usepackage{caption}[2007/09/01]
\DeclareFloatingEnvironment{diagram}
%\captionsetup[diagram]{position=t}

\begin{document}

\begin{table}
\caption{Beschriftung}
\centering\fbox{Text}
\end{table}

\begin{diagram}
\caption{Beschriftung}
\centering\fbox{Text}
\end{diagram}

\end{document}

ergibt bei mir identische, korrekte Abstände. Auch auf die Änderung von \abovecaptionskip reagieren beide identisch.

Vermutlich hast du zusätzlich irgendein Paket geladen, was auch in den caption-Abständen bei "table" herumwerkelt? Da gibt es einige von; "ftcap", "nonfloat" und "topcapt" sind die drei, die mir bekannt sind. (Und auch Warnungen bzw. Fehlermeldungen des caption-Paketes zur Folge haben sollten.)

Hast du ein Minimalbeispiel für mich, was das Problem verdeutlicht?

Gruß,
Axel

e. hindman
09-09-2007, 11:23
Mein Fehler, nimmt man "tablecaptionabove" zur Dokumentenklasse tut's perfekt. Das Problem tritt nur auf, wenn man's vergisst.
Wann kann man mit 3.1a rechnen?

Vielen Dank für die Mühe.

sommerfee
09-09-2007, 11:52
Wann kann man mit 3.1a rechnen?

Geplant ist es für den 1.10., wenn sich vorher gravierende Fehler finden, dann entsprechend vorher.

Bis dahin mußt du also z.B. noch

\renewcommand\diagramname{Diagramm}
\renewcommand\listdiagramname{Diagrammverzeichnis}

nach


\DeclareFloatingEnvironment{diagram}

einfügen, zumindest für deutschsprachige Dokumente.

Liebe Grüße,
Axel

e. hindman
10-09-2007, 21:40
Bis dahin brauch ich wahrscheinlich erstmal keine Diagramme mehr :)
In der Doku solltest du dieses neue Feature dann aber auch erwähnen.

Nochmal danke für deine Bemühungen.