LaTeX 可以自动列出列表吗?

LaTeX 可以自动列出列表吗?

所以我有一个格式的单词列表文件.txt

在此处输入图片描述

我想编辑它并枚举它们。但由于文件可能多达数千行,因此手动执行将是一项艰巨的任务。我想知道是否可以自动枚举所有单词(并对每个单词进行其他小的重复更改),甚至更好的是,将它们随机化。

注意:我不确定这项任务是否可以或应该用 LaTeX 完成,如果不行,我也欢迎提出其他建议。提前致谢。

编辑:当我指的是小的重复变化时,我想到的是在每个单词后画一个 ____。

因此本质上我需要 LaTex 做三件事:

  1. 阅读文件并逐项列出
  2. 每个单词后画一条线
  3. 将整个列表随机化。

抱歉,我应该以更好的格式来回答我的问题。

答案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 步:

  1. *LaTeX myfile
  2. pythontex myfile
  3. *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}

相关内容