4

I have to fulfill a layout requirement, where the ToC includes a list of figures and a list of tables (that's OK), but additionally in the pdf bookmarks each figure and table should be indicated within the section where it appears. Take the following MWE:

\documentclass[12pt]{article} \usepackage{todonotes} \usepackage{graphicx} \usepackage{float} \restylefloat{table} \restylefloat{figure} \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage[a4paper, margin=3cm, top=3cm, bottom=3cm]{geometry} \usepackage[bookmarks=true]{hyperref} \usepackage{bookmark} \hypersetup{ linktocpage=true, colorlinks=true, linkcolor=blue, filecolor=blue, urlcolor=blue, bookmarksopen=true } \bookmarksetup{numbered} \title{\begin{center} My Title \end{center} } \date{} \author{} \begin{document} \begin{titlepage} \maketitle \end{titlepage} \setcounter{page}{2} \newpage \pdfbookmark[0]{Contents}{Contents} \tableofcontents \listoffigures \listoftables \newpage \section{My first section} Bla, bla bla. \begin{figure}[H] \caption{My first Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My first Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end{tabular} \end{table} \newpage \section{My second section} More bla, bla. \begin{figure}[H] \caption{My second Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My second Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \end{document} 

It generates this ToC, which is exactly what I need:

enter image description here

But it also generates these pdf bookmarks:

enter image description here

But I need the pdf bookmarks to look like this (sorry for using Code style):

Contents |- 1 My first Section |- My first figure |- My first table |- 2 My second Section |- My second figure |- My second table 

Any ideas?

2
  • Welcome to TeX.SX. The ToC does not really include the LoF etc. They are just on the same page (due to short real contents) Commented Jun 9, 2016 at 14:05
  • Hi Christian, thanks for the welcome. I'm aware of that, actually it would be better to have the LoF and LoT within the ToC below the sections, but that's not an acceptance criterion for the layout (I have to match some authorities-defined layout). Critical is the bookmark question. ... May be I should add that i have hundreds of tables and figures automatically generated from R with knitr. So manually setting pdfbookmark and the level is not a real option Commented Jun 9, 2016 at 14:12

1 Answer 1

3

The easiest way I can think of is to hook into \caption and add the bookmark with a unique bookmark label (generated by the total number of figures or tables)

To get the total numbers use (well, my ;-)) package xassocnt and associate stepping the relevant counters with them.

The \pdfbookmark[2]{text}{label:name} will add the figure or table entry as subsection level to the current section.

Be careful to use \texorpdfstring{tex content}{pdf content} for specific content of the caption, i.e. \caption{\texorpdfstring{$E=mc^2}{E=mc\textsuperscript{2}}}

\documentclass[12pt]{article} \usepackage{todonotes} \usepackage{graphicx} \usepackage{xassoccnt} \newcounter{totalfigure} \newcounter{totaltable} \DeclareAssociatedCounters{figure}{totalfigure} \DeclareAssociatedCounters{table}{totaltable} \usepackage{float} \restylefloat{table} \restylefloat{figure} \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage{caption} \makeatletter \AtBeginDocument{% \let\caption@@caption\caption \RenewDocumentCommand{\caption}{som}{% \IfBooleanTF{#1}{% \caption@@caption{#3}% }{% \IfValueTF{#2}{% \caption@@caption[#2]{#3}% \pdfbookmark[2]{#2}{\@captype:\number\value{total\@cap@type}}% }{% \phantomsection \caption@@caption{#3}% \pdfbookmark[2]{#3}{\@captype:\number\value{total\@captype}}% }% }% } } \usepackage[a4paper, margin=3cm, top=3cm, bottom=3cm]{geometry} \usepackage[bookmarks=true]{hyperref} \usepackage{bookmark} \hypersetup{ linktocpage=true, colorlinks=true, linkcolor=blue, filecolor=blue, urlcolor=blue, bookmarksopen=true } %\captionsetup[figure]{format=bookmarksfig} %\captionsetup[table]{format=bookmarkstab} \bookmarksetup{numbered} \title{\begin{center} My Title \end{center} } \date{} \author{} \begin{document} \begin{titlepage} \maketitle \end{titlepage} \setcounter{page}{2} \newpage \pdfbookmark[0]{Contents}{Contents} \tableofcontents \listoffigures \listoftables \newpage \section{My first section} Bla, bla bla. \begin{figure}[H] \caption{My first Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My first Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end{tabular} \end{table} \newpage \section{My second section} More bla, bla. \begin{figure}[H] \caption{My second Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My second Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \end{document} 

enter image description here

Update

This does not use xassoccnt but a simple check of \@captype and increases the relevant \total... counter then.

It uses \currentpdfbookmark which takes care of the section level.

\documentclass[12pt]{article} \usepackage{todonotes} \usepackage{graphicx} \newcounter{totalfigure} \newcounter{totaltable} %\usepackage{xassoccnt} %\DeclareAssociatedCounters{figure}{totalfigure} %\DeclareAssociatedCounters{table}{totaltable} \usepackage{float} \restylefloat{table} \restylefloat{figure} \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage{caption} \usepackage{xparse} \makeatletter \AtBeginDocument{% \let\caption@@caption\caption \RenewDocumentCommand{\caption}{som}{% %checking which caption type is here and stepping the relevant total counter \def\temp@@a{figure} \def\temp@@b{table} \ifx\@captype\temp@@a \stepcounter{total\@captype}% \fi \ifx\@captype\temp@@b \stepcounter{total\@captype}% \fi \IfBooleanTF{#1}{% \caption@@caption{#3}% }{% \IfValueTF{#2}{% \phantomsection \caption@@caption[#2]{#3}% \currentpdfbookmark{#2}{\@captype:\number\value{total\@cap@type}}% }{% \phantomsection \caption@@caption{#3}% \currentpdfbookmark{#3}{\@captype:\number\value{total\@captype}}% }% }% } } \makeatother \usepackage[a4paper, margin=3cm, top=3cm, bottom=3cm]{geometry} \usepackage[bookmarks=true]{hyperref} \usepackage{bookmark} \hypersetup{ linktocpage=true, colorlinks=true, linkcolor=blue, filecolor=blue, urlcolor=blue, bookmarksopen=true } \bookmarksetup{numbered} \title{% \begin{center} My Title \end{center} } \date{} \author{} \begin{document} \begin{titlepage} \maketitle \end{titlepage} \setcounter{page}{2}% \newpage \pdfbookmark[0]{Contents}{Contents} \tableofcontents \listoffigures \listoftables \newpage \section{My first section} Bla, bla bla. \begin{figure}[H] \caption{My first Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My first Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end{tabular} \end{table} \newpage \section{My second section} More bla, bla. \begin{figure}[H] \caption{My second Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My second Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsection{Foo subsection} \begin{figure}[H] \caption{My third Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My third Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsubsection{Foo subsubsection} \begin{figure}[H] \caption{My fourth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My fourth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \clearpage \section{Yet another section} \begin{figure}[H] \caption{My sixth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My sixth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsection{Foo subsection} \begin{figure}[H] \caption{My seventh Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My seventh Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsubsection{Foo subsubsection} \begin{figure}[H] \caption{My eighth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My eighth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \end{document} 

Next update: With figure etc. numbers

\documentclass[12pt]{article} \usepackage{todonotes} \usepackage{graphicx} \newcounter{totalfigure} \newcounter{totaltable} %\usepackage{xassoccnt} %\DeclareAssociatedCounters{figure}{totalfigure} %\DeclareAssociatedCounters{table}{totaltable} \usepackage{float} \restylefloat{table} \restylefloat{figure} \usepackage[utf8]{inputenc} \usepackage[english]{babel} \usepackage{caption} \usepackage{xparse} \makeatletter \AtBeginDocument{% \let\caption@@caption\caption \newcommand{\generatebookmark}[1]{% \belowpdfbookmark{\csname \@captype name\endcsname\ \csname the\@captype\endcsname: #1}{\@captype:\number\value{total\@captype}}% } \RenewDocumentCommand{\caption}{som}{% %checking which caption type is here and stepping the relevant total counter \def\temp@@a{figure} \def\temp@@b{table} \ifx\@captype\temp@@a \stepcounter{total\@captype}% \fi \ifx\@captype\temp@@b \stepcounter{total\@captype}% \fi \IfBooleanTF{#1}{% \caption@@caption{#3}% }{% \IfValueTF{#2}{% \phantomsection \caption@@caption[#2]{#3}% \generatebookmark{#2}% }{% \phantomsection \caption@@caption{#3}% \generatebookmark{#3}% }% }% } } \makeatother \usepackage[a4paper, margin=3cm, top=3cm, bottom=3cm]{geometry} \usepackage[bookmarks=true]{hyperref} \usepackage{bookmark} \hypersetup{ linktocpage=true, colorlinks=true, linkcolor=blue, filecolor=blue, urlcolor=blue, bookmarksopen=true } \bookmarksetup{numbered} \title{% \begin{center} My Title \end{center} } \date{} \author{} \begin{document} \begin{titlepage} \maketitle \end{titlepage} \setcounter{page}{2}% \newpage \pdfbookmark[0]{Contents}{Contents} \tableofcontents \listoffigures \listoftables \newpage \section{My first section} Bla, bla bla. \begin{figure}[H] \caption{My first Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My first Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end{tabular} \end{table} \newpage \section{My second section} More bla, bla. \begin{figure}[H] \caption{My second Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My second Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsection{Foo subsection} \begin{figure}[H] \caption{My third Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My third Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsubsection{Foo subsubsection} \begin{figure}[H] \caption{My fourth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My fourth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \clearpage \section{Yet another section} \begin{figure}[H] \caption{My sixth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My sixth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsection{Foo subsection} \begin{figure}[H] \caption{My seventh Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My seventh Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \subsubsection{Foo subsubsection} \begin{figure}[H] \caption{My eighth Figure} \missingfigure[figwidth=6cm]{} \end{figure} \begin{table}[H] \caption{My eighth Table} \begin{tabular}{ |c|c|c| } \hline cell1 & cell2 & cell3 \\ cell4 & cell5 & cell6 \\ cell7 & cell8 & cell9 \\ \hline \end {tabular} \end{table} \end{document} 

enter image description here

15
  • Christian, thanks for your answer. I wasn't able to get your MWE running. ! LaTeX Error: File xassoccnt.sty not found. Could you please guide me on how to install your package? That said, I have some doubts on how universal this will be. My MWE had just 2 main sections, my real case has sections and subsections, It will be difficult to introduce the bookmark level manually (there will be levels 2, 3, 4), am I right? Commented Jun 9, 2016 at 15:08
  • Installation of packages depends on your TeX distribution. I think, I can add a solution without xassoccnt. Do you really want to use figures/table in the relevant section level? Try \currentpdfbookmark instead of pdfbookmark[2] (the remaining arguments are the same then) Commented Jun 9, 2016 at 15:11
  • I didn't know \currentpdfbookmark , that can easily solve the problem indeed. If you could help me getting your package running or implementing a workaround you would save my day! (I'm using MikTeX 2.9). I'll try in parallel anyway. Thanks a lot. Commented Jun 9, 2016 at 15:29
  • @albifrons: I am working on it ;-) Commented Jun 9, 2016 at 15:30
  • @albifrons: See the update at the end of the post Commented Jun 9, 2016 at 15:57

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.