[Tex/LaTex] Using a macro as value of addtotoc in \includepdf

errorskey-valuemacrospdfpages

I would like to include pages from an external PDF file into my document, using the pdfpages package. The following works for me:

\documentclass{article}
\usepackage{pdfpages}

\begin{document}
\tableofcontents\clearpage

This is my document, and an included file starts on the next page.

\includepdf[pages=-,addtotoc={1,section,1,{A Title},sec.1},3,subsection,2,{A subsection},{s.1.1}]{LF426-2up.pdf}

\end{document}

But if the toc entry list was given passed as a macro instead, I get an error:

\newcommand{\mylist}{1,section,1,{A Title},s.1,3,subsection,2,{A subsection},{s.1.1}}
\includepdf[pages=-,addtotoc={\mylist}]{otherfile.pdf}
Runaway argument?
\END \fi \whiledo {\AM@page =\AM@toc@page }{\ifx \AM@toclist \empty \else \ETC.
! Paragraph ended before
\AM@parse@toclisti was complete.
<to be read again>
                    \par
l.12

?

How (if possible) can I pass \mylist correctly to the addtotoc option of \includepdf?

Best Answer

% Put this in the preamble
\newcommand{\eincludepdf}[1][]{%
  \begingroup\edef\x{\endgroup\noexpand\includepdf[#1]}\x}

% this can go everywhere (notice the `\unexpanded` to avoid possible problems)
\newcommand{\mylist}{\unexpanded{1,section,1,{A Title},s.1,3,%
  subsection,2,{A subsection},{s.1.1}}}

% With this you include the PDF file
\eincludepdf[pages=-,addtotoc={\mylist}]{otherfile.pdf}

The reason is that the option addtotoc expects a comma separated list of values and not a macro expanding to that.

A couple of words about \begingroup\edef\x{\endgroup

This has already been explained elsewhere, but for the sake of completeness, I'll repeat here. When LaTeX finds \eincludepdf it looks for a possible [ following and, if it finds one, gathers what's between [ and ] as an argument to replace #1 (if there's no [ then #1 is replaced by nothing). So, with \eincludepdf[pages=-,addtotoc={\mylist}] the replacement is

\begingroup\edef\x{\endgroup\noexpand\includepdf[pages=-,addtotoc={\mylist}]}\x

The fun begins: TeX executes \begingroup, thus entering in a "semisimple group", and proceeds to do the \edef\x. First of all it expands everything it finds in the following pair of braces:

  • \endgroup is not expandable, so it remains untouched;
  • \noexpand is expandable, its expansion is empty and the following token becomes unexpandable;
  • [pages=-,addtotoc={ are all unexpandable;
  • \mylist is expanded to \unexpanded{...}, and also \unexpanded is expanded, which gives ... not subject to further expansion (it might contain text with typesetting directives such as \textbf, so we protect against its expansion);
  • }] are not expandable.

Now the meaning of \x is assigned: \endgroup\includepdf[...] and \x is expanded! This closes the group (so removing the meaning of \x) and TeX is confronted with

\includepdf[pages=-,addtotoc={<contents of \mylist>}]{otherfile.pdf}

Et voilà.

Related Question