我想为 100 人中的一组创建 100 封邀请函,我的 excel 表中有他们的姓名和电话号码。我写了一封通用信件,想从 excel 表中的列表中输入姓名和电话号码,并将 100 个 pdf 文件保存在一个文件夹中。请问使用 latex/knitr/markdown 执行此操作的最佳方法是什么?信件示例如下所示。
你好,XXXX,
请于 7 月 4 日星期一到我这里来,
最好的,汤姆
XXXX = 应从外部 Excel 列表中调用的名称
答案1
假设在名为的文件中拥有以下数据nameslist.csv
:
NAME
Adolfo
Akilah
Amie
Andree
Angel
Angelika
Annabell
Aracely
Bailey
Bambi
Bridgett
Cameron
Candra
Carole
Carson
Cassi
Cecila
Cecilia
Ceola
Chau
Cherlyn
Clorinda
Cristal
Danuta
Darin
Darnell
Debra
Denice
Denise
Denver
Diedra
Donovan
Dorothea
Edgar
Eliza
Elliott
Elvira
Emely
Emerald
Ethelyn
Florance
Franklyn
Gertha
Gisele
Gladis
Guillermina
Hanh
Harvey
Herta
Hye
Jamie
Jarod
Joellen
Julianna
Julie
Kai
Karena
Kay
Kenya
Kimbery
Kyung
Lessie
Loree
Lucina
Ma
Macy
Magaret
Marcelina
Maricruz
Marisol
Marivel
Marquerite
Matilda
Mika
Natalie
Neoma
Olen
Oscar
Pei
Pok
Raven
Raymon
Sarah
Serina
Shanda
Shani
Shanon
Shante
Shirly
Susy
Tashina
Teodora
Tommy
Tracy
Valeria
Verna
Vernia
Vinnie
Violeta
Zachariah
其中包括 100随机名称。另外,您有以下 LaTeX 模板,letter_input.tex
用于编写一封要发送给上述每个人的信件:
\documentclass{article}
\pagestyle{empty} % Remove page header/footer
\setlength{\parindent}{0pt} % Remove paragraph indent
\begin{document}
Hello \firstname,
\medskip
Please show up at my place on Monday, July 4th.
\medskip
Best, Tom.
\end{document}
请注意我们如何将收件人的姓名编码为\inputname
。
您无法将它们作为单个文件处理并在 LaTeX 下获得多个输出。默认是一对一。Markdown 或 Knitr 也是如此。但是,您可以多次处理文件并使用 R 脚本重命名输出,如下所示:
library(tidyverse)
namelist <- read_csv(
file = 'nameslist.csv'
)
for (curname in namelist$NAME) {
system(
paste0(
'pdflatex \\def\\firstname{',
curname,
'} \\input{letter_input}'
),
show.output.on.console = FALSE
)
curname <- file.rename(
from = 'input_letter.pdf',
to = paste0(
'letter_to_',
curname,
'.pdf'
)
)
}
上述代码读取nameslist.csv
所有名称,得到一个数据框(tibble)。然后,它循环遍历每个名<name>
称,
使用 进行编译
pdflatex \def\inputname{<name>} \input{letter_input}
。这将使用 将 设置
\inputname
为名称列表中的适当名称\def
,然后\input
使用letter_input.tex
。将输出 PDF 重命名(移动)
letter_input.pdf
为名为 的新名称letter_to_<name>.pdf
。
以下是输出的示例letter_to_Tracy.pdf
:
如果要在信件中插入更多内容,添加更多列,定义一个新变量并将其添加到\def
之前的s列表中\input
。