Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I'm working on a book using titlesec&titletoc and want to include chapters (with their numbers and names, but no page number) in the list of figures, if and only if they contain figures. Manually adding

\addtocontents{lof}{\contentsline {chapter}{\numberline {\thechapter} {#1}}{} }}

after each chapter works (#1 is the chaptername), and I could also fix the alignment (not part of MWE), but I couldn't append this to \chapter.

Can I get titletoc to include chapters into the list of figures?
Or how do I modify \chapter to add themselves to the lof?

\documentclass[a4paper,12pt]{book}

\usepackage[pagestyles,psfloats,clearempty,newlinetospace]{titlesec}
\usepackage{titletoc}

\titleformat{\chapter}{\huge\bfseries\filcenter}{\vspace{1cm}\thechapter}{0.5cm}{}[]

%\let\Oldchapter\chapter
%\renewcommand{\chapter}[1]{\Oldchapter{#1}\addtocontents{lof}%
%{\contentsline {chapter}{\numberline {\thechapter} {#1}}{} }}

\begin{document}

\tableofcontents
\listoffigures

\mainmatter

\chapter{Introduction}
\section{First}

\chapter{Has Figures}
\begin{figure}
\rule{1cm}{1cm}
\caption{caption text}
\end{figure}

\end{document}
share|improve this question

3 Answers 3

up vote 17 down vote accepted

The code below illustrates a possible solution; the basic idea is to let the figure environment do the job and decide if the chapter info will be written to the ToC; this is accomplished by using \AtBeginEnvironment (from the etoolbox or xpatch packages); whenever the figure environment is used in the document, it will examine a boolean flag; if the boolean is false, then it adds the chapter information to the LoF and sets the boolean to true; otherwise, it does not add any information.

The \@chapter command was also modified to reset the boolean and to globally store the information about the corresponding title and number; this information will then be used when writing to the LoF.

\documentclass{book}
\usepackage{etoolbox}  % or xpatch

\makeatletter
% initial definitions of the chapter info (name and number)
\def\thischaptertitle{}\def\thischapternumber{}
\newtoggle{noFigs}

\apptocmd{\@chapter}%
  {\gdef\thischaptertitle{#1}\gdef\thischapternumber{\thechapter}%
    \global\toggletrue{noFigs}}{}{}

% the figure environment does the job: the first time it is used after a \chapter command, 
% it writes the information of the chapter to the LoF
\AtBeginDocument{%
  \AtBeginEnvironment{figure}{%
    \iftoggle{noFigs}{
      \addtocontents{lof}{\protect\contentsline {chapter}%
        {\protect\numberline {\thischapternumber} {\thischaptertitle}}{}{} }
      \global\togglefalse{noFigs}
    }{}
  }%
}

\makeatother

\begin{document}

\tableofcontents
\listoffigures

\mainmatter

\chapter{Introduction with no Figures}

\chapter{Test Chapter with Figures}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}

\chapter{Test Chapter with no Figures}

\chapter{Another Test Chapter with Figures}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}

\end{document}

The list of figures obtained:

enter image description here

Remarks:

  1. The initial solution was simplified thanks to a comment by Markus Schmassmann.
  2. As lockstep mentions in his comment, further refinement would be needed in case one uses a continuous figure numbering scheme. Done by Markus Schmassmann.
  3. When using hyperref, the package must be loaded after the lines \apptocmd{\@chapter}....
share|improve this answer
    
@GonzaloMedina You should add a hint that further refinement would be needed in case one uses a continuous figure numbering scheme. Anyway, great answer! –  lockstep Apr 20 '12 at 23:58
    
@lockstep: Thanks. I've added a remark. –  Gonzalo Medina Apr 21 '12 at 2:14
1  
This be simplified by deleting \newcommand*\l@chapterinfo & \def\@nodottedtocline and replacing \addcontentsline by \addtocontents{lof}{\contentsline {chapter}{\numberline {\thischapternumber} {\thischaptertitle}}{} }. titletoc takes care of the formating. –  Markus Schmassmann Apr 21 '12 at 3:46
    
@MarkusSchmassmann: you're right. I incorporated your suggestion into my answer. Thank you. –  Gonzalo Medina Apr 21 '12 at 4:19
    
@GonzaloMedina: I forgot to \protect some commands, otherwise the lof won't be human readable. –  Markus Schmassmann Apr 21 '12 at 15:05

Another way to handle this that doesn't require individually modifying each environment you need (figure, table, algorithm, listing, ...) is to instead patch \addcontentsline. A slight modification of Gonzalo's solution:

\documentclass{book}
\usepackage{etoolbox}

\makeatletter
\def\thischaptertitle{}
\apptocmd{\@chapter}{\gdef\thischaptertitle{#1}}{}{}

\newcommand{\DeclareDividedList}[1]%
  {\newcounter{#1@chapter}\setcounter{#1@chapter}{0}}

\pretocmd{\addcontentsline}%
  {\ifltxcounter{#1@chapter}%
   {%
     \ifnumgreater{\thechapter}{\value{#1@chapter}}{%
       \setcounter{#1@chapter}{\thechapter}%
       \addtocontents{#1}{\protect\contentsline{chapter}%
         {\protect\numberline {\thechapter} {\thischaptertitle}}{}{} }
     }{}%
   }{}%
  }{}{}
\makeatother

\DeclareDividedList{lof}
\DeclareDividedList{lot}

\begin{document}

\tableofcontents
\listoffigures
\listoftables

\mainmatter

\chapter{Introduction with no Figures}

\chapter{Test Chapter with Figures but no Tables}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{figure}
\caption{caption text}
\end{figure}

\chapter{Test Chapter with Tables but no Figures}
\begin{table}
\caption{caption text}
\end{table}
\begin{table}
\caption{caption text}
\end{table}

\chapter{Test Chapter with Figures and Tables}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{table}
\caption{caption text}
\end{table}
\begin{figure}
\caption{caption text}
\end{figure}
\begin{table}
\caption{caption text}
\end{table}
\begin{figure}
\caption{caption text}
\end{figure}

\end{document}

This gives you chapter headings in both the list of figures and list of tables:

list of figures example list of tables example

If you don't use the \DeclareDividedList for one of them, say lot, then the counter \lot@chapter isn't created, and the \ifltxcounter switch will fail and the added code is not run when creating lines in the list of tables; the list will be typeset exactly as normal, without chapter headers.

Just as with the previous examples, this tends to break with unnumbered chapters.

share|improve this answer

More of a comment than an answer actually (sorry, new account no cred' yet). With minor changes, the code proposed also works for adding chapters in a LoT by similarly modding the table environment.

\documentclass{book} \usepackage{etoolbox}  % or xpatch

\makeatletter % initial definitions of the chapter info (name and number) \def\thischaptertitle{}\def\thischapternumber{} \newtoggle{noTabs}

\apptocmd{\@chapter}%   {\gdef\thischaptertitle{#1}\gdef\thischapternumber{\thechapter}%
    \global\toggletrue{noTabs}}{}{}

% the table environment does the job: the first time it is used after a \chapter command,  % it writes the information of the chapter to the LoF \AtBeginDocument{%   \AtBeginEnvironment{table}{%
    \iftoggle{noTabs}{
      \addtocontents{lot}{\protect\contentsline {chapter}%
        {\protect\numberline {\thischapternumber} {\thischaptertitle}}{}{} }
      \global\togglefalse{noTabs}
    }{}   }% }

\makeatother

\begin{document}

\tableofcontents \listoftables

\mainmatter

\chapter{Introduction with no Tables}

\chapter{Test Chapter with Tables} \begin{table} \caption{caption text} \end{table} \begin{table} \caption{caption text} \end{table}

\chapter{Test Chapter with no Tables}

\chapter{Another Test Chapter with Tables} \begin{table} \caption{caption text} \end{table} \begin{table} \caption{caption text} \end{table} \begin{table} \caption{caption text} \end{table} \begin{table} \caption{caption text} \end{table} \begin{table} \caption{caption text} \end{table}

\end{document}

Unfortunately I can't post a snapshot either...

Anyway, great post, exactly what I was looking for!

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.