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