PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kapitel als Sprungmarken (Lesezeichen) in PDFs



deidre_ann
21-01-2010, 15:42
Hallo,

kennt jemanden einen Befehl oder ein Package, mit dem man Verzeichnisse als Lesezeichen im Acrobat Reader anzeigen lassen kann, ohne dass diese im Inhaltsverzeichnis auftauen?

Bisher verwendete ich z.B. "index=totoc" oder "listof=totoc" in meinem Dokument mit Koma-Script + Hyperref. Allerdings ist mein Inhaltsverzeichnis etwas zu lang, so dass da Tabellen-, Abbildungsverzeichnis etc. rausfliegen müssen. Dennoch möchte ich nicht darauf verzichten, sie in der linken Lesezeichen-Leiste anwählen zu können, weil ich sie doch hin- und wieder brauche....

Hat jemand eine Idee?

Danke,
Ann

mechanicus
21-01-2010, 15:50
Hi,

schaue mal in die Dokumentation von hyperref, wie bookmarks festgelegt werden.

Hättest du ein Minimalbeispiel gebracht, hätte man es direkt einbauen können bzw. demonstrieren können.

Gruß
Marco

deidre_ann
21-01-2010, 16:34
Wer hätte gedacht, dass es so einfach mit dem Hyperref geht? ;-) Laut manual ist es, glaube ich, der Befehl "\pdfbookmark", oder?

Allerdings bin ich mir nicht sicher, wie ich ihn einbinden muss.


\documentclass[listof=totoc]{scrreprt}
\usepackage[ngerman]{babel}
\usepackage{caption, hyperref}
%
\begin{document}

\cleardoublepage \phantomsection \tableofcontents
\cleardoublepage \phantomsection \listoftables

\newpage
\begin{table} \centering \caption[AB]{AB} \label{tab:ab}
\begin{tabular}{ll} a & b\\ \end{tabular}
\end{table}

\end{document}

mechanicus
21-01-2010, 16:48
Hi,


\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage{caption, hyperref}
%
\begin{document}

\clearpage \pdfbookmark[0]{\contentsname}{toc} \tableofcontents
\clearpage \pdfbookmark[0]{\listtablename}{lot}\listoftables
\chapter{foo}
\begin{table} \centering \caption[AB]{AB} \label{tab:ab}
\begin{tabular}{ll} a & b\\ \end{tabular}
\end{table}

\end{document}

listof=totoc muss natürlich raus, sonst hast du den Eintrag doppelt.

Gruß
Marco

deidre_ann
21-01-2010, 17:25
Danke, Marco! :)


Die Platzhalter "\contentsname", "toc" usw. sind schon sehr speziell, so dass man ohne Raten nicht drauf kommen würde. Gibt es irgendwo eine Liste mit solchen Befehlen, dass ich nicht bei jedem Eintrag eine extra Frage hier Forum stellen müsste?

Funktioniert das Ganze auch bei anderen "Kapiteln", die keine speziellen Befehle bräuchten? Zum Beispiel habe ich auch einen Abstract oder ein Symbol- und Abkürzungsverzeichnis (mit dem gloss-Paket erstellt), welche ich gerne einbinden würde.


Danke nochmal,
Ann

mechanicus
22-01-2010, 09:32
Hi,



Die Platzhalter "\contentsname", "toc" usw. sind schon sehr speziell, so dass man ohne Raten nicht drauf kommen würde.

Da ist nichts speziell. Vielleicht kann man contentsname als speziell bezeichnen. Aber die Abkürzung ist frei wählbar.

Vielleicht nochmal zu verdeutlichung:
\pdfbookmark[EINGABEWERT 1]{EINGABEWERT 2}{EINGABEWERT 3}
hat drei Eingabewerte.

EINGABEWERT 1
ist optional
ist ein Integer, der die Ebene festlegt: -1 steht für part, 0 für chapter, 1 für section usw.

EINGABEWERT 2
ist nicht optional
Ist der String, der im Bookmark erscheint - frei wählbar

EINGABEWERT 3
ist nicht optional
legt intern den Bezeichner der Sprungmarke fest - frei wählbar





Funktioniert das Ganze auch bei anderen "Kapiteln", die keine speziellen Befehle bräuchten? Zum Beispiel habe ich auch einen Abstract oder ein Symbol- und Abkürzungsverzeichnis (mit dem gloss-Paket erstellt), welche ich gerne einbinden würde.

siehe obige Erklärung.

Gruß
Marco

lockstep
22-01-2010, 10:25
Da ist nichts speziell. Vielleicht kann man contentsname als speziell bezeichnen.

\contentsname kannte ich, für \listtablename hätte ich allerdings nachschlagen müssen. :)

Anbei eine Möglichkeit, die Definition von \tableofcontents allgemein zu erweitern (einzufügen in die Dokumentpräambel):



\usepackage{etoolbox}
\pretocmd{\tableofcontents}%
{\pdfbookmark[\ifundef{\chapter}{1}{0}]{\contentsname}{toc}}{}{}


lockstep

lockstep
22-01-2010, 10:44
Anbei eine Möglichkeit, die Definition von \tableofcontents allgemein zu erweitern (einzufügen in die Dokumentpräambel)

Da poste ich eine Lösung, die ich seit Monaten selbst verwende, und komme fünf Minuten später darauf, dass sie fehlerhaft ist. :mad:

Das folgende funktioniert für Klassen mit \chapter (und ist ergänzt um \clearpage):



\usepackage{etoolbox}
\pretocmd{\tableofcontents}%
{\clearpage\pdfbookmark[0]{\contentsname}{toc}}{}{}


Für Klassen ohne \chapter (bei denen das Inhaltsverzeichnis nicht automatisch eine neue Seite beginnt), habe ich momentan keine Lösung.

lockstep

mechanicus
22-01-2010, 10:51
Für Klassen ohne \chapter (bei denen das Inhaltsverzeichnis nicht automatisch eine neue Seite beginnt), habe ich momentan keine Lösung.


% \documentclass{scrreprt}
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{caption, hyperref}
\usepackage{etoolbox}

\ifdefined\chapter
\pretocmd{\tableofcontents}%
{\clearpage\pdfbookmark[0]{\contentsname}{toc}}{}{}
\pretocmd{\listoftables}%
{\clearpage\pdfbookmark[0]{\listtablename}{lot}}{}{}
\else
\pretocmd{\tableofcontents}%
{\pdfbookmark[1]{\contentsname}{toc}}{}{}
\pretocmd{\listoftables}%
{\pdfbookmark[1]{\listtablename}{lot}}{}{}
\fi

\begin{document}
\tableofcontents
\listoftables
\clearpage

\ifdefined\chapter
\chapter{foo}
\else
\section{foo}
\fi
\begin{table} \centering \caption[AB]{AB} \label{tab:ab}
\begin{tabular}{ll} a & b\\ \end{tabular}
\end{table}

\end{document}

Gruß
Marco

lockstep
22-01-2010, 11:09
Dazu zwei weitere Fragen (bzw. ein Bugreport ;)):

Was passiert, wenn \tableofcontents (z.B. mit der Klasse book und der Option openright) ein \cleardoublepage auslöst? Weist die (nach \clearpage) gesetzte pdf-Sprungmarke dann auf die richtige Seite, oder ist alles noch komplizierter?

Zur Verwendung von \ifdefined: Soferne vorher mittels des LaTeX-Befehls \@ifundefined auf die Existenz von \chapter getestet wurde (und das tut wohl so manches Paket), hat \chapter die Bedeutung \relax, d.h. ein Test auf \ifdefined liefert true. Ist es aus diesem Grund nicht sicherer, mit \ifundef zu arbeiten (das bei einem Befehl mit der Bedeutung \relax ebenfalls true liefert)?

lockstep

mechanicus
22-01-2010, 11:54
Dazu zwei weitere Fragen (bzw. ein Bugreport ;)):
Habe kein Paket programmiert, somit kein Bug möglich :p:D:D



Was passiert, wenn \tableofcontents (z.B. mit der Klasse book und der Option openright) ein \cleardoublepage auslöst? Weist die (nach \clearpage) gesetzte pdf-Sprungmarke dann auf die richtige Seite, oder ist alles noch komplizierter?

Was soll passieren. \pdfbookmark erzeugt ja keine Seite. Nehmen wir beispielsweise an, dass du openany bei der Klasse book nutzt, dann beginnt das zugehörige \tableofcontents mit \clearpage usw. Wenn du nun \clearpage\clearpage schreibst, kommt ja nun keine zusätzliche Seite zur Stande.
Dito ist es bei openrigth. \clearpage\cleardoublepage. Da passiert nichts. Also brauchst du nichts abfangen.
Das ist auch gut so, denn bei KOMA wird schließlich extra \lisftof{} durch tocbasic definiert, was wiederum zusätzliche Verzweigungen einbaut.




Zur Verwendung von \ifdefined: Sofern vorher mittels des LaTeX-Befehls \@ifundefined auf die Existenz von \chapter getestet wurde (und das tut wohl so manches Paket), hat \chapter die Bedeutung \relax, d.h. ein Test auf \ifdefined liefert true. Ist es aus diesem Grund nicht sicherer, mit \ifundef zu arbeiten (das bei einem Befehl mit der Bedeutung \relax ebenfalls true liefert)?

Da hast du recht. Ich nehme sonst auch \@ifundefined. :D

Hier ist es mal gezeigt.

\documentclass{article}
\makeatletter
\@ifundefined{chapter}{%
\def\AusgabeI{\texttt{@ifundefined} sagt, wir haben kein \texttt{chapter}}%
}{%
\def\AusgabeI{\texttt{@ifundefined} sagt, wir haben ein \texttt{chapter}}%
}
\makeatother
\begin{document}
\AusgabeI

\ifdefined\chapter
wir haben ein \texttt{chapter}
\else
wir haben kein \texttt{chapter}
\fi
\end{document}


Entsprechend sollte es oben geändert werden. Entweder mittels der etoolbox-Anweisung oder tex-Primitive. Wobei ich etoolbox nehmen würde.

Gruß
Marco

lockstep
22-01-2010, 12:24
Habe kein Paket programmiert, somit kein Bug möglich :p:D:D


Was nicht ist, kann ja noch werden. :D



Was soll passieren. \pdfbookmark erzeugt ja keine Seite. Nehmen wir beispielsweise an, dass du openany bei der Klasse book nutzt, dann beginnt das zugehörige \tableofcontents mit \clearpage usw. Wenn du nun \clearpage\clearpage schreibst, kommt ja nun keine zusätzliche Seite zur Stande.


D'accord.



Dito ist es bei openrigth. \clearpage\cleardoublepage. Da passiert nichts. Also brauchst du nichts abfangen.


Sagen wir, ein Kapitel "Zusammenfassung" vor dem Inhaltsverzeichnis steht auf Seite 1, das Verzeichnis beginnt auf Seite 3. Die Sprungmarke verweist jedoch auf Seite 2:



\documentclass{scrbook}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{blindtext,etoolbox,hyperref}

\ifundef{\chapter}{%
\pretocmd{\tableofcontents}%
{\pdfbookmark[1]{\contentsname}{toc}}{}{}}%
{\pretocmd{\tableofcontents}%
{\clearpage\pdfbookmark[0]{\contentsname}{toc}}{}{}}

\begin{document}

\addchap{Zusammenfassung}

\blindtext

\tableofcontents

\chapter{Ein Kapitel}

\blindtext

\end{document}




Da hast du recht. Ich nehme sonst auch \@ifundefined. :D


Sag ich doch. :)

lockstep

mechanicus
22-01-2010, 13:18
Sagen wir, ein Kapitel "Zusammenfassung" vor dem Inhaltsverzeichnis steht auf Seite 1, das Verzeichnis beginnt auf Seite 3. Die Sprungmarke verweist jedoch auf Seite 2:
Ok,

dann wäre das möglich. Ich bin mir aber sicher, dass Herbert gleich um die Ecke kommt und sagt: So geht es auch und hat nur 4 Zeilen :p


\documentclass{report}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{ifthen}
\usepackage{blindtext,etoolbox,hyperref}


\makeatletter
\newboolean{dokumentenklasse}
\setboolean{dokumentenklasse}{false}
%Bestimmung ob KOMA -
\@ifclassloaded{scrbook}{\setboolean{dokumentenkla sse}{true}}{}
\@ifclassloaded{scrreprt}{\setboolean{dokumentenkl asse}{true}}{}
\@ifclassloaded{scrartcl}{\setboolean{dokumentenkl asse}{true}}{}
\ifthenelse{\boolean{dokumentenklasse}}{%
%Hier der Fall KOMA wird verwendet
\ifundef{\chapter}{%
\renewcommand*{\tableofcontents}{%
\begingroup\let\if@dynlist\if@tocleft%
\pdfbookmark[1]{\contentsname}{toc}
\listoftoc{toc}
\endgroup}
}{%
\renewcommand*{\tableofcontents}{%
\begingroup\let\if@dynlist\if@tocleft%
\if@openright\cleardoublepage\else\clearpage\fi
\pdfbookmark[0]{\contentsname}{toc}
\listoftoc{toc}
\endgroup}
}
}{%
%Hier der Fall Stamdardlasse wird verwendet
\renewcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\if@openright\cleardoublepage\else\clearpage\fi
\pdfbookmark[0]{\contentsname}{toc}%
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\conten tsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
}
\makeatother
\begin{document}

\chapter{Zusammenfassung}

\blindtext

\tableofcontents

\chapter{Ein Kapitel}

\blindtext

\end{document}

Ich bin nicht komplett auf tex-Primitive zurückgegangen. Habe die Vorteile von ifthen u.a auch genutzt. ;)

Die Standardklasse article ist hierbei nicht bedacht.

Gruß
Marco

lockstep
22-01-2010, 13:44
Ich bin mir aber sicher, dass Herbert gleich um die Ecke kommt und sagt: So geht es auch und hat nur 4 Zeilen :p

Ich habe auch den Verdacht, dass es kürzer geht, kann ihn aber nicht beweisen. :) Nur eine Sache: Ob man eine KOMA-Script-Klasse geladen hat, kann man mittels Test, ob \KOMAClassName definiert ist, herausfinden.

Jedenfalls habe ich heute gelernt, dass es nicht reicht, einfach irgendeinen \pdfbookmark-Befehl vor das Verzeichnis meiner Wahl zu stellen.

lockstep

mechanicus
22-01-2010, 13:48
Ich habe auch den Verdacht, dass es kürzer geht, kann ihn aber nicht beweisen. :)

Fang mal an :D



Nur eine Sache: Ob man eine KOMA-Script-Klasse geladen hat, kann man mittels Test, ob \KOMAClassName definiert ist, herausfinden.

Das wusste ich noch gar nicht.
Damit wird es aber schon kürzer :D



Jedenfalls habe ich heute gelernt, dass es nicht reicht, einfach irgendeinen \pdfbookmark-Befehl vor das Verzeichnis meiner Wahl zu stellen.

Für den "Normaluser" kann man schon die Frage mit ja beantworten. Der weiß ja, was er eingestellt hat :D

Unterm Strich muss ich aber sagen, das Beispiel funktioniert :p:p


Gruß
Marco

deidre_ann
22-01-2010, 15:43
Danke Marco und lockstep für eure wertvollen Hinweise!

Ich muss zugeben, am Schluss bin ich etwas ausgestiegen, weil das meine Fähigkeiten (noch) übersteigt.




\contentsname kannte ich, für \listtablename hätte ich allerdings nachschlagen müssen.
lockstep

Genau das war eigentlich meine zweite Frage. _WO_ schaust du so etwas nach? Ich meine, woher kenne ich die Abkürzungen "lof", "lot", "toc" ... beziehungsweise "\listtablename", "\listfigurename" .... ? Gibt es da ein empfehlenswertes Handbuch?

ciao, Ann

mechanicus
22-01-2010, 15:58
woher kenne ich die Abkürzungen "lof", "lot", "toc" ...

Das sind die Endungen der von LaTeX erstellten Dateien für die jeweiligen Verzeichnisse. Diese verwendest du auch bei den Anweisungen \addtocontents oder \addcontentsline. Und weil es die schon gibt, habe ich sie einfach genommen. Wie gesagt, kannst auch SprungmarkeInhaltsverzeichnis schreiben.



beziehungsweise "\listtablename", "\listfigurename" .... ?
Findest du in der Datei ngerman.ldf (Teil von babel) - Wenn du Linux mit TexLive nutzt, einfach in die Konsole und:

gedit `kpsewhich ngerman.ldf`
eingeben.

Gruß
Marco

lockstep
22-01-2010, 16:13
Genau das war eigentlich meine zweite Frage. _WO_ schaust du so etwas nach? Ich meine, woher kenne ich die Abkürzungen "lof", "lot", "toc" ... beziehungsweise "\listtablename", "\listfigurename" .... ? Gibt es da ein empfehlenswertes Handbuch?

Eines? Mehrere. :)

Spaß beiseite - ich kann zwar nicht nachträglich sagen, wie genau ich diese Dinge seinerzeit herausgefunden habe, dir aber einige Quellen nennen, bei denen man auch als AnfängerIn gute Chancen auf kluge Antworten hat. Im einzelnen:


In Wissenschaftliche Arbeiten schreiben mit LaTeX (http://www.amazon.de/Wissenschaftliche-Arbeiten-schreiben-LaTeX-CD-ROM/dp/3826658922/ref=sr_1_1?ie=UTF8&s=books&qid=1264176144&sr=8-1) findet man auf S. 203 die Kürzel "toc", "lof" und "lot" erläutert. Hier finden sich auch (falls man sie nicht schon kennt) die Befehle \tableofcontents, \listoffigures und \listoftables.
Wenn man in der UK TeX FAQ (http://www.tex.ac.uk/cgi-bin/texfaq2html) nach "tableofcontents" sucht, findet man als Eintrag u.a. How to change LaTeX's 'fixed names' (http://www.tex.ac.uk/cgi-bin/texfaq2html?label=fixnam). Hier stößt man auf \listtablename.
Auch der LaTeX-Begleiter (http://www.amazon.de/LaTeX-Begleiter-Frank-Mittelbach/dp/382737166X/ref=pd_sim_b_5) enthüllt auf S. 567 \listtablename.

lockstep

deidre_ann
22-01-2010, 19:55
Jetzt entgültig danke!
Alle Unklarheiten beseitigt. :)

Viele Grüße, Ann

mechanicus
22-01-2010, 22:00
Ich bin mir aber sicher, dass Herbert gleich um die Ecke kommt und sagt: So geht es auch und hat nur 4 Zeilen :p
War schneller:


\documentclass[openany]{scrbook}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{ifthen}
\usepackage{blindtext,etoolbox,hyperref}


\makeatletter
\ifundef{\chapter}{%
\pretocmd{\tableofcontents}%
{\pdfbookmark[1]{\contentsname}{toc}}{}{}}%
{\pretocmd{\tableofcontents}{%
\if@openright\cleardoublepage\else\clearpage\fi
\pdfbookmark[0]{\contentsname}{toc}}{}{}}
\makeatother
\begin{document}

\chapter{Zusammenfassung}

\blindtext

\tableofcontents

\chapter{Ein Kapitel}

\blindtext

\end{document}

Warum einfach, wenn es auch schwer geht. So sollte es eigentlich genau das gleich machen.

Gruß
Marco

lockstep
22-01-2010, 22:20
Schöne Lösung. :) Jetzt könnte man das Minimalbeispiel noch kürzen: Das Paket ifthen wird nicht menr benötigt, und auch \makeatletter und \makeatother können entfernt werden (auch wenn ich nicht sicher bin, warum).

lockstep

mechanicus
22-01-2010, 22:22
Jetzt könnte man das Minimalbeispiel noch kürzen: Das Paket ifthen wird nicht menr benötigt,

:eek: copy-paste-Bug :D:D



und auch \makeatletter und \makeatother können entfernt werden (auch wenn ich nicht sicher bin, warum).

Nein, wenn wir das machen, verliert doch der Befehl \if@openright seine Wirkung.

Gruß
Marco

lockstep
22-01-2010, 22:39
Nein, wenn wir das machen, verliert doch der Befehl \if@openright seine Wirkung.

Wieder etwas dazugelernt. Es gibt also Fälle, in denen das Fehlen von \makeatletter und \makeatother in der Präambel keine Fehlermeldung erzeugt (das Beispiel lief bei mir sauber durch), aber trotzdem zu ungewollten Ergebnissen führt.

lockstep