我想使用该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}
瞧!