我正在准备一份文档,其中会包含不同版本,每个版本之间略有不同。我希望以这样的方式创建文档,即使用字典将不同版本映射到文档中不同变量的相应值。
我正在尝试做的虚拟代码:
\documentclass[12 pt]{article}
\usepackage{subfiles}
\newcommand{\username}{bob} %% I only want to change this line to create a different version
\begin{document}
ABC
Name: <dict[\username][name]>
Age: <dict[\username][age]>
\subfile{user-info/\username}
\subfile{evaluation/<dict[\username][evaluation]>}
XYZ
\end{document}
字典中应该包含如下信息:
{
"bob" : {
"name" : "Bob the Builder",
"age" : 30,
"evaluation" : "good"
},
"alice" : {
"name" : "Alice from Wonderland",
"age" : 20,
"evaluation" : "good"
}
}
目录结构如下:
root/
├── main.tex
├── user-info/
│ ├── bob.tex
│ └── alice.tex
└── evaulation/
├── good.tex
└── bad.tex
这样,在写完所有信息后,我应该能够通过更改主文档第 4 行中的一个单词来为 Alice 创建版本,如果我后来改变主意并想给 Alice 一个不好的评价,我只需要更改字典中的一个值。所以我的问题是如何在 latex 中创建这样的字典?
我对 Latex 还很陌生,并且使用 Overleaf 来创建文档。
答案1
这里有一组文件可以帮助您自动为每个用户名生成一个 pdf。
首先,data.csv
id,name,age,evaluation
alice,Alice from Wonderland,20,good
bob,Bob the Builder,30,goodname
然后,template.tex
喜欢您提供的内容。
% this is `templatex.tex`
\documentclass[12pt]{article}
\begin{document}
% code making use of four predefined commands
ID: \id \\
Name: \name \\
Age: \age \\
Evaluation: \evaluation
\end{document}
最后,main.tex
\documentclass{article}
\usepackage{csvsimple}
\usepackage{shellesc}
\begin{document}
\csvreader
{data.csv}
{id=\id, name=\name, age=\age, evaluation=\evaluation}
{%
Processing \texttt{id=\id} \ldots{} done.\par
\ShellEscape{%
pdflatex -jobname='\id'
'\def\noexpand\id{\id}%
\def\noexpand\name{\name}%
\def\noexpand\age{\age}%
\def\noexpand\evaluation{\evaluation}%
\noexpand\input template.tex'%
}
}
\end{document}
执行pdflatex -shell-escape main.tex
后会得到alice.pdf
和,它们是根据 中的对应行预先定义的、、和进行bob.pdf
编译的结果。template.tex
\id
\name
\age
\evaluation
data.csv
究竟发生了什么pdflatex -shell-escape main.tex
:
data.csv
\csvreader
由输入csvsimple
包裹。\csvreader
然后将逐行循环遍历 csv 文件。每次使用循环体之前都会定义四个命令,由第二个参数\csvreader
---设置id=\id, name=\name, age=\age, evaluation=\evaluation
(格式为<column name>=<latex command>
)。- 循环体将执行
pdflatex -jobname='<pdf name>' '<code>\input template.tex'
。
第三步是核心。-jobname
设置输出pdf的名称,并<code>
传递日期。\id.tex
每次创建一个包含所需数据的文件也是可行的。
用csv
LaTeX输入文件,csvsimple
并不是唯一的选择。而且,前两个步骤可以很容易地用其他编程语言重写。