使用宏作为 \includepdf 中 addtotoc 的值

使用宏作为 \includepdf 中 addtotoc 的值

我想使用该pdfpages包将外部 PDF 文件中的页面包含到我的文档中。以下方法对我有用:

\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}

但是如果将 toc 条目列表作为宏传递,则会收到错误:

\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

?

我怎样(如果可能的话)才能\mylist正确传递addtotoc选项\includepdf

答案1

% 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}

原因是该选项addtotoc需要一个逗号分隔的值列表,并且不是一个扩展到该处的宏。

关于\begingroup\edef\x{\endgroup

这已经在其他地方解释过了,但为了完整起见,我在这里再重复一遍。当 LaTeX 发现时,\eincludepdf它会寻找可能的[后续内容,如果找到,它会收集[和之间的内容]作为要替换的参数#1(如果没有,[#1用空字符替换)。因此,\eincludepdf[pages=-,addtotoc={\mylist}]替换为

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

好戏开始了:TeX 执行\begingroup,从而进入“半单群”,然后继续执行\edef\x。首先,它会展开在以下括号中找到的所有内容:

  • \endgroup不可扩展,因此保持不变;
  • \noexpand 可扩展,其扩展为空,并且以下标记变为不可扩展;
  • [pages=-,addtotoc={都是不可扩展的;
  • \mylist扩展为\unexpanded{...},并且 也\unexpanded扩展,这使得 不受...进一步扩展的影响(它可能包含带有排版指令的文本,例如\textbf,因此我们要防止其扩展);
  • }]不可扩展。

现在 的意义\x被赋予了:\endgroup\includepdf[...]并且\x被展开!这关闭了组(因此删除了 的意义\x),并且 TeX 面临

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

瞧!

相关内容