我要将同一封信寄往多个地址。这些地址存储在一个 csv 文档中。到目前为止,我已经创建了一个循环来创建多封信,但我还没有找到一种从 csv 中提取地址的格式。
这是 csv 格式
Name Address City, State Zip
Company 1 5555 N 5th St Townsville, CA 55555
Company 2 5556 N 5th St Townsville, CA 55556
Company 3 5557 N 5th St Townsville, CA 55557
这是想法,但我不知道如何调用 csv 中的特定元素
\documentclass[11pt]{letter}
\usepackage{csvsimple}
\usepackage{multido}
\newcommand{\forLoop}[4][1]{\multido{\i=#2+#1}{#3}{#4}}
\begin{document}
\csvreader[head to column names]{sample.csv}{} %
\forLoop[1]{2}{4}
{
\begin{letter}{csv[\i\,1]\\csv[\i\,2]\\csv[\i\,3]}
\begin{letter}
\opening{Dear ConAgra Food Supplier:}
\closing{Best Regards,\\[2ex]%
{
\LARGE\calligra Jane Doe}\\[2ex]%
Jane Doe\\Title\\Company\\Phone #
}
\end{letter}
}
\end{document}
答案1
我建议使用datatool
包裹(点击图片放大):
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{sample.csv}
Name, Address, City, State, Zip
Company 1, 5555 N 5th St, Townsville, CA, 55555
Company 2, 5556 N 5th St, Townsville, CA, 55556
Company 3, 5557 N 5th St, Townsville, CA, 55557
\end{filecontents*}
\usepackage{datatool,lipsum}
\pagestyle{empty}
\setlength{\parindent}{0pt}
\begin{document}
\DTLloaddb{sample}{sample.csv}
\DTLforeach{sample}{%
\Name=Name,\Address=Address,\City=City,\State=State,\Zip=Zip}{%
\clearpage
\hfill
\begin{tabular}{l@{}}
\today\\[10pt]
Who from \\
Street \\
City, State \\
Phone: (123) 456-7890 \\
Email: [email protected]
\end{tabular}
\bigskip
\begin{tabular}{@{}l}
\Name \\
\Address \\
\City \\
\State~\Zip
\end{tabular}
\bigskip
To whom it may concern,
\bigskip
\lipsum[1]
\bigskip
Sincerely,
\bigskip\bigskip\bigskip
First~Last
}
\end{document}
我会放弃letter
文档类,而选择更简单或更直接的类,例如article
类。布局易于操作,并且可以轻松使用 循环生成邮件合并样式的多封信件,发送至不同的地址\DTLforeach
。
答案2
我认为@Werner 使用 给出了一个很好的答案datatool
。由于 OP 使用了csvsimple
,因此这里将其改编为 ,输出csvsimple
相同。只有很少的语法变化。对于此应用程序,datatool
和csvsimple
可以相互交换。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{sample.csv}
Name, Address, City, State, Zip
Company 1, 5555 N 5th St, Townsville, CA, 55555
Company 2, 5556 N 5th St, Townsville, CA, 55556
Company 3, 5557 N 5th St, Townsville, CA, 55557
\end{filecontents*}
\usepackage{csvsimple,lipsum}
\pagestyle{empty}
\setlength{\parindent}{0pt}
\begin{document}
\csvreader[head to column names]{sample.csv}{}{%
\clearpage
\hfill
\begin{tabular}{l@{}}
\today\\[10pt]
Who from \\
Street \\
City, State \\
Phone: (123) 456-7890 \\
Email: [email protected]
\end{tabular}
\bigskip
\begin{tabular}{@{}l}
\Name \\
\Address \\
\City \\
\State~\Zip
\end{tabular}
\bigskip
To whom it may concern,
\bigskip
\lipsum[1]
\bigskip
Sincerely,
\bigskip\bigskip\bigskip
First~Last
}
\end{document}
答案3
我想建议一种略有不同的方法。下面您可以\mailto
在文档的序言中找到一个定义为宏的字母,该字母在文档正文中为每个收件人调用。因此,我不会从 CSV 文件中读取地址,而是将其放入主文档中。您仍然可以从宏调用中了解每封信件是如何生成的。
您可以使用更多宏参数轻松自定义它,以便向信件模板传递更多信息。我正在使用该类,dinbrief
但它也适用于任何其他信件类。
\documentclass[11pt]{dinbrief}
\signature{Dr. Christian Lindig}
\place{Boston}
\nowindowrules
\long\def\mailto#1#2{\begin{letter}{#2}
\subject{Samples for Pop-Fizz}
\opening{#1,}
please find enlclosed the samples that you requested.
\closing{With kind regards}
\end{letter}}
\begin{document}
\mailto{Dear Dr. Drofnuts}{Dr. Drofnuts\\Computer Science Dept\\St. Anford, CA\\USA}
\mailto{Dear Gregor Samsa}{Gregor Samsa\\Ul. Radnice 5\\Prague\\Czech Republic}
\end{document}
答案4
我建议在外部处理 CSV 文件并将其直接放入信件中,如下所示:
\documentclass[11pt]{letter}
\address{Jane Doe\\Title\\Company\\Phone \#}
\signature{Jane Doe}
\begin{document}
\newcommand\writeletter[4]{
\begin{letter}{#1 #2\\#3\\#4}
\opening{Dear #1!}
Here's a very long text to #1 at #2 in #3.
\closing{With best regards to #3}
\end{letter}
}
\writeletter{Company 1}{5555 N 5th St}{Townsville, CA}{55555}
\writeletter{Company 2}{5556 N 5th St}{Townsville, CA}{55556}
\writeletter{Company 3}{5557 N 5th St}{Townsville, CA}{55557}
\end{document}
该示例完全基于德语 Wikibooks 页面中的 \LaTeX 连续字母。