Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Hyperref und Preview vertragen sich nicht

13 views
Skip to first unread message

Ralf Angeli

unread,
Jul 10, 2010, 10:19:28 AM7/10/10
to
Hi,

bereits letztes Jahr wurde auf der AUCTeX-Mailingliste eine
Unverträglichkeit von Hyperref und Preview gemeldet. Ich versuche
momentan die Ursache dafür zu finden, komme aber nicht wirklich weiter
und hoffe, dass hier vielleicht jemand eine Idee hat.

Das Problem tritt bspw. mit folgender Datei auf:

--8<---------------cut here---------------start------------->8---
\documentclass{article}
\usepackage{hyperref}
\usepackage[active,displaymath]{preview}
\begin{document}
\begin{eqnarray}
x = a
\end{eqnarray}
\end{document}
--8<---------------cut here---------------end--------------->8---

Nehmen wir an, die Datei heißt test.tex. Wenn man nun

$ latex test

und

$ dvips test.dvi

ausführt und die resultierende Postscript-Datei mit gv öffnet, erhält
man folgende Fehlermeldung (ohne Stack):

Error: /undefined in H.S

(Die Fehlermeldung beim Öffnen der DVI-Datei ist nicht so konkret,
deshalb die Konvertierung in die Postscript-Datei.)

Der Fehler tritt mit aktuellen Versionen von preview.sty (11.86) und
hyperref.sty (6.81g) auf.

Ich habe mal in die DVI-Datei geschaut und dort findet man folgendes
Postscript-Special:

ps:SDict begin H.S end

Wenn ich das richtig verstehe, ist H.S eine Variable, die nicht
definiert wurde. Zumindest dann nicht, wenn Preview aktiv ist. Wenn
man nämlich in obiger Testdatei die Zeile, in der preview.sty geladen
wird, auskommentiert und LaTeX über die Datei laufen lässt, resultiert
eine DVI-Datei, in der H.S (und einiges mehr) im Header definiert wird.
(Soweit zumindest mein Verständnis.) Es findet sich dort dann folgender
Schnipsel:

[...] def/H.S {currentpoint HyperBorder add /pdf@lly exch def dup
DvipsToPDF 72 add /pdf@hoff exch def HyperBorder sub /pdf@llx exch def}
[...]

Ich gehe momentan davon aus, dass die Definition von H.S auch bei
Verwendung von preview.sty im Header sein sollte. (Alternativ könnte
man auf die darauf referenzierenden Postscript-Specials verzichten.)
Die Frage ist nun, warum mit preview.sty die Definition von H.S fehlt.
Ich habe in preview.dtx nach der Erklärung gesucht, aber leider fehlt
mir das notwendige TeX-Wissen, um alles zu verstehen. Ich würde auf ein
Problem im Zusammenhang mit \shipout oder \@begindvi tippen, aber das
ist nur ein Schuss ins Blaue.

Hat vielleicht jemand eine Idee, wo man ansetzen müsste, damit sich
Hyperref und Preview wieder vertragen?

--
Ralf

David Kastrup

unread,
Jul 10, 2010, 11:49:35 AM7/10/10
to
Ralf Angeli <dev....@caeruleus.net> writes:

> bereits letztes Jahr wurde auf der AUCTeX-Mailingliste eine
> Unverträglichkeit von Hyperref und Preview gemeldet. Ich versuche
> momentan die Ursache dafür zu finden, komme aber nicht wirklich weiter
> und hoffe, dass hier vielleicht jemand eine Idee hat.
>
> Das Problem tritt bspw. mit folgender Datei auf:
>

> \documentclass{article}
> \usepackage{hyperref}
> \usepackage[active,displaymath]{preview}
> \begin{document}
> \begin{eqnarray}
> x = a
> \end{eqnarray}
> \end{document}
>

Wirkt so, als würde das atbegshi.sty Paket von Heiko Oberdiek mit
\shipout in einer Weise rumspielen, die mit preview.sty, das sich in
gewissem Rahmen auf die LaTeX-Definitionen und Mechanismen für
\AtBeginDvi verläßt, inkompatibel ist.

--
David Kastrup

Hendrik van Hees

unread,
Jul 10, 2010, 12:38:04 PM7/10/10
to
Das preview-Paket funktioniert schon seit einiger Zeit nicht mit dem
neuesten hyperref zusammen. Meine (vielleicht etwas gewagte) Lösung ist,
einfach ein älteres hyperref in meinem local tex tree zu konservieren.

Ich habe diese Woche schon auf SuSE 11.3 geupdatet. Da taucht als neues
Problem eine Inkompatibilität mit dem dort verwendeten gs (Version 8.70)
auf. Preview zeigt einfach gar keine Bildchen mehr an. Auch hier war meine
Lösung, ein älteres ghostscript (Version 8.63) selbst zu compilieren.

David Kastrup wrote:

--
Hendrik van Hees
Justus-Liebig Universität Gießen
D-35392 Gießen
http://theorie.physik.uni-giessen.de/~hees/

Ralf Angeli

unread,
Jul 10, 2010, 3:25:59 PM7/10/10
to
* Hendrik van Hees (2010-07-10) writes:

> Ich habe diese Woche schon auf SuSE 11.3 geupdatet. Da taucht als neues
> Problem eine Inkompatibilität mit dem dort verwendeten gs (Version 8.70)
> auf. Preview zeigt einfach gar keine Bildchen mehr an. Auch hier war meine
> Lösung, ein älteres ghostscript (Version 8.63) selbst zu compilieren.

Mit 8.70 ist mir kein Problem bekannt, aber mit 8.71 hatte ich auch
schon zu kämpfen. Wenn ich mich recht erinnere, war das in Zusammenhang
mit PDF-Dateien und es gab folgende Fehlermeldung:

Error: /undefined in copy_trailer_attrs

Das wurde zumindest in Debian behoben. Siehe bspw.
<URL:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=573115>.

--
Ralf

Heiko Oberdiek

unread,
Jul 10, 2010, 5:48:16 PM7/10/10
to
David Kastrup <d...@gnu.org> wrote:

Da diese Mechanismen auf unsauberem Missbrauch von \AtBeginDvi
beruhten, war es höchste Zeit das ordentlicher in den Griff zu
kriegen. Natürlich ist das dann blöd für Pakete, die sich auf die
alten "Mechanismen" verlassen hatten. Leider ist LaTeX nicht
gerade freigebig mit sauberen und definierten Hooks für
Paketprogrammierer. Grundlegende Features, wie sie
everyshi/atbegshi anbieten, hätten schon vor Jahrzehnten in
den LaTeX-Kernel aufgenommen werden müssen. Jetzt kochen
halt hunderte Pakete dieselbe Suppe, aber mit variierenden
Zutaten.

Die Umstellung auf atbegshi in hyperref erfolgte vor knapp
drei Jahren:

| 2007-10-29 6.77a Heiko Oberdiek
| * 6.77a
| * The ugly hooking in \@begindvi is removed in favor of
| using package `atbegshi'.
| * \@hyperfixhead don't exist anymore.
| * Patch of fancybox is obsolete.
| * \AtBeginDvi replaced by \AtBeginShipoutFirst
| * ...

Ich hoffe, das heißt jetzt nicht, dass, falls David Zeit
findet, \AtBeginShipoutFirst zu unterstützen, dies dann
erst nach weiteren drei Jahren von den Anwendern
gemerkt wird.

--
Heiko Oberdiek

David Kastrup

unread,
Jul 11, 2010, 3:29:10 AM7/11/10
to
Heiko Oberdiek <heiko.o...@googlemail.com> writes:

> Die Umstellung auf atbegshi in hyperref erfolgte vor knapp
> drei Jahren:
>
> | 2007-10-29 6.77a Heiko Oberdiek
> | * 6.77a
> | * The ugly hooking in \@begindvi is removed in favor of
> | using package `atbegshi'.
> | * \@hyperfixhead don't exist anymore.
> | * Patch of fancybox is obsolete.
> | * \AtBeginDvi replaced by \AtBeginShipoutFirst
> | * ...
>
> Ich hoffe, das heißt jetzt nicht, dass, falls David Zeit
> findet, \AtBeginShipoutFirst zu unterstützen, dies dann
> erst nach weiteren drei Jahren von den Anwendern
> gemerkt wird.

Es macht keinen Sinn für mich oder irgendjemand anderen, zwei nicht
synchronisierte Systeme wie "LaTeX" und "von Hyperref und Konsorten ohne
Rückwärtskompatibilität umgepatchtes LaTeX mit anderen Interfaces" zu
versuchen zu unterstützen. Der Ansatz von Hyperref ist bereits, alles
zu ändern und irgendwie eine Quote von Funktionalität/Kompatibilität auf
gut Glück zu erhalten. Da noch eine Ebene draufzusetzen, halte ich für
sinnlos.

Stattdessen wäre es sinnvoll, den beklagten Mangel an Hooks und
Interfaces an der Quelle zu beheben und die notwendige Funktionalität
durch Mitarbeit am LaTeX-Kernel dort einfließen zu lassen.

Es ist ja nicht so, daß preview.sty das einzige Programm wäre, das
\@begindvi und die entsprechende Box nutzte.

Eine Suche im TeXlive-Baum spuckt mehrere Dutzend Vorkommnisse aus. Es
ist nicht zu erwarten, daß die entsprechenden Autoren ihren Code an jede
Hyperref/Atbegshi-Generation anpassen.

--
David Kastrup

Heiko Oberdiek

unread,
Jul 11, 2010, 4:18:15 AM7/11/10
to
Ralf Angeli <dev....@caeruleus.net> wrote:

> bereits letztes Jahr wurde auf der AUCTeX-Mailingliste eine
> Unverträglichkeit von Hyperref und Preview gemeldet. Ich versuche
> momentan die Ursache dafür zu finden, komme aber nicht wirklich weiter
> und hoffe, dass hier vielleicht jemand eine Idee hat.
>
> Das Problem tritt bspw. mit folgender Datei auf:
>
> --8<---------------cut here---------------start------------->8---
> \documentclass{article}
> \usepackage{hyperref}

\csname AtBeginShipoutInit\endcsname

> \usepackage[active,displaymath]{preview}
> \begin{document}
> \begin{eqnarray}
> x = a
> \end{eqnarray}
> \end{document}
> --8<---------------cut here---------------end--------------->8---

Das Paket `preview' definiert \shipout um, um bestimmte Seiten
wegzuwerfen. Dazu gehört dann auch die erste Seite, u.a. mit
Initialisierungs-\specials von hyperref.

Das von hyperref verwendete Paket `atbegshi' bietet entsprechende
Hooks und sogar das Feature, Seiten wegzuwerfen, so dass der
"Erste-Seiten-Hook" nicht auf einer weggeworfenen Seite zu
liegen kommt.

Das Paket `preview' kennt nun `atbegshi' nicht. Es lässt sich aber
trotzdem leicht zur Zusammenarbeit überreden. Die Lösung liegt
dabei in der Reihenfolge der \shipout-Überladungen, die vom
Paket atbegshi muss zuerst erfolgen, dadurch wird der Shipout-Code
von atbegshi nur für Seiten aufgerufen, die von preview durchgelassen
werden.
Durch \AtBeginShipoutInit wird \shipout durch das Paket `atbegshi'
erweitert, ansonsten geschieht dies bei \begin{document}. Daher
ruft man \AtBeginShipoutInit einfach *vor* dem Laden von
preview auf.
Eingepackt ist das noch in \csname...\endcsname, falls ein
älteres hyperref geladen wird, das das Paket `atbegshi' nicht
lädt.

--
Heiko Oberdiek

Heiko Oberdiek

unread,
Jul 11, 2010, 4:18:16 AM7/11/10
to
David Kastrup <d...@gnu.org> wrote:

> Es macht keinen Sinn für mich oder irgendjemand anderen, zwei nicht
> synchronisierte Systeme wie "LaTeX" und "von Hyperref und Konsorten ohne
> Rückwärtskompatibilität umgepatchtes LaTeX mit anderen Interfaces" zu
> versuchen zu unterstützen. Der Ansatz von Hyperref ist bereits, alles
> zu ändern und irgendwie eine Quote von Funktionalität/Kompatibilität auf
> gut Glück zu erhalten. Da noch eine Ebene draufzusetzen, halte ich für
> sinnlos.

Kompatibilitätsprobleme gibt es zu hauf mit Paketen, die mit
\@begindvi arbeiten wollen: LaTeX setzt das auf \@empty zurück, so
dass man \AtBeginDvi nicht für Code verwenden kann, der
auf jeder Seite ausgeführt wird. Aber eben dies wird benötigt und
die Pakete patchen daher notgedrungen wild.

> Stattdessen wäre es sinnvoll, den beklagten Mangel an Hooks und
> Interfaces an der Quelle zu beheben und die notwendige Funktionalität
> durch Mitarbeit am LaTeX-Kernel dort einfließen zu lassen.

Da der LaTeX-Kernel tiefgefroren ist, ist das mit dem "Fließen" in
diesem Aggregatszustand so eine Sache.
Deshalb bin ich den verbliebenen Weg gegangen, den Mangel
an Hooks und Interfaces in dem diskutierten Bereich durch das
Paket `atbegshi' zu beheben, das seine Dienste übrigens auch
plain-TeX-Formaten anbietet.
Unverständlich finde ich es daher, sich zu beklagen, dass dann
das neue, sauberere Interface auch verwendet wird.

--
Heiko Oberdiek

David Kastrup

unread,
Jul 11, 2010, 6:02:51 AM7/11/10
to
Heiko Oberdiek <heiko.o...@googlemail.com> writes:

> David Kastrup <d...@gnu.org> wrote:
>
>> Es macht keinen Sinn für mich oder irgendjemand anderen, zwei nicht
>> synchronisierte Systeme wie "LaTeX" und "von Hyperref und Konsorten ohne
>> Rückwärtskompatibilität umgepatchtes LaTeX mit anderen Interfaces" zu
>> versuchen zu unterstützen. Der Ansatz von Hyperref ist bereits, alles
>> zu ändern und irgendwie eine Quote von Funktionalität/Kompatibilität auf
>> gut Glück zu erhalten. Da noch eine Ebene draufzusetzen, halte ich für
>> sinnlos.
>
> Kompatibilitätsprobleme gibt es zu hauf mit Paketen, die mit
> \@begindvi arbeiten wollen: LaTeX setzt das auf \@empty zurück, so
> dass man \AtBeginDvi nicht für Code verwenden kann, der
> auf jeder Seite ausgeführt wird.

Und dafür ist es auch nicht gedacht. Es ist für einmaligen
Initialisierungscode gedacht.

> Aber eben dies wird benötigt und die Pakete patchen daher notgedrungen
> wild.

Es macht aber wenig Sinn, existierende Hooks auf ein inkompatibles
Verhalten umzupatchen anstatt neue Hooks hinzuzupatchen.

> Deshalb bin ich den verbliebenen Weg gegangen, den Mangel
> an Hooks und Interfaces in dem diskutierten Bereich durch das
> Paket `atbegshi' zu beheben, das seine Dienste übrigens auch
> plain-TeX-Formaten anbietet.
> Unverständlich finde ich es daher, sich zu beklagen, dass dann
> das neue, sauberere Interface auch verwendet wird.

Ich beklage mich doch gar nicht. Daß ein ohne Rücksicht auf
Rückwärtskompatibilität umgepatchtes LaTeX nicht rückwärtskompatibel
ist, ist wenig bemerkenswert. Die zu dieser Entscheidung führende
Güterabwägung und die daraus resultierenden Konsequenzen sind aber nicht
meine Baustelle.

--
David Kastrup

Ralf Angeli

unread,
Jul 11, 2010, 10:59:20 AM7/11/10
to
* Heiko Oberdiek (2010-07-11) writes:

> Ralf Angeli <dev....@caeruleus.net> wrote:
>
>> \documentclass{article}
>> \usepackage{hyperref}
>
> \csname AtBeginShipoutInit\endcsname
>
>> \usepackage[active,displaymath]{preview}
>> \begin{document}
>> \begin{eqnarray}
>> x = a
>> \end{eqnarray}
>> \end{document}

[...]

> Das Paket `preview' kennt nun `atbegshi' nicht. Es lässt sich aber
> trotzdem leicht zur Zusammenarbeit überreden. Die Lösung liegt
> dabei in der Reihenfolge der \shipout-Überladungen, die vom
> Paket atbegshi muss zuerst erfolgen, dadurch wird der Shipout-Code
> von atbegshi nur für Seiten aufgerufen, die von preview durchgelassen
> werden.
> Durch \AtBeginShipoutInit wird \shipout durch das Paket `atbegshi'
> erweitert, ansonsten geschieht dies bei \begin{document}. Daher
> ruft man \AtBeginShipoutInit einfach *vor* dem Laden von
> preview auf.
> Eingepackt ist das noch in \csname...\endcsname, falls ein
> älteres hyperref geladen wird, das das Paket `atbegshi' nicht
> lädt.

Danke für die Erklärung und den Workaround für obige Datei. Damit gibt
es auch bei mir keine Fehlermeldung mit der Postscript-Datei.

Leider funktioniert das nicht im Zusammenhang mit preview-latex.
Hierbei wird preview.sty zusätzlich mit der Option `tightpage' geladen.
Man kann den Fehler also mit folgender Datei provozieren:

--8<---------------cut here---------------start------------->8---
\documentclass{article}
\usepackage{hyperref}
\csname AtBeginShipoutInit\endcsname

\usepackage[active,displaymath,tightpage]{preview}


\begin{document}
\begin{eqnarray}
x = a
\end{eqnarray}
\end{document}
--8<---------------cut here---------------end--------------->8---

Wenn man sie durch latex laufen lässt, dvips auf der resultierenden
DVI-Datei ausführt und die daraus entstehende Postscript-Datei mit gv
öffnet, bekomment man folgende Fehlermeldung:

Error: /typecheck in --div--

Damit kann ich nun leider gar nichts anfangen. )c:

Wenn es aber auch hierfür einen Workaround gäbe, könnten wir ihn
zumindest in die Doku von preview-latex bzw. preview.sty schreiben,
damit die Nutzer von Hyperref und Preview die aktuellen Versionen der
Pakete nutzen können bis wir eine Lösung haben, die in den Paketen
selbst oder im LaTeX-Kernel umgesetzt wird.

--
Ralf

0 new messages