将宏传递给“includepdf”的页面参数时出现异常

将宏传递给“includepdf”的页面参数时出现异常

考虑一下包\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

但如果出了问题,不要怪我。

相关内容