创建多个输出文件,其内容取决于变量

创建多个输出文件,其内容取决于变量

我想写一个信件模板,这封信是要发送给很多人的。因此,内容应该根据收件人的不同而略有不同。例如,我设想模板可以是以下形式:

\begin{letter}

if the addressee is A:
  \opening{Dear A,}
if the addressee is B:
  \opening{My dear B,}

...

if the addressee is B:
  By the way, I really miss you, B!

...

\end{letter}

然后,我想创建一个或多个带有信件的 pdf 文件,以某种方式指定收件人列表(如果您可以解释如何将收件人的姓名传递给 pdflatex,那么 Makefile 或其他内容也可以用于渲染)。

答案1

我有类似的需求,以下是我解决这个问题的想法。

解决方案 Makefile -> Latex

如果您希望 Makefile 告诉 Latex 使用哪个“地址”,您可以使用“--jobname”标志pdflatex告诉 Latex 正在编译哪个作业,并根据\jobname变量在 Latex 中使用 if 语句。您的 Makefile 将有一个规则列表(每个作业名一个规则)。
以下是示例:

# Assuming the main tex file is called `Main.tex`
MAIN=Main
# pdflatex flags
PDFLATEX_FLAGS= -synctex=1 --file-line-error-style --shell-escape --interaction=nonstopmode 
# Platform specific
PDFLATEX=pdflatex
CP=cp
RM=rm
# Define list of jobs and makefile rules
JOBNAMES:= Job1 Job2 Job3
PDFRULES:= $(foreach job, $(JOBNAMES), $(job)_pdf)

# Rule to create a pdf file
%_pdf: 
    $(PDFLATEX) $(PDFLATEX_FLAGS) --jobname $* $(MAIN) || echo "Failed"

all: $(PDFRULES)

解决方案 Latex -> Makefile

(这正是我需要的)。我的解决方案是让 latex 为文件写入后缀,然后让 makefile 拾取这个后缀(使用shellcat)并根据这个后缀将输出 pdf 复制到新的 pdf 文件名中。我的工作流程从 latex 到 makefile。

在 latex 中,你可以按如下方式写入文件:

\newwrite\myoutput
\immediate\openout\myoutput=\jobname.suffix
\write\myoutput{myAddressSuffix}

其中“myAddressSuffix”是您想要用于输出 pdf 文件的内容。在此示例中,\jobname.suffix创建了文件。您可以根据您的 latex 变量指定不同的名称。

在 Makefile 方面,您可以做类似的事情:

SUFFIXFILE:=$(MAIN).suffix

# Rule to create the .suffix
$(SUFFIXFILE):
    $(PDFLATEX) $(PDFLATEX_FLAGS) $(MAIN) || echo "Failed"

# Rule to create a pdf file with a different filename based on what latex wrote in the suffix file
all: $(SUFFIXFILE)
    $(CP) $(MAIN).pdf Extract-$(shell cat $(SUFFIXFILE)).pdf
    $(RM) $(SUFFIXFILE)

请注意,在与创建后缀文件的规则不同的规则中拥有$(shell cat $(SUFFIXFILE))单独的规则非常重要,并且如果您想触发新的编译,删除后缀文件也很重要。

答案2

这样会将所有信件生成一个 PDF。然后,我要么打印 PDF,要么使用外部工具将其拆分(pdftk但还有其他选项)。

您准备两个文件:一个数据文件和一个模板。textmerg用于将数据合并到模板中。我已经为信件做了一段时间,但我经常使用它来制作学生反馈和评估文件。

下面的示例演示了如何更改收件人的姓名和地址,但您可以根据需要在模板中定义任意数量的数据字段,以添加任意数量的点。例如,这可用于将分数和评论归入学生类别,或自定义句子(如Please find enclosed \enclosures.信件中的句子)。数据文件中的行可以在适用的情况下留空,也可以(有时很方便)从其他数据源(例如 csv 文件或电子表格)生成数据文件。

\begin{filecontents}[overwrite,noheader]{\jobname.dat}
Sandy Manner
32 Dither Close
Fowllands
Megalopolis
Archaemeleon
XR76 2BW
Alex the Great
768 Lessened Street
End of the Line
Catacombatron
Badlands
BL43 2EL
\end{filecontents}

\documentclass{letter}
\usepackage{textmerg}
\begin{document}
\Fields{\addressee\street\district\city\county\postcode}
\name{Your Name}
\address{53 Your Street\\Your Area\\Your Town\\Your County\\YR12 3PC}
\Merge{\jobname.dat}{%
  \begin{letter}{\addressee\\\street\\\district\\\city\\\county\\\postcode}
    \opening{Dear \addressee,}
    This is to inform you that I am sending you this letter.
    \closing{Yours fatalistically,}
  \end{letter}%
}
\end{document}

合并两个字母的数据的结果

相关内容