邮件合并并创建多个 PDF

邮件合并并创建多个 PDF

我有一个.csv名为的文件,sbriefdata其中包含一些数据,例如

A;B;10
C;D;20
E;F;30
G;H;40

并且我希望文件.pdf中的每一行都有一个单独的文件.csv。我知道如何通过读取数据进行邮件合并,也知道如何.pdf这个问题(我使用了 Ulrike Fischer 提供的解决方案)。但是,我无法将这两个功能结合起来得到我想要的。我试过了

\documentclass{article}

\newif\ifmore \moretrue
\def\chopline#1;#2;#3\\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}

\begin{document}

\newread\data
\openin\data=sbriefdata.csv
\loop
\read\data to \line
\ifeof\data
\global\morefalse
\else
\expandafter\chopline\line\\

\ifx\conditionmacro\undefined
\immediate\write18{%
pdflatex --jobname="\jobname-\name"
"\gdef\string\conditionmacro{\name}\string\input\space\jobname"
}%
\expandafter\stop
\fi

\vorname \name \punkte \newline

\fi
\ifmore\repeat
\closein\data

\end{document}

但这只会生成一个名为 jobname-A 的 PDF,其中包含所有数据,而不是四个不同的 PDF。我似乎不完全理解构建多个 PDF 的命令(我认为因为它处于循环中,所以它应该生成多个 PDF)。所以我想知道

1)如何更改代码以获取多个 PDF 和/或

\ifx2)和之间的命令具体起什么作用\fi?例如,为什么这一行\ifx\conditionmacro\undefined很重要,以及起什么"\gdef\string\conditionmacro{\name}\string\input\space\jobname"作用?

答案1

第一次调用后,\stop被调用并停止执行。因此不会生成任何附加文档。但我们如何修复代码呢?

我们仍然需要文档类和一种将行拆分成其字段的方法:

\documentclass{article}

\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}

现在有两种情况:要么我们直接被用户调用。然后我们从未定义过\conditionmacro,我们想为每一行调用一个新的 LaTeX 实例。否则我们以这种方式调用,并且\conditionmacro已经设置为 samoe 行。为了区分这些情况,我们测试是否\conditionmacro未定义:

\ifx\conditionmacro\undefined

在第一种情况下,我们现在读取文件:首先打开它,然后循环读取每一行,直到到达文件末尾:

  \newread\data
  \openin\data=sbriefdata.csv
  \loop
    \read\data to \line
  \unless\ifeof\data

现在我们进入循环体,必须处理一行。首先找出文件名的名称:

    \expandafter\chopline\line\\

我们想将这一行传递给一个新pdflatex实例,因此,例如,如果我们读取A;B;10 宏,\conditionmacro则应将其定义为A;B;10内部文件。这可以通过\gef\conditionmacro{A;B;10}在常规文件内容前面添加来实现。所以:

    \immediate\write18{%
    pdflatex --jobname="\jobname-\name"
    "\gdef\string\conditionmacro{\line}\string\input{\jobname}"
    }%

整个“ \gdef\string\conditionmacro{\line}\string\input{\jobname}”将在外部 TeX 实例中展开,\gdef\conditionmacro{A;B;10}\input{sbrief}如果我们的原始文件名为 ,则会导致出现这种情况sbrief.tex。这里\string只是使用 来停止展开。这正是我们想要的:定义 然后读取原始文件内容\conditionmacro\input\conditionmacro

现在我们的循环已经完成,我们可以关闭文件并结束外部 TeX 运行。

  \repeat
  \closein\data
  \expandafter\stop
\fi

在我们的第一种情况下,我们停在上面\stop,所以如果我们到达这一点,我们就处于第二种情况:\conditionmacro设置完毕,我们必须创建实际文档之一。首先将\conditionmacro其分成几个部分:

\expandafter\chopline\conditionmacro\\

然后“只需”创建文档:

\begin{document}
Hallo \vorname\space\name,

Sie haben \punkte\space Punkte erzielt.
\end{document}

完整代码:

\documentclass{article}

\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}

\ifx\conditionmacro\undefined
  \newread\data
  \openin\data=sbriefdata.csv
  \loop
    \read\data to \line
  \unless\ifeof\data
    \expandafter\chopline\line\\
    \immediate\write18{%
    pdflatex --jobname="\jobname-\name"
    "\gdef\string\conditionmacro{\line}\string\input{\jobname}"
    }%
  \repeat
  \closein\data
  \expandafter\stop
\fi

\expandafter\chopline\conditionmacro\\

\begin{document}

Hallo \vorname\space\name,

Sie haben \punkte\space Punkte erzielt.

\end{document}

如果您还想收集收集的 PDF 中的所有子文档,您可以将 PDF 文件编译后包含到外部文档中:

\documentclass{article}

\def\chopline#1;#2;#3 \\{
\def\name{#1}
\def\vorname{#2}
\def\punkte{#3}
}

\ifx\conditionmacro\undefined
  \usepackage{pdfpages}
  \begin{document}
  \newread\data
  \openin\data=sbriefdata.csv
  \loop
    \read\data to \line
  \unless\ifeof\data
    \expandafter\chopline\line\\
    \immediate\write18{%
    pdflatex --jobname="\jobname-\name"
    "\gdef\string\conditionmacro{\line}\string\input{\jobname}"
    }%
    \includepdf[pages=-]{\jobname-\name.pdf}
  \repeat
  \closein\data
  \csname fi\endcsname
  \end{document}
\fi

\expandafter\chopline\conditionmacro\\

\begin{document}

Hallo \vorname\space\name,

du hast \punkte\space Punkte erzielt.

\end{document}

相关内容