Neue HTML-Fenster aus PDF
Transcription
Neue HTML-Fenster aus PDF
Neue HTML-Fenster aus PDF-Dateien öffnen Alfred Wassermann, Bayreuth 19. Dezember 2002 Inhaltsverzeichnis 1 Was ist das Problem? 1 2 Die 2.1 2.2 2.3 2.4 2.5 3 3 3 5 6 7 1 Lösung Was haben wir bisher getan? . . . Ein Trick . . . . . . . . . . . . . . Der Rücksprung . . . . . . . . . . Eine HTML-Datei für alle Zwecke Die reine LATEX-Lehre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Was ist das Problem? PDF (Portable Document Format) ist eine PostScript-ähnliche Sprache für druckfertige Dokumente mit Zusatzfunktionen für die multimediale Nutzung der Dokumente am Bildschirm. Zur Darstellung von PDF-Dokumenten ist das (kostenlos erhältliche) Programm Acrobat Reader am weitesten verbreitet. Für die Nutzung am Bildschirm können in das Dokument nun einige Interaktionselemente wie Querverweise (Links) und Buttons eingebaut werden. Kurz, das Dokument kann zum Hypertext, zum multimedialen Gesamtkunstwerk erweitert werden. Wir sind uns einig, dass die Krönung des ästhetischen Schaffens darin besteht, PDF-Dokumente mit TEX, bzw. LATEX zu erstellen. Wir erreichen dadurch die TEX-typische Typographie-Qualität, insbesondere im mathematischen Formelsatz, und gleichzeitig Hypertext-Funktionalität. Bieten wir unsere Kunstwerke im World Wide Web zum Betrachten an, so wird der Großteil der Lesenden diese Dokumente innerhalb des WebBrowsers sehen, dargestellt durch ein sogenanntes Plugin, das AcrobatReader-Plugin. 1 Charakteristisch für Hypertext sind Querverweise, auch Links genannt. Nun kann es selbst dem renommiertesten Autor blühen, dass er/sie einen Querverweis auf ein anderes Dokument setzen muss, zum Beispiel einen Querverweis auf eine HTML-Seite. Notwendig wird dies etwa dann, wenn JavaApplets verwendet werden. Diese können leider nicht innerhalb eines PDFDokuments angezeigt werden; es ist eine HTML-Datei nötig, die das JavaApplet beheimatet. Testen Sie nun bitte den folgenden Querverweis und klicken Sie danach auf den Zurück“-Button des Web-Browsers. ” Querverweis auf GEONExT Wenn Sie den obigen Querverweis getestet haben, wird Ihnen auffallen, dass die HTML-Datei im gleichen Web-Browser-Fenster geöffnet wurde, in dem vorher das PDF-Dokument angezeigt worden war. Ebenso wird Ihnen vielleicht aufgefallen sein, dass beim Klicken auf den Zurück“-Button des Brow” sers zwar das PDF-Dokument wieder angezeigt wird, wir uns allerdings nun auf Seite 1 befinden, während der Querverweis sich auf Seite 2 befindet. Bei längeren PDF-Dokumenten gestaltet sich dadurch das Weiterlesen an der jeweilig richtigen Stelle als sehr mühsam. Der Leser wird sich mit der Zeit hüten, auf einen Link zu klicken, um ja nicht den Faden zu verlieren. Manchmal ist dieses Verhalten wünschenswert, meist beabsichtigt der Autor jedoch eine der folgenden Aktionen: • Beim Klick auf einen Querverweis auf eine HTML-Datei öffnet sich ein neues Fenster, in dem die HTML-Datei angezeigt wird, ohne dass sich die Anzeige des PDF-Dokuments ändert. • Das Browser-Fenster ist in Frames unterteilt. Klickt man auf einen Querverweis im PDF-Dokument, das in einem der Frames angezeigt 2 wird, wird die HTML-Datei in einem anderen Frame angezeigt, ohne dass sich die Anzeige des PDF-Dokuments ändert. Leider sind beide Aktionen momentan nur über einen kleinen Umweg zu realisieren. 2 2.1 Die Lösung Was haben wir bisher getan? Als kleine Wiederholung wollen wir zuerst in unser LATEX-Dokument einen Querverweis auf eine HTML-Seite einbauen. Dazu und für alle folgenden Beispiele benötigen wir das hyperref-Paket: \documentclass... \usepackage{hyperref} .... Im laufenden Text kann nun der Querverweis gesetzt werden ... \href{http://geonext.de}{Querverweis auf GEONExT} ... und wir sehen im resultierenden PDF-Dokument die Zeile Querverweis auf GEONExT. Damit sind wir genau bei unserem angesprochenen Problem angelangt, die HTML-Datei öffnet sich im gleichen Fenster wie das PDF-Dokument. 2.2 Ein Trick Würden wir nur mit HTML-Dateien arbeiten, so stünde uns HTML- bzw. JavaScript-Befehle wie target=“ oder window.open()“ zur Verfügung. Lei” ” der haben wir innerhalb eines PDF-Dokuments darauf direkt keinen Zugriff. Um unser Ziel zu erreichen, müssen wir deshalb einen kleinen HTML-Trick anwenden und durch die Hintertür die JavaScript-Funktionalität des WebBrowsers bemühen. Dazu erstellen wir eine kurze HTML-Datei, der wir zum Beispiel den Namen pdfnewwindow.html“ geben, mit folgendem Inhalt: ” <html> <head> <script language="JavaScript"> function weiter() { window.open("http://geonext.de", "", "width=400,height=300"); 3 this.location = "neuesfenster.pdf"; } </script> </head> <body onload="weiter()"> </body> </html> Dabei gehen wir von dem Fall aus, dass die PDF-Datei, aus der wir den Querverweis anklicken, den Namen neuesfenster.pdf“ trägt und sich die beiden ” Dateien pdfnewwindow.html“ und neuesfenster.pdf“ im gleichen Verzeich” ” nis auf dem Web-Server befinden. Der Querverweis im LATEX-Dokument wird mit \href{http://server/verzeichnis/pdfnewwindow.html}{Querverweis auf GEONExT} eingefügt. Natürlich müssen server“ und verzeichnis“ entsprechend ange” ” passt werden. Bei aller Eleganz ist diese Anpassung ein kleiner Wermutstropfen, der die Portabilität des Konstrukts behindert. Jeder Autor mit rudimentären LATEX-Kenntnissen lindert diesen Umstand mit einem Makro: \newcommand{\basisadresse}{http://server/verzeichnis} ... \href{\basisadresse/pdfnewwindow.html}{Querverweis auf GEONExT} Im PDF-Dokument liest der Betrachter nun Querverweis auf GEONExT. Damit haben wir unser erstes Problem gelöst, es wird sich ein neues Fenster mit dem HTML-Text öffnen. Was steckt dahinter? Der Trick besteht darin, zuerst in dem WebBrowser-Fenster, in dem die PDF-Datei angezeigt wird, die Datei pdfnew” window.html“ anzuzeigen. Beim Anzeigen dieser HTML-Datei wird blitzschnell das darin enthaltene JavaScript-Programm ausgeführt, das ein neues HTML-Fenster öffnet und gleichzeitig im momentanen Fenster wieder die PDF-Datei anzeigt. Frames. Wollen wir mit Frames arbeiten, genügt es die Datei pdfnew” window.html“ leicht zu variieren. Gehen wir davon aus, dass das PDFDokument in einem Frame angezeigt wird, den wir rechts“ genannt haben, ” und die HTML-Datei im Frame mit dem Namen links“ angezeigt werden ” soll. Wir können den gleichen LATEX-Querverweis wie oben verwenden und müssen lediglich die Datei pdfnewwindow.html“ folgendermaßen umwan” deln. 4 <html> <head> <script language="JavaScript"> function weiter() { parent.links.location="http://geonext.de"; parent.rechts.location="neuesfenster.pdf"; } </script> </head> <body onload="weiter()"> </body> </html> 2.3 Der Rücksprung Der aufmerksame Tester hat sicher bemerkt, dass wir noch nicht vollständig zufrieden sein können. Zwar wird ein neues HTML-Fenster geöffnet bzw. es werden die richtigen Frames verwendet, aber es wird immer die erste Seite des PDF-Dokuments angezeigt, und nicht die Seite, auf der sich der Querverweis befindet. Dies ist aber nun nur noch eine kleine Fingerübung: Wir setzen an die Stelle des Querverweises einen Anker und springen beim Wiederaufruf des PDFDokumentes zu diesem Anker. Im LATEX-Quellcode schreiben wir dazu \hypertarget{hierherspringen}{% \href{\basisadresse/pdfnewwindow.html}{Querverweis auf GEONExT}} und in pdfnewwindow.html“ geben wir als Verweisziel diesen Anker an: ” <html> <head> <script language="JavaScript"> function weiter() { window.open("http://geonext.de", "", "width=400,height=300"); this.location = "neuesfenster.pdf#hierherspringen"; } </script> </head> <body onload="weiter()"> </body> </html> Das probieren wir aus: Querverweis auf GEONExT. 5 Es funktioniert! Durch das Neuladen des PDF-Dokumentes wirkt die Lösung zwar etwas ruckelig, aber der Leser bleibt beim Anklicken des Querverweises immerhin auf der gleichen Seite des PDF-Dokumentes. 2.4 Eine HTML-Datei für alle Zwecke Nun ist es unser ständiges Bestreben, unser Leben zu erleichtern. Aus diesem Grund wollen wir nicht für jeden Querverweis eine eigene HTML-Datei im Stil von pdfnewwindow.html“ erstellen. Wir können genauso gut mit Va” riablen arbeiten. Betrachten wir folgende HTML-Datei, die wir link.html“ ” nennen: <html> <head> <script language="JavaScript"> function weiter() { var Ausdruck = /(\w.+)=(\w.+)&(\w.+)=(\w.+)/; var sprung = window.location.search; Ausdruck.exec(sprung); adresse = RegExp.$2; sprung = RegExp.$4; window.open(adresse, "", "width=400,height=300"); this.location="neuesfenster.pdf"+datei+"#"+sprung; } </script> </head> <body onload="weiter()"> </body> </html> Im LATEX-Dokument setzen wir dann folgenden Querverweis: \hypertarget{ziel}{% \href{\basisadresse/link.html?dat=http://geonext.de&spr=ziel}% {Querverweis auf GEONExT}} Damit kann allgemein eine Web-Adresse und eine Rücksprung-Adresse an die Datei link.html“ weitergereicht werden. ” HTML-Autoren mit JavaScript-Kenntnissen sehen, dass wir die gewünschte Web-Adresse und die Rücksprung-Adresse als GET-Variable an die Datei link.html“ übergeben. Mittels regulärer Ausdrücke werten wir im JavaScript” Programm die Variablen aus und springen zu den darin enthaltenen Adressen. 6 2.5 Die reine LATEX-Lehre Es kann Gründe geben, dass ein Autor mit dieser HTML-Zwischendatei nicht recht glücklich ist. Sei es, weil alle Abhängigkeiten mit dem LATEX-Dokument kontrolliert werden sollen oder weil der Autor grundsätzlich keine Dateien außer LATEX-Dateien editieren will. Hier ist eine Möglichkeit, aus dem LATEX-Dokument heraus alle erforderlichen HTML-Dateien mit pdflatex“ zu erzeugen. ” \newcommand{\basisadresse}{http://server/verzeichnis} \newcounter{verweis}\setcounter{verweis}{1} {\catcode‘[=1 \catcode‘]=2 \catcode‘{=11 \catcode‘}=11 \catcode‘#=11 \gdef\charlb[{] \gdef\charrb[}] \gdef\chardc[#] ] \newcommand{\querverweis}[2]{% \hypertarget{quer\arabic{vnr}}{% \href{\basisadresse/pdflink\arabic{vnr}.html}{#2}} \immediate\openout9=pdflink\arabic{vnr}.html \immediate\write9{<html><head><script language=’JavaScript’>} \immediate\write9{function weiter() \charlb} \immediate\write9{window.open(’#1’);} \immediate\write9{this.location=’\jobname.pdf\chardc quer\arabic{vnr}’;} \immediate\write9{\charrb} \immediate\write9{</script></head><body onload=’weiter()’>} \immediate\write9{</body></html>} \immediate\closeout9 \stepcounter{vnr}} Unser neuer Befehl \querverweis hat genau wie href zwei Parameter: das Verweisziel und den Verweistext. \querverweis{http://geonext.de}{Querweis auf GEONExT} Dadurch wird automatisch für jeden Querverweis eine HTML-Datei geschrieben, die den Namen pdflinkxxx.html“ trägt, wobei xxx“ für eine fortlau” ” fende Nummer steht. Diese fortlaufende Nummer wird im TEX-Zähler vnr“ ” verwaltet, der in jedem Aufruf des Makros \querverweis hochgezählt wird. Der Name der PDF-Datei wird durch das TEX-Kommando \jobname bestimmt. Deshalb ist Vorsicht geboten, wenn die PDF-Datei im Nachhinein umbenannt wird. Für TEX-Puristen: Ja, es ist unsauber, \openout9 zu verwenden. Allerdings scheint \newwrite nicht für beliebig viele Dateien zu funktionieren. Abschließend ist hier ein Verweis auf den LATEX-Quelltext des vorliegenden Dokumentes. 7