以类似字典的格式存储变量

以类似字典的格式存储变量

我正在准备一份文档,其中会包含不同版本,每个版本之间略有不同。我希望以这样的方式创建文档,即使用字典将不同版本映射到文档中不同变量的相应值。

我正在尝试做的虚拟代码:

\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\evaluationdata.csv

究竟发生了什么pdflatex -shell-escape main.tex

  1. data.csv\csvreader由输入csvsimple包裹。
  2. \csvreader然后将逐行循环遍历 csv 文件。每次使用循环体之前都会定义四个命令,由第二个参数\csvreader---设置id=\id, name=\name, age=\age, evaluation=\evaluation(格式为<column name>=<latex command>)。
  3. 循环体将执行pdflatex -jobname='<pdf name>' '<code>\input template.tex'

第三步是核心。-jobname设置输出pdf的名称,并<code>传递日期。\id.tex每次创建一个包含所需数据的文件也是可行的。

csvLaTeX输入文件,csvsimple并不是唯一的选择。而且,前两个步骤可以很容易地用其他编程语言重写。

相关内容