我在这里宽泛地使用术语“数据库”——它可以是实际的数据库,也可以是电子表格(任何格式,包括 CSV),也可以是依赖于包的。
有没有办法创建类似于文字处理软件中可以做的邮件合并文档?我发现mailmerge
包裹这是一种可行的方法,但它会将所有邮件合并的数据放入一个文档中。
是否有一个包或方法可以为数据库的每个部分生成新的单独文档?换句话说,如果我firstName
在任何存储系统中都有一个值,我可以让 LaTeX 为数据库中的每个名称生成一个文件吗<firstName>.dvi
?还是我需要求助于脚本语言驱动程序来实现这一点?
编辑
因此,为了进一步解释我想做的事情(现在将根据以下问题的答案进行设置更改每页的文档类别):
我正在尝试创建一份“欢迎来到公司”类型的文档,其中包含封面、目录、欢迎信以及各个信息部分。除了文字处理器之外,我从未尝试过此操作,因为文字处理器可以轻松为文档中的单个页面设置“母版页”或“模板页”。因此,我可以使用信头模板页作为欢迎信部分,使用标准文章类型模板作为其余部分,并且仍然在目录中对信件进行编号/引用。
如果我使用那里答案中的方法,如何知道\pdfpages
要包含哪个页面?最终,我希望拥有许多文件,例如、Bob.pdf
等,其中每个文件都是相同的文档,但其中嵌入了自定义字母。Sue.pdf
John.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}\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,但你可以用一些外部工具来拆分它,如pdfsam
或pdftk
。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