% \iffalse meta-comment % % hypbmsec.dtx % % This file is part of the package `hypbmsec' for use with LaTeX2e. % % Function: Bookmarks in sectioning commands. % % Copyright (C) 1998,1999,2000 Heiko Oberdiek. % % This program may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % Please send error reports and suggestions for improvements to % Heiko Oberdiek . % %<*dtx> \ProvidesFile{hypbmsec.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{hypbmsec} %\ProvidesFile{hypbmsec.drv} % \fi % \ProvidesFile{hypbmsec.dtx} [2000/03/22 v2.1 Bookmarks in sectioning commands (HO).] % % \GetFileInfo{hypbmsec.dtx} % % \CheckSum{159} % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{holtxdoc} \begin{document} \DocInput{hypbmsec.dtx} \end{document} % % \fi % % \DoNotIndex{\csname,\endcsname,\expandafter,\noexpand,\string} % \DoNotIndex{\begingroup,\endgroup,\def,\xdef,\long,\let} % \DoNotIndex{\ifx,\newcommand,\renewcommand} % % \newcommand{\type}[1]{\textsf{#1}} % % \SetupTitle{hyperref,section,bookmark,pdf,LaTeX} % \maketitle % % \begin{abstract} % This package expands the syntax of the sectioning commands. If the % argument of the sectioning commands isn't usable as outline entry, % a replacement for the bookmarks can be given. % \end{abstract} % % \tableofcontents % % \section{Usage} % % \subsection{Bookmarks restrictions}\label{sec:restrictions} % Outline entries (bookmarks) are written to a file and have % to obey the pdf specification. % Therefore they have several restrictions: % \begin{itemize} % \item Bookmarks have to be encoded in PDFDocEncoding^^A % \footnote{\Package{hyperref} doesn't support % Unicode.}. % \item They should only expand to letters and spaces. % \item The result of expansion have to be a valid pdf string. % \item Stomach commands like \cmd{\relax}, box commands, math, % assignments, or definitions aren't allowed. % \item Short entries are recommended, which allow a clear view. % \end{itemize} % % \subsection{\texorpdfstring{\cmd{\texorpdfstring}}{^^A % \textbackslash texorpdfstring}} % The generic way in package \Package{hyperref} is the use % of \cmd{\texorpdfstring}^^A % \footnote{In versions of \Package{hyperref} below 6.54 see % \cmd{\ifbookmark}.}: % \begin{quote} %\begin{verbatim} %\section{Pythagoras: % \texorpdfstring{$a^2+b^2=c^2}{% % a\texttwosuperior\ + b\texttwosuperior\ = % c\texttwosuperior}% %} %\end{verbatim} % \end{quote} % % \subsection{Sectioning commands} % The package \Package{hyperref} automatically generates % bookmarks from the sectioning commands, % unless it is suppressed by an option. % Commands that structure the text are here called % ``sectioning commands'': % \begin{quote} % \cmd{\part}, \cmd{\chapter},\\ % \cmd{\section}, \cmd{\subsection}, \cmd{\subsubsection},\\ % \cmd{\paragraph}, \cmd{\subparagraph} % \end{quote} % % \subsection{Places\texorpdfstring{ for sectioning strings}{}} % \label{sec:places} % The argument(s) of these commands are used on several places: % \begin{description} % \item[\type{text}] % The current text without restrictions. % \item[\type{toc}] % The headlines and the table of contents with the % restrictions of ``moving arguments''. % \item[\type{out}] % The outlines with many restrictions: The outline % have to expand to a valid pdf string with PDFDocEncoding % (see \ref{sec:restrictions}). % \end{description} % % \subsection{\texorpdfstring{Solution with o}{O}ptional arguments} % If the user wants to use a footnote within a sectioning command, % the \LaTeX{} solution is an optional argument: % \begin{quote} % |\section[Title]{Title\footnote{Footnote text}}| % \end{quote} % Now |Title| without the footnote is used in the headlines and % the table of contents. Also \Package{hyperref} uses it for the % bookmarks. % % This package \Package{\filename} offers two possibilities to % specify a separate outline entry: % \begin{itemize} % \item An additional second optional argument in square brackets. % \item An additional optional argument in parentheses (in % assoziation with a pdf string that is internally surrounded % by parentheses, too). % \end{itemize} % Because \Package{\filename} stores the original meaning of the % sectioning commands and uses them again, there should be no % problems with packages that redefine the sectioning commands, if % these packages doesn't change the syntax. % % \subsection{Syntax} % The following examples show the syntax of the sectioning % commands. For the places the strings appear the abbreviations % are used, that are introduced in \ref{sec:places}. % % \subsubsection{\texorpdfstring{Star form}{^^A % \textbackslash section*\{\}}} % The behaviour of the star form isn't changed. The string % appears only in the current text: % \begin{article}{Syntax} % \begin{quote} % |\section*{text}| % \end{quote} % \end{article} % % \subsubsection{\texorpdfstring{Without optional arguments}{^^A % \textbackslash section\{\}}} % The normal case, the string in the mandatory argument is % used for all places: % \begin{article}{Syntax} % \begin{quote} % |\section{text, toc, out}| % \end{quote} % \end{article} % % \subsubsection{\texorpdfstring{One optional argument}{^^A % \textbackslash section[]\{\}}} % Also the form with one optional parameter in square brackets isn't % new; for the bookmarks the optional parameter is used: % \begin{article}{Syntax} % \begin{quote} % |\section[toc, out]{text}| % \end{quote} % \end{article} % % \subsubsection{\texorpdfstring{Two optional arguments}{^^A % \textbackslash section[][out]\{\}}}\label{sec:two} % The second optional parameter in square brackets is introduced % by this package to specify an outline entry: % \begin{article}{Syntax} % \begin{quote} % |\section[toc][out]{text}| % \end{quote} % \end{article} % % \subsubsection{\texorpdfstring{Optional argument in parentheses}{^^A % \textbackslash section(out)\{\}}} % Often the \type{toc} and the \type{text} string would be the same. % With the method of the two optional arguments in square brackets % (see \ref{sec:two}) this string must be given twice, % if the user only wants to specify a different outline entry. % Therefore this package offers another possibility: % In association with the internal representation in the pdf file % an outline entry can be given in parentheses. % So the package can easily distinguish between % the two forms of optional arguments and the order does not matter: % \begin{article}{Syntax} % \begin{quote} % |\section(out){toc, text}|\\ % |\section[toc](out){text}|\\ % |\section(out)[toc]{text}| % \end{quote} % \end{article} % % \subsection{Without \Package{hyperref}} % Package \Package{\filename} uses \Package{hyperref} for support of % the bookmarks, but this package is not required. % If \Package{hyperref} isn't loaded, or % is called with a driver that doesn't support bookmarks, % package \Package{\filename} shouldn't be removed, % because this would lead to % a wrong syntax of the sectioning commands. % In any cases package \Package{\filename} % supports its syntax and ignores the outline entries, % if there are no code for bookmarks. % So it is possible to write texts, % that are processed with several drivers to get different output % formats. % % \subsection{Protecting parentheses} % If the string itself contains parentheses, they have to be hidden % from \TeX's argument parsing mechanism. % The argument should be surrounded % by curly braces: % \begin{quote} % |\section({outlines(bookmarks)}){text, toc}| % \end{quote} % With version 6.54 of \Package{hyperref} the other standard method % works, too: The closing parenthesis is protected: % \begin{quote} % |\section(outlines(bookmarks{)}){text, toc}| % \end{quote} % % \Installation % % \StopEventually{} % % \section{Implementation} % \begin{macrocode} %<*package> % \end{macrocode} % % Because of redifining the sectioning commands, it is dangerous % to reload the package several times. % \begin{macrocode} \@ifundefined{hbs@do}{}{% \PackageInfo{hypbmsec}{Package 'hypbmsec' is already loaded} \endinput } % \end{macrocode} % % \begin{macro}{\hbs@do} % The redefined sectioning commands calls \cmd{\hbs@do}. It does % \begin{itemize} % \item handle the star case. % \item resets the macros that store the entries for the outlines % (\cmd{\hbs@bmstring}) and table of contents (\cmd{\hbs@tocstring}). % \item store the sectioning command |#1| in \cmd{\hbs@seccmd} % for later reuse. % \item at last call \cmd{\hbs@checkarg} that scans and interprets the % parameters of the redefined sectioning command. % \end{itemize} % \begin{macrocode} \def\hbs@do#1{% \@ifstar{#1*}{% \let\hbs@tocstring\relax \let\hbs@bmstring\relax \let\hbs@seccmd#1% \hbs@checkarg }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\hbs@checkarg} % \cmd{\hbs@checkarg} determines the type of the next argument: % \begin{itemize} % \item An optional argument in square brackets can be an entry % for the table of contents or the bookmarks. It will be % read by \cmd{\hbs@getsquare} % \item An optional argument in parentheses is an outline entry. % This is worked off by \cmd{\hbs@getbookmark}. % \item If there are no more optional arguments, \cmd{\hbs@process} % reads the mandatory argument and calls the original % sectioning commands. % \end{itemize} % \begin{macrocode} \def\hbs@checkarg{% \@ifnextchar[\hbs@getsquare{% \@ifnextchar(\hbs@getbookmark\hbs@process }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\hbs@getsquare} % \cmd{\hbs@getsquare} reads an optional argument in square % brackets and determines, if this is an entry for the table % of contents or the bookmarks. % \begin{macrocode} \long\def\hbs@getsquare[#1]{% \ifx\hbs@tocstring\relax \def\hbs@tocstring{#1}% \else \hbs@bmdef{#1}% \fi \hbs@checkarg } % \end{macrocode} % \end{macro} % % \begin{macro}{\hbs@getbookmark} % \cmd{\hbs@getbookmark} reads an outline entry in parentheses. % \begin{macrocode} \def\hbs@getbookmark(#1){% \hbs@bmdef{#1}% \hbs@checkarg } % \end{macrocode} % \end{macro} % % \begin{macro}{\hbs@bmdef} % The command \cmd{\hbs@bmdef} save the bookmark entry in % parameter |#1| in the macro \cmd{\hbs@bmstring} and catches % the case, if the user has given several outline strings. % \begin{macrocode} \def\hbs@bmdef#1{% \ifx\hbs@bmstring\relax \def\hbs@bmstring{#1}% \else \PackageError{hypbmsec}{% Sectioning command with too many parameters% }{% You can only give one outline entry.% }% \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\hbs@process} % The parameter |#1| is the mandatory argument of the sectioning % commands. \cmd{\hbs@process} calls the original sectioning command % stored in \cmd{\hbs@seccmd} with arguments that depend of which % optional argument are used previously. % \begin{macrocode} \long\def\hbs@process#1{% \ifx\hbs@tocstring\relax \ifx\hbs@bmstring\relax \hbs@seccmd{#1}% \else \hbs@seccmd{\texorpdfstring{#1}\hbs@bmstring}% \fi \else \ifx\hbs@bmstring\relax \hbs@seccmd[\hbs@tocstring]{#1}% \else \hbs@seccmd[\texorpdfstring\hbs@tocstring\hbs@bmstring]{#1}% \fi \fi } % \end{macrocode} % \end{macro} % % We have to check, whether package \Package{hyperref} is loaded % and have to provide a definition for \cmd{\texorpdfstring}. % Because \Package{hyperref} can be loaded after this package, % we do the work later (\cmd{\AtBeginDocument}). % % This code only checks versions of \Package{hyperref} that % define \cmd{\ifbookmark} (v6.4x until v6.53) or % \cmd{\texorpdfstring} (v6.54 and above). Older versions aren't % supported. % \begin{macrocode} \AtBeginDocument{% \@ifundefined{texorpdfstring}{% \@ifundefined{ifbookmark}{% \let\texorpdfstring\@firstoftwo \@ifpackageloaded{hyperref}{% \PackageInfo{hypbmsec}{% \ifx\hy@driver\@empty Default driver \else '\hy@driver' \fi of hyperref not supported,\MessageBreak bookmark parameters will be ignored% }% }{% \PackageInfo{hypbmsec}{% Package hyperref not loaded,\MessageBreak bookmark parameters will be ignored% }% }% }% {% \newcommand\texorpdfstring[2]{\ifbookmark{#2}{#1}}% \PackageWarningNoLine{hypbmsec}{% Old hyperref version found,\MessageBreak update of hyperref recommended% }% }% }{}% % \end{macrocode} % % Other packages are allowed to redefine the sectioning commands, % if they does not change the syntax. Therefore the redefinitons % of this package should be done after the other packages. % \begin{macrocode} \let\hbs@part \part \let\hbs@section \section \let\hbs@subsection \subsection \let\hbs@subsubsection\subsubsection \let\hbs@paragraph \paragraph \let\hbs@subparagraph \subparagraph \renewcommand\part {\hbs@do\hbs@part} \renewcommand\section {\hbs@do\hbs@section} \renewcommand\subsection {\hbs@do\hbs@subsection} \renewcommand\subsubsection{\hbs@do\hbs@subsubsection} \renewcommand\paragraph {\hbs@do\hbs@paragraph} \renewcommand\subparagraph {\hbs@do\hbs@subparagraph} \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname chapter\endcsname\relax\else \let\hbs@chapter \chapter \renewcommand\chapter {\hbs@do\hbs@chapter} \fi } % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \StartHistory % \HistVersion{1998/11/20 v1.0} % \begin{itemize} % \item First version. % \item It merges package \Package{hysecopt} and % package \Package{hypbmpar}. % \item Published for the DANTE'99 meating^^A %\URL{}{http://dante99.cs.uni-dortmund.de/handouts/oberdiek/hypbmsec.sty}. % \end{itemize} % \HistVersion{1999/04/12 v2.0} % \begin{itemize} % \item Adaptation to \Package{hyperref} version 6.54. % \item Documentation in dtx format. % \item Copyright: LPPL (\CTAN{macros/latex/base/lppl.txt}) % \item First CTAN release. % \end{itemize} % \HistVersion{2000/03/22 v2.1} % \begin{itemize} % \item Bug fix in redefinition of \cmd{\chapter}. % \item Copyright: LPPL 1.2 % \end{itemize} % % \hfuzz10pt % \PrintIndex % % \Finale \endinput