答案1
我建议使用csvsimple
包裹。
\documentclass{article}
\usepackage{csvsimple}
\begin{filecontents}{list.csv}
religion
religious
rely
remain
\end{filecontents}
\begin{document}
\csvloop{
file = {list.csv},
no head,
before reading = {\begin{enumerate}},
after reading = {\end{enumerate}},
before line = \item
}
\end{document}
编辑
为了在元素后画一条线,使用\rule
:
\documentclass{article}
\usepackage{csvsimple}
\begin{filecontents}{list.csv}
religion
religious
rely
remain
\end{filecontents}
\begin{document}
\csvloop{
file = {list.csv},
no head,
before reading = {\begin{enumerate}},
after reading = {\end{enumerate}},
before line = \item,
after line = \rule{1cm}{.4pt}
}
\end{document}
由于 LaTeX 不存储枚举的单个项,因此很难对项进行打乱。一些沉重的解决方案解决这个问题,但在处理大型数据集(“可能有数千行”)时,我不推荐使用任何一种方法。只需快速设置一个 Python 脚本,在编译文档之前重新排列列表即可。
import random
with open('data.csv', 'r') as input_file:
data = input_file.readlines()
random.shuffle(data)
with open('output_file.csv', 'w') as output_file:
for item in data:
output_file.writelines(item)
你甚至可以看看pythontex
包,它使您可以将可执行 Python 代码添加到 LaTeX 文件中。生成文档后,将执行代码并将结果添加到 LaTeX 文件中。我可以想象,这将允许您实现对文档生成的改组。
答案2
您可以逐行\read
读取文本文件
单词表.txt
red
orange
yellow
green
blue
indigo
violet
文件.tex
\documentclass{article}
\newread\wordlist
\openin\wordlist=wordlist.txt
\begin{document}
\def\blankline{\par}
\begin{enumerate}
\loop\ifeof\wordlist
\else
\read\wordlist to \thisword
\ifx\thisword\blankline
\else
\item \thisword
\fi
\repeat
\end{enumerate}
\end{document}
答案3
因为我想学习这个已经有一段时间了,所以这里有一个使用 LuaLaTeX 的 Sam 答案版本。我喜欢它的原因是它完全嵌入在 LaTeX 中,只需一次编译即可lualatex
\documentclass{article}
\usepackage{luacode}
\begin{filecontents*}{list.csv}
religion
religious
rely
remain
\end{filecontents*}
\begin{document}
\begin{itemize}
\begin{luacode}
io.input("list.csv")
-- use a table to store the lines of the file
local lines = {}
-- read the lines in table 'lines'
for line in io.lines() do
table.insert(lines, line)
end
-- use another table to store a shuffled version of lines
shuffled = {}
-- for each line, pickup a position in the shuffled table
-- and insert the line there
for i, line in ipairs(lines) do
local pos = math.random(1, #shuffled+1)
table.insert(shuffled, pos, line)
end
-- write all the lines, after an item and with a rule after it
for i, line in ipairs(shuffled) do
tex.sprint("\\item ", line, " \\rule{1cm}{.4pt}") end
\end{luacode}
\end{itemize}
\end{document}
答案4
Sam 让我调查一下pythontex
,结果如下:一个将 Python 代码嵌入 LaTeX 文件的解决方案。我认为,对于将 LaTeX 与脚本/编程接口的问题有不同的解决方案是一件好事,这样人们就可以选择自己喜欢的那个。
编译分 3 步:
*LaTeX myfile
pythontex myfile
*LaTeX myfile
myfile.tex:
\documentclass{article}
\usepackage{pythontex}
\begin{filecontents*}{list.csv}
religion
religious
rely
remain
\end{filecontents*}
\begin{document}
\begin{pycode}
import random
with open('list.csv', 'r') as input_file:
data = input_file.readlines()
random.shuffle(data)
print(r'\begin{enumerate}')
for item in data:
print(r'\item ', item, r'\rule{1cm}{.4pt}')
print(r'\end{enumerate}')
\end{pycode}
\end{document}