PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : kein Glück mit Subfig und Hyperref



klassizist
27-06-2007, 15:30
Liebe Forumbenützer

Mein PDFTeX schafft es nicht, im Abbildungsverzeichnis Links auf Subfigures zu erstellen, es kommt eine Warnung, der Link ist nicht aktiv. Links aus dem Text auf die Subfigures gehen problemlos.

Was mach ich falsch?


\documentclass{book}
\usepackage[pdftex]{hyperref}
\usepackage{subfig}

\captionsetup{lofdepth=2}

\begin{document}

\listoffigures

\chapter{MyChapterTitle}
Testing subfigures.

\begin{figure}
\subfloat[a text image]{%
\fbox{%
\parbox[b][5\baselineskip][c]{.25\textwidth}{%
\hspace*{\fill}I'm an image!\hspace*{\fill}%
\par}}
}
\caption{a minimal example}
\end{figure}

\end{document}

sommerfee
27-06-2007, 16:17
Was mach ich falsch?

Soweit ich sehe gar nichts. Du kannst dich wohl mit in die Reihe derjenigen stellen, die auf die für Oktober 2005 angekündigte Version 1.4 warten... :(

Ich werde am Wochenende mal nachgraben, vielleicht finde ich den Fehler und kann dann ggf. einen Patch anbieten.

Liebe Grüße,
Axel

klassizist
27-06-2007, 17:47
Soweit ich sehe gar nichts. Du kannst dich wohl mit in die Reihe derjenigen stellen, die auf die für Oktober 2005 angekündigte Version 1.4 warten... :(

Das ging aber schnell! Du gehst also davon aus, dass der Fehler im Subfig-Package zu suchen ist. Ich verstehe leider zu wenig von stackbasierter Programmierung, dass ich hier mithelfen könnte.

Gruss

Robin

rais
27-06-2007, 18:11
Ich verstehe leider zu wenig von stackbasierter Programmierung

ja kommt der Text bei Dir denn rueckwaerts raus? :D
Anders gefragt: ist es denn eine?
MfG,

sommerfee
28-06-2007, 10:40
Du gehst also davon aus, dass der Fehler im Subfig-Package zu suchen ist.

Ja, definitiv. Dein Beispiel ist einfach zu simpel um falsch zu sein ;) Und da es selbst mit der Option "caption=false" das selbe Problem gibt, scheidet das caption-Paket als "Übeltäter" aus.

Hinzu kommt, daß es nicht das erste subfig-Beispiel ist, welches nicht mit hyperref funktioniert, zumindest nicht mit den aktuellen Versionen von hyperref. Im Usenet tauchen auch hin-und-wieder Problemfälle auf (und auch ich bekomme welche per e-mail, weil einerseits oft nicht klar ist, ob das Problem am caption oder am subfig-Paket liegt und andererseits Steven nicht erreichbar ist), leider in der Regel ohne nachvollziehbares Minimalbeispiel. Und selbst die subfig-Anleitung selber läßt sich nicht (mehr) ohne verdächtige hyperref-Warnungen übersetzen...

Steven Cochran (dem Autor von subfig) waren auch damals schon einige Fehler bekannt, er war auch aktuell dabei eine Version 1.4 zu basteln, nur eine Kleinigkeit wollte er noch ändern... Leider ist das subfig-Paket "author-maintained" (d.h. darf unter allen Umständen nur vom Autor geändert werden), daher wird es wohl noch dieses Jahr ein "subfigfix"-Paket von Olga Lapko (Autorin des floatrow-Paketes) und mir geben, oder aber wir basteln an einer alternativen Lösung, aber erstmal sind wir sowieso noch ausreichend mit unseren eigenen Paketen beschäftigt... Blöde Situation, finde ich.

Liebe Grüße,
Axel

klassizist
28-06-2007, 11:43
Leider ist das subfig-Paket "author-maintained" (d.h. darf unter allen Umständen nur vom Autor geändert werden), daher wird es wohl noch dieses Jahr ein "subfigfix"-Paket von Olga Lapko (Autorin des floatrow-Paketes) und mir geben, oder aber wir basteln an einer alternativen Lösung, aber erstmal sind wir sowieso noch ausreichend mit unseren eigenen Paketen beschäftigt... Blöde Situation, finde ich.

Hallo Axel, schade dass die Entwicklung durch solche Querelen gebremst wird. Mir hilft dann wohl nur \captionsetup{lofdepth=1} :(

Gruss
Robin

sommerfee
13-01-2008, 20:50
daher wird es wohl noch dieses Jahr ein "subfigfix"-Paket von Olga Lapko (Autorin des floatrow-Paketes) und mir geben, oder aber wir basteln an einer alternativen Lösung

Update: In das caption-Paket v3.1 ist ein sub-caption Feature integriert, welches von der kommenden Version v0.2b des floatrow-Paketes auch aktiv unterstützt werden wird.

Bis es soweit ist, kann man sich auch mit dem subcaption-Paket begnügen, welches zwar nicht alle subfig-Features bereitstellt, aber die wesentlichen. Und es arbeitet (hoffentlich) korrekt mit hyperref zusammen:

http://www.ctan.org/tex-archive/macros/latex/contrib/caption/

Liebe Grüße,
Axel

P.S.: Das subcaption-Paket gibt es schon seit Weihnachten letzten Jahres, hatte aber vergessen, hier ein Update runterzusetzen. Sorry!

rais
14-01-2008, 16:46
Moin moin,
ein workaround etwas anderer Natur wäre, die Bindung des Abbildungszählers an den Kapitelzähler aufzuheben, z. B. mit dem chngcntr-Paket... Wenn ich das richtig gesehen hab, lässt subfig den Kapitelzähler in dem LOF-Eintrag untern Tisch fallen (statt subfigure.1.1.1 wird hier nur subfigure.1.1 eingetragen), deshalb zeigt der Link von dort auch gen Nirvana.;-)

MfG,

sommerfee
14-01-2008, 17:20
Moin Rainer,

Ganz so einfach scheint es nicht zu sein. Das Hauptproblem ist, daß \theHsubfigure (welches normalerweise für die Generierung der internen Linknamen zu subfigures zuständig sein sollte) gar nicht zum Einsatz kommt. Man kann auch nach \begin{document}


\renewcommand\theHsubfigure{Kaesekuchen}

einfügen und man sieht an der Fehlermeldung, daß immer noch nach "subfigure.1.1" als interner Linkname gesucht wird.

Aber mal ganz von vorne: Das Problem bei Listeneinträgen von subfigures ist, daß man sie nicht vornehmen kann wenn die \subfloat gesetzt wird, weil sie dann im Abbildungsverzeichnis vor dem Haupteintrag stehen würde, und nicht danach. Das subfig-Paket löst dies so, daß es die Einträge zunächst in eine Liste schreibt, und dann nach \caption diese Liste abarbeitet, indem er die Listeneinträge händisch nachträgt. Bei dem händischen Eintragen der Liste wird zwar auch auf hyperref geachtet (man suche einfach mal nach \ifhyperrefloaded in subfig.sty, dann findet man die ganzen Stellen), aber der Code ist von einem Haufen unhübschen Annahmen und internen Arbeitsweisen von hyperref abhängig. Es macht nicht nur "book" als Dokumentenklasse Probleme, sondern die Anleitung des subfig-Paketes selbst läßt sich auch nicht ohne Warnungen und falsche Sprungziele übersetzen. :(

Um das Problem zu beseitigen, müsste man also einen Haufen internen Code des subfig-Paketes patchen.

Gruß,
Axel

rais
14-01-2008, 19:25
Moin Axel,

Das Hauptproblem ist, daß \theHsubfigure (welches normalerweise für die Generierung der internen Linknamen zu subfigures zuständig sein sollte) gar nicht zum Einsatz kommt. Man kann auch nach \begin{document}


\renewcommand\theHsubfigure{Kaesekuchen}

einfügen und man sieht an der Fehlermeldung, daß immer noch nach "subfigure.1.1" als interner Linkname gesucht wird.

stimmt, dafür wird eine per \ref referenzierte Unterabbildung nun mit "subfigure.Kaesekuchen" verlinkt.:D

...und dann fing ich an, mit dem Code zu spielen, bis überall "Kaesekuchen" stand, wo zuvor noch "1.1" am subfigure hing:


\documentclass{book}
\usepackage{subfig,hyperref}

\makeatletter%
\def\sf@updatecaptionlist#1#2#3#4{%
\xdef\sf@captionlist{%
\sf@captionlist,%
{\protect\numberline{\@subcaplabel}\noexpand{\igno respaces #2}}%
{#1.\csname theH#1\endcsname}}} %#1.#3.#4
\makeatother

\captionsetup{lofdepth=2}
\begin{document}
%\renewcommand\theHsubfigure{Kaesekuchen}
\listoffigures
\chapter{MyChapterTitle}
Testing subfigures.
main \ref{fig:main}, sub \ref{fig:sub}

\begin{figure}
\subfloat[a text image\label{fig:sub}]{%
\fbox{%
\parbox[b][5\baselineskip][c]{.25\textwidth}{%
\hspace*{\fill}I'm an image!\hspace*{\fill}%
\par}}
}
\caption{a minimal example}\label{fig:main}
\end{figure}

\end{document}

aber ob man das so so einfach machen kann?

MfG,

sommerfee
15-01-2008, 10:08
Den ersten Stolperstein habe ich schon:


\usepackage[hypertexnames=false]{hyperref}

Damit klappt es dann wiederum nicht mehr. Man könnte den Schalter "hypertexnames" im Code berücksichtigen, aber dann bastele ich dir einfach das nächste Beispiel, womit es dann wiederum nicht mehr geht. :D

Das Design des Makros \sf@updatecaptionlist ist und bleibt eben IMHO irgendwie Mist (auch nach deiner etwas ausmistenden Änderung), weil es davon ausgeht, daß es weiß, wie hyperref intern mit den Sprungzielen umgeht.

Selbst wenn man die ganzen restlichen hyperref-Internata da auch noch einpflegt, bis es wirklich mit allen hyperref-Einstellungen und unter allen Umständen funktioniert, macht einen das nur bis zur nächsten hyperref-Version, wo diesbezügliche Dinge geändert sind, glücklich.

Gruß,
Axel

rais
15-01-2008, 16:33
Ich war ja schon froh, die passende Stelle im Code überhaupt gefunden zu haben, aber dann kam es mir doch irgendwie zu simpel vor -- nu weiß ich auch, warum:


Selbst wenn man die ganzen restlichen hyperref-Internata da auch noch einpflegt, bis es wirklich mit allen hyperref-Einstellungen und unter allen Umständen funktioniert, macht einen das nur bis zur nächsten hyperref-Version, wo diesbezügliche Dinge geändert sind, glücklich.

...die wird wohlmöglich veröffentlicht, bevor man sein Flickwerk überhaupt beendet hat.:D

MfG und Bestem Dank,

sommerfee
16-01-2008, 10:50
Moin Rainer,

Auch wenn man mit dem jetzigen Design des subfig-Paketes das Problem nicht 100%ig ausmerzen kann, ist dein Patch ja trotzdem schon'mal eine deutliche Verbesserung. Gestern spät ist mir dann noch als weiterer Schritt in die von dir vorgegebene Richtung


\def\sf@updatecaptionlist#1#2#3#4{%
\xdef\sf@captionlist{%
\sf@captionlist,%
{\protect\numberline{\@subcaplabel}\noexpand{\igno respaces #2}}%
{\@currentHref}}}

eingefallen, ob das wirklich nochmal eine weitere Verbesserung ist oder nicht, müsste man erstmal testen. (Auf jeden Fall scheint es dann auch mit "hypertexnames=false" zu funktionieren.)

Liebe Grüße,
Axel

rais
17-01-2008, 14:51
Moin Axel,

(..) ob das wirklich nochmal eine weitere Verbesserung ist oder nicht, müsste man erstmal testen.
definitiv! Selbst die in Verbindung mit subfig imho unsinnige hyperref-Option naturalnames=true ergibt das zu erwartende Resultat (Link "subfigure.a") -- die Version mit \csname theH...\endcsname erzeugt hier "subfigure.1.1.1" ohne entsprechenden Anker.

Was eine einzelne Zeile so alles anrichten kann...;-)

MfG,

sommerfee
09-01-2010, 19:37
Update nach 2 Jahren: :D

Da ja nun wirklich nichts mehr von Steven kommt, habe ich den obrigen Patch einfach mal ins neue caption-Paket 3.1l integriert. Lieber spät als gar nicht :D

lockstep
09-01-2010, 19:53
Steven Cochran (dem Autor von subfig) waren auch damals schon einige Fehler bekannt, er war auch aktuell dabei eine Version 1.4 zu basteln, nur eine Kleinigkeit wollte er noch ändern... Leider ist das subfig-Paket "author-maintained" (d.h. darf unter allen Umständen nur vom Autor geändert werden) [...]

Das ist im Übrigen ein Lehrbuchbeispiel, warum man auch als Paketautor und copyright-holder den LPPL-Status "maintained" vorziehen sollte.

lockstep