来自数据库的邮件合并文档

来自数据库的邮件合并文档

我在这里宽泛地使用术语“数据库”——它可以是实际的数据库,也可以是电子表格(任何格式,包括 CSV),也可以是依赖于包的。

有没有办法创建类似于文字处理软件中可以做的邮件合并文档?我发现mailmerge包裹这是一种可行的方法,但它会将所有邮件合并的数据放入一个文档中。

是否有一个包或方法可以为数据库的每个部分生成新的单独文档?换句话说,如果我firstName在任何存储系统中都有一个值,我可以让 LaTeX 为数据库中的每个名称生成一个文件吗<firstName>.dvi?还是我需要求助于脚本语言驱动程序来实现这一点?

编辑

因此,为了进一步解释我想做的事情(现在将根据以下问题的答案进行设置更改每页的文档类别):

我正在尝试创建一份“欢迎来到公司”类型的文档,其中包含封面、目录、欢迎信以及各个信息部分。除了文字处理器之外,我从未尝试过此操作,因为文字处理器可以轻松为文档中的单个页面设置“母版页”或“模板页”。因此,我可以使用信头模板页作为欢迎信部分,使用标准文章类型模板作为其余部分,并且仍然在目录中对信件进行编号/引用。

如果我使用那里答案中的方法,如何知道\pdfpages要包含哪个页面?最终,我希望拥有许多文件,例如、Bob.pdf等,其中每个文件都是相同的文档,但其中嵌入了自定义字母。Sue.pdfJohn.pdf

答案1

您可以根据需要构建 TeX 数据库,只需创建一个列表来保存您发送邮件的人员列表即可。我们将创建一个包含下表所示字段的列表,并对其进行排序,以简化操作。

在此处输入图片描述

这是通过首先创建一个空列表来完成的\let\alist\@empty

输入文件的格式最好是 TeX 格式,这样编程起来更容易,而且可以在地址中使用逗号。我使用以下格式来捕获字段,但请随意使用您自己的格式:

\RB Nisbet|John|Mr.| 235, Highlands, Scotland | United Kingdom;
\RB Guevara|Che|Dr.| 527 Main Street, Havana | Cuba;
\RB Zapata|Emiliano|Mr.| 5237, Mexico City | Mexico;
\RB von Kleist-Schmenzin|Herr| Ewald| Greens, Dubberow| Germany;

名称由“|”和结尾分号分隔。信件的标准部分位于名为的单独文件中stdletter.dat。我使用该包即时生成了它filecontents。MWE 示例如下所示。

\documentclass{article}
\usepackage{lstdoc,booktabs,filecontents}
\begin{filecontents}{stdletter.dat}
We are happy to enclose our new catalogue.
\vspace{20pt}

Regards,
\vspace{20pt}

Some CEO
\end{filecontents}
\begin{document}
\pagestyle{plain}
\makeatletter
\let\alist\@empty
\let\blist\@empty

\def\addtolist#1#2{%
  \lst@lAddTo#1{#2}
}

\def\addtolist#1#2{%
  \lst@lAddTo#1{#2}
}


\def\RB#1|#2|#3|#4|#5;{%
   \addtolist{\alist}{#1#2,}% 
   % macro for table
   \expandafter\gdef\csname#1#2@table\endcsname{\textit{#1}&#2&#3&#4\cr\relax}
   % macro for salutation
   \expandafter\gdef\csname#1#2@salut\endcsname{Dear #3 #2\relax}
   \lst@BubbleSort{\alist}
}

%% adding the data now
\RB Nisbet|John|Mr.| 235, Highlands, Scotland | United Kingdom;
\RB Guevara|Che|Dr.| 527 Main Street, Havana | Cuba;
\RB Zapata|Emiliano|Mr.| 5237, Mexico City | Mexico;
\RB von Kleist-Schmenzin|Herr| Ewald| Greens, Dubberow| Germany;

%% typesetting the table
\def\addresslist{%
\newsavebox{\tempbox}
\savebox{\tempbox}{
\centering
\begin{tabular}{llll}
  \toprule[1pt]
  First Name & Second Name & Salutation & Address\\
  \midrule
  \@for\i:=\alist \do{\csname\i @table\endcsname}
  \vspace{-14pt}\\\bottomrule
\end{tabular}}

\begin{table}
\usebox{\tempbox}
\caption{Client List}
\end{table}
}


\addresslist

\mbox{}\newpage

\@for\i:=\alist \do{\csname\i\endcsname
\csname\i \endcsname
\expandafter\csname \i @salut\endcsname
\par\medskip
\input{stdletter.dat}

\pagebreak
}

\makeatletter

\end{document}

“文章”部分可以用相同的方式创建,或者最好单独打印并重置页码(更容易)。

答案2

一个简单的解决方案是textmerg打包获取单个 pdf,但你可以用一些外部工具来拆分它,如pdfsampdftk。MWE:

\documentclass{article}
\usepackage[utf8]{inputenc} 
\usepackage{eurosym}
\usepackage{textmerg} 
\begin{document}

\Fields{\Mr\Name\SurName\Address\Donation} 


\Merge{data.dat}{
\hspace{.25\textwidth}
\begin{tabular}{rl}
Address & {\bf \Mr\ \Name\  \SurName }\\
        & {\bf \Address }\\
        & \\
Subject & \Donation{} donation \\
\end{tabular}
\vspace{2 cm} 
Dear \Mr \Name,  bla bla bla .... 

\newpage    
}
\end{document}

合并的文件 data.dat是纯文本,其中字段分隔符是回车符,如下例所示:

Mr.
Peter
Smith
Newtown Road, Los Angeles, USA
209 \$


Ms. 
Maria 
Rossi
Regina Elena, 113, Milano, Italy
145 \euro

相关内容