如何使用数组中的文件名来 \includepdf?

如何使用数组中的文件名来 \includepdf?

我目前正在编写一个应用程序模板。对于附录,我需要能够包含一些 pdf 文档。这些文档的名称存储在一个数组中。所以我需要能够 includepdf,其中文件名来自该数组。但我无法让它工作。这是我的 mwe(实际上我的模板要复杂得多,并且有一个 cls 文件,但我认为这不会导致问题):

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{pdfpages}
\usepackage{arrayjob}
\usepackage{forloop}
\newarray\pdfdocs
\pdfdocs(1)={test1}
\pdfdocs(2)={test2}
\newcounter{numofpdfdocs}
\setcounter{numofpdfdocs}{2}
\newcounter{pdfdocsindex}
\begin{document}
    \forloop{pdfdocsindex}{1}{\not{\value{pdfdocsindex} > \value{numofpdfdocs}}}{%
        \includepdf[pages=-]{\pdfdocs(\value{pdfdocsindex})}%
    }%
\end{document}

怎么了?我的日志文件中显示:

! Incomplete iffalse; all text was ignored after line 17.
<inserted text> 
                fi 
<*> main.tex
                                       
! Emergency stop.
<*> main.tex
                                       
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on main.log.

答案1

我不知道出了什么问题(并且目前也没有时间去调查),但是如何使用它来expl3完成这项工作?

以下定义了\placedocsfromlist循环遍历逗号分隔的文件名列表并包含这些文件名的宏。如果您使用\placedocsfromlist*参数的第一个标记,则将被扩展(因此您可以使用存储在宏内的列表):

\documentclass[]{article}

\usepackage{pdfpages}

\ExplSyntaxOn
\NewDocumentCommand \placedocsfromlist { s m }
  {
    \IfBooleanT {#1} { \exp_args:No }
    \copper_place_list:n {#2}
  }
\cs_new_protected:Npn \copper_place_list:n #1
  { \clist_map_inline:nn {#1} { \includepdf [pages=-] {##1} } }
\ExplSyntaxOff

\newcommand*\docslist{docA, docB, docC}

\begin{document}
\placedocsfromlist*\docslist

\placedocsfromlist{docA, docB, docC}
\end{document}

答案2

expl3可以轻松地对 中的每个项目应用函数clist

\documentclass{scrartcl}
\usepackage{pdfpages}
\usepackage{expl3}

\ExplSyntaxOn

\clist_new:N\pdfdocs
\let\myset\clist_set:Nn

\newcommand\myincludepdf[2][]{%
  \clist_map_inline:Nn\pdfdocs{\includepdf[#1]{##1}}}

\ExplSyntaxOff

\begin{document}

\myset\pdfdocs{test-1, test-2}
\myincludepdf[pages=1-3, scale=.5]{\pdfdocs}

\end{document}

相关内容