10

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?

10
% 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à.

  • I'm sure you've explained expansion and grouping umpteenth times elsewhere, but could you do me a favor and elaborate why a { can come between \begingroup and \endgroup in your definition of \eincludepdf? I'm still puzzled after half a day. – LianTze Lim Apr 1 '12 at 8:52
  • Why I get an error when I use inside \mylist the command $\boldsymbol{}$ ? – Mohamed Vall Jul 29 '17 at 14:46
  • @LlavDem Well, it's a bit difficult to diagnose, with so few details. Anyway, load \usepackage{bm} after \usepackage{amsmath} and retry. It may be necessary to use \protect\boldsymbol, though. – egreg Jul 29 '17 at 18:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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