这是我一直在编写的宏的稍微简化的版本(使用pgfkeys
和pdfpages
)以包含 PDF 文件。
这似乎有效。
我遇到了一个问题。includepdf
当我尝试将宏作为参数传递给参数时,我不喜欢它pages
。我实现了我在沃纳对“如何扩展关键参数”这个问题的回答,这与同一个问题有关。我省略了 Werner 对组的使用,我认为这是不必要的,并使事情变得更加复杂。我最初以为我可以使用处理程序pgfkeys
.expand once
来解决这个问题,但这似乎在 PGF/TikZ 之外是不可能的。出于某种神奇的原因,这似乎在 PGF/TikZ 内部是可能的,我不知道为什么。
pgfkeys
事实上,我对 TeX 键值包 并不十分熟悉。因此,如果能就我的pgfkeys
使用提出改进建议,我将不胜感激。如果没有实施解决方法(即将宏直接传递给参数
pages
)includepdf
,我会得到相同的错误 维托米尔·科瓦诺维奇 在这个问题中,即:ERROR: Missing = inserted for \ifnum.
但这仅当
-
或,
作为参数的一部分传递给时才会发生pages
,否则不会发生。我只是想知道为什么这个错误只发生在那种情况下。有什么简单的原因吗?- 另外,除了我使用的解决方法之外,还有其他更好的解决方法可以解决此扩展问题吗?特别是,是否
pgfkeys
提供了使用.expand once
处理程序或其他方法的解决方法? - 这个问题有点模糊,但是为什么
.expand once
处理程序在 PGF/TikZ 中可以工作?它在传递参数之前会以某种方式扩展参数,但是当常规 TeX 无法做到这一点时,它是如何做到这一点的?我非常不清楚发生了什么。
\documentclass[12pt]{scrartcl}
\usepackage{grffile}
\usepackage{pdfpages}
\usepackage{pgfkeys}
\usepackage{xparse}
\usepackage{tikz}
\pgfkeys
{
/pdffile/.is family, /pdffile,
% Calling the keys so that the macros are still defined if
% arguments are not passed.
default/.style =
{
captioning=false,
blankpage=false,
cappos,
cap,
pagenum
},
captioning/.is if=hascaptioning,
blankpage/.is if=hasblankpage,
cappos/.default = {(7,-4)},
pagenum/.default = {1-},
cappos/.estore in = \cappos,
cap/.estore in = \cap,
pagenum/.estore in = \pagenum,
}
% #1 optional argument, used to pass list of keys from pgfkeys
% #2 filename
\NewDocumentCommand{\pdffile}{o m}
{
\newif\ifhasgrid
\newif\ifhascaptioning
\newif\ifhasblankpage
\pgfkeys{/pdffile, cap/.default = #2}
\pgfkeys{/pdffile, default, #1}%
\edef\tempx{\noexpand\includepdf[pagecommand=
{
\unexpanded{\begin{tikzpicture}[remember picture, overlay]
% Add caption
\ifhascaptioning
\node [font=\bfseries, align=center] at \cappos{\cap};
\else\fi
\end{tikzpicture}}
}
,pages=\pagenum]{#2}}
\tempx
% Add blank page
\ifhasblankpage
\clearpage \phantom{} \clearpage
\else\fi
}
\begin{document}
\pdffile[captioning, cap=FOOBAR, cappos={(7,1)}, pagenum=2-3]{foo.pdf}
\end{document}
答案1
好吧,如果我没记错的话,核心问题是它\includepdf
不能pages=\mypages
很好地处理\mypages
范围。在我看来,这个问题的正确解决方案是写信给 pdfpages 的作者,并要求他添加必要的代码来扩展该值一次。例如,按照以下方式:
\documentclass[12pt]{scrartcl}
\usepackage{xparse}
\usepackage{pdfpages}
\makeatletter
\define@key{pdfpages}{pages}{%
\AM@CheckValue{pages}{#1}%
\expandafter\def\expandafter\AM@pagestemp\expandafter{#1}}%
\makeatother
\usepackage{tikz}
\begin{document}
\newcommand\mypages{1-4}
\includepdf[pages=\mypages]{example-image-a4-numbered.pdf}
\end{document}
或者,我会定义一个新的 pdfpages 键,例如,pageso
它可以进行此扩展。我不会在这里使用 \edef\next 方法,因为它看起来过于复杂。