使用 pgfkeys 将参数传递给宏以包含 PDF 文件,使用 pdfpages

使用 pgfkeys 将参数传递给宏以包含 PDF 文件,使用 pdfpages

这是我一直在编写的宏的稍微简化的版本(使用pgfkeyspdfpages)以包含 PDF 文件。

这似乎有效。

我遇到了一个问题。includepdf当我尝试将宏作为参数传递给参数时,我不喜欢它pages。我实现了我在沃纳对“如何扩展关键参数”这个问题的回答,这与同一个问题有关。我省略了 Werner 对组的使用,我认为这是不必要的,并使事情变得更加复杂。我最初以为我可以使用处理程序pgfkeys .expand once来解决这个问题,但这似乎在 PGF/TikZ 之外是不可能的。出于某种神奇的原因,这似乎在 PGF/TikZ 内部是可能的,我不知道为什么。

  1. pgfkeys事实上,我对 TeX 键值包 并不十分熟悉。因此,如果能就我的pgfkeys使用提出改进建议,我将不胜感激。
  2. 如果没有实施解决方法(即将宏直接传递给参数pagesincludepdf,我会得到相同的错误 维托米尔·科瓦诺维奇 在这个问题中,即:

    ERROR: Missing = inserted for \ifnum.
    

    但这仅当-,作为参数的一部分传递给时才会发生pages,否则不会发生。我只是想知道为什么这个错误只发生在那种情况下。有什么简单的原因吗?

  3. 另外,除了我使用的解决方法之外,还有其他更好的解决方法可以解决此扩展问题吗?特别是,是否pgfkeys提供了使用.expand once处理程序或其他方法的解决方法?
  4. 这个问题有点模糊,但是为什么.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 方法,因为它看起来过于复杂。

相关内容