考虑一下包\includepdf
中的宏pdfpages
。如果我这样做
\includepdf[pages=1-]{blank.pdf}
没问题。但是,如果我这样做
\def\foo{{1-}}
\includepdf[pages=\foo]{blank.pdf}
我得到了错误
! 缺少为 \ifnum 插入的 =。
我之前以为问题在于\includepdf
没有将宏参数扩展为pages
,但现在我想知道情况是否确实如此。因为如果我尝试
\includepdf[pages=\expanded{\foo}]{blank.pdf}
没有什么明显的区别。
我尝试过运行\tracingmacros=1
,看起来两种情况下\foo
至少都得到了扩展,但不清楚之后出了什么问题。MWE 紧随其后。
\documentclass{article}
\usepackage{grffile}
\usepackage{pdfpages}
\begin{document}
\tracingmacros=1
\def\foo{{1-}}
\includepdf[pages=\foo]{blank.pdf}
% \includepdf[pages=\expanded{\foo}]{blank.pdf}
\tracingmacros=0
\end{document}
\tracingmacros=1
以下是带有 的版本的部分输出\expanded
,即
\includepdf[pages=\foo]{blank.pdf}
输出如下:
\foo ->{1-}
\AM@trim@spacei #1->\AM@trim@spaceii #1 \END
#1<-{1-}
\AM@trim@spaceii #1 #2\END ->#1
#1<-1-
#2<-
\AM@checkinteger #1->\ifcat _\ifnum 9<1#1_\else A\fi \AM@integertrue \else \AM@
integerfalse \fi
#1<-\AM@tempi
\AM@tempi ->1-
\AM@integertrue ->\let \ifAM@integer \iftrue
\AM@checkpagenumber #1->\ifnum #1>\AM@pagecount \relax \ifthenelse {\boolean {A
M@pkg@draft} \and \boolean {AM@survey}}{}{\PackageError {pdfpages} {Page #1 of
`\AM@currentdocname ' does not exist} {You have set a wrong page number in the
`pages' option. Document \MessageBreak `\AM@currentdocname ' does not have #1 p
ages.}}\fi
#1<-\AM@tempi
\AM@tempi ->1-
! Missing = inserted for \ifnum.
<to be read again>
正如所见,\foo
在这种情况下确实得到了扩展。
我之前问过的相关问题: “使用 pgfkeys 将参数传递给宏以包含 PDF 文件,使用 pdfpages”。
答案1
pdfpages
检查密钥时pages
,它会执行其定义中指定的操作
\define@key{pdfpages}{pages}{\AM@CheckValue{pages}{#1}%
\def\AM@pagestemp{#1}}
该\AM@CheckValue
部件没有问题,因为
\def\AM@CheckValue#1#2{%
\ifx\\#2\\\PackageError{pdfpages}
{Option `#1' must have a non-empty value}%
\fi
}
(嗯,\PackageError
应该有三参数,所以最好不要传递空值)。
然后\AM@pagestemp
设置为包含值,在您的情况下\foo
;它被初始化为包含1
。
之后,\expandafter\AM@readlist\expandafter{\AM@pagestemp}
被称为,它变成
\AM@readlist{\foo}
这是一个宏,它用逗号分隔参数,并将每个项传递\AM@checkrange
给
\AM@checkrange#1-\END
在你的情况下,#1
是\foo
。宏定义为
\def\AM@checkrange#1-#2\END{...}
为#2
空表示当前项目中没有连字符。但宏也会
\edef\AM@tempi{\AM@trim@space{#1}}
因此,在您的情况下,\AM@tempi
包含1-
;但是,预期值是一个整数,但事实1-
并非如此。错误。
您可以添加到您的文档中
\makeatletter
\define@key{pdfpages}{pages}{\AM@CheckValue{pages}{#1}%
\edef\AM@pagestemp{#1}}
\makeatother
但如果出了问题,不要怪我。