假设您想要在一个中心位置维护一组对象,并在 LaTeX 文档的各个位置以不同的方式(“视图”)呈现它们,类似于词汇表,但更通用。
例如,假设您要建立一个小型“数据库”,其中包含员工的名字、姓氏、身份标识、出生日期等。然后,您要在文档的简介部分创建一个员工列表,其中只打印名字,以逗号分隔。然而,在附录中,您要打印一个显示所有属性(作为列)和所有员工(作为行)的表格。
此外,您希望能够从该数据库中以不同的格式“挑选”单个条目,类似于 \Glspl{employee1}、\gls{employee1}、...
当然,一种方法可以是使用脚本和 sqlite 的组合来生成 latex 代码作为预处理步骤。
但是,最直接的 LaTeXish 方法是什么? 有什么软件包可以提供帮助吗?
答案1
正如评论中所说,为了处理大量数据,有更好的编程语言可以与 LaTeX 一起使用。其中一种替代方案是knitr
(R 包),它允许混合使用 R 和 LaTeX 代码。
要测试下面的示例,您应该将其保存为.Rnw
扩展名保存它,然后可以使用 Rstudio 进行编译,或者查看如何从命令行构建 Knitr 文档。如果您的计算机上没有 R,您也可以在 Overleaf 中测试此文件,但使用扩展名.Rtex
。
妇女权利委员会:
\documentclass{article}
% preample only to beautify the result, nothing is essential
\usepackage{parskip}
\usepackage{booktabs}
\usepackage[colorlinks]{hyperref}
\renewcommand\belowcaptionskip{1ex}
\begin{document}
\section*{The raw data for this example}
<<employees,echo=FALSE>>=
# construct a data frame (you can also import it csv, excel, csv, ...)
df <- data.frame(
Name = c("Bob", "Sam", "Jim"),
Surname = c("Wood","Smith","Carter"),
Rate = c(94, 4, 3), # Field experience (%)
date = as.Date(c('1990-10-02','1981-3-24','1987-6-14')),
Position= c("director","subdirector","secretary"))
# Nicknames as ID
rownames(df) <- c("nba", "spy", "tv")
today <- as.Date(Sys.Date())
# Show raw data
df
@
\section*{About our fake employees}
The team will be our employees
\Sexpr{combine_words(paste(df$Name,df$Surname))}.
Although the mean rate experience of the team is only
\Sexpr{round(mean(df$Rate),1)}\;\%, but the \Sexpr{df[1,5]} of the project will be \Sexpr{df[1,1]}. Mr. \Sexpr{df["nba",2]}
is highly cualified for this specific work
(\Sexpr{df["nba","Rate"]}\;\%).
He was born in
\Sexpr{format(df["nba","date"], format = "%Y")},
so roughly he has now
\Sexpr{format(difftime(today, df["nba","date"],
unit="days"), big.mark = '\\\\;')}
days of living experience.
\section*{Full team data (to show)}
See in table \ref{Team}:
<<team table,echo=F, results="asis">>=
library(xtable)
df$date <- as.character(df$date)
print(xtable(df[,c(1,2,5,4,3)],
caption="Full team",
label="Team",
align="llllcr",
digits=0),
booktabs=T,
include.rownames=F,
caption.placement="top"
)
@
\end{document}