我有一份类似的文件:
\documentclass{article}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\end{itemize}
\end{document}
我想用不同的值填充它\item
。也就是说,生成不同的文档,具有相同的布局,但不同的项目。
这些项目可以从文本文件中加载,文本文件可以采用任何易于阅读的形式,例如:
#1#First item
#2#Second item
或者其他一些简单的标记。如何在 Latex 文档中设置某种变量,以便从其他文件导入项目?
答案1
问题对于要加载的内容有点模糊。
我假设了一个文件名foocontent.txt
和一个.tex
名为的文件foo.tex
,编译是这样完成的
pdflatex "\def\filetoload{foocontent.txt}\input{foo}"
在命令行上(或在这些编辑器的命令行框中)
代码将加载文件并使用功能逐行读取其内容expl3
并将其存储到稍后在内部\seq
显示的变量中。\displayfilecontent
\begin{itemize}...\end{itemize}
按照“定义”,每个条目\item
必须出现在单独的行上,并且可以是“任何” LaTeX 内容。
这是我为许多学生等生成列表的“快速”方法。
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\ExplSyntaxOn
\ior_new:N \l_local_file_handle
\seq_new:N \g_local_content_seq
\cs_new:Nn \store_content_to_seq:n {%
\seq_gput_right:Nn \g_local_content_seq {#1}
}
\NewDocumentCommand{\readfromfile}{m}{
\ior_open:Nn \l_local_file_handle {#1}
\ior_map_inline:Nn \l_local_file_handle {\store_content_to_seq:n{##1} }
\ior_close:N \l_local_file_handle
}
\NewDocumentCommand{\displayfilecontent}{}{%
\seq_map_inline:Nn \g_local_content_seq { \item ##1 }
}
\ExplSyntaxOff
\begin{document}
\readfromfile{\filetoload}
\begin{itemize}
\displayfilecontent
\end{itemize}
\end{document}
这是foocontent.txt
And
Now
For
Something
Completely
Different
And
Totally
\textcolor{blue}{Strange}
Things
答案2
以下示例使用datatool
读入包含两列(无标题)的 CSV 文件,格式如下:
1,First item
2,Second item
3,Third item
使用默认环境\item
或使用第一列条目(\fixedenumerate
)来设置项目:
\documentclass{article}
\usepackage{filecontents,datatool}
\begin{filecontents*}{mylist.csv}
1,First item
2,Second item
3,Third item
\end{filecontents*}
\newif\ifdefaultenumerate
\newcommand{\defaultenumerate}{\defaultenumeratetrue}
\newcommand{\fixedenumerate}{\defaultenumeratefalse}
\newcommand{\processCSV}[1]{%
\DTLifdbexists{CSVinput}{\DTLgdeletedb{CSVinput}}{}%
\DTLloaddb[noheader,keys={Number,Text}]{CSVinput}{#1}%
\DTLforeach{CSVinput}{\Number=Number,\Text=Text}{%
\ifdefaultenumerate
\item
\else
\item[\Number]
\fi
\Text
}
}
\begin{document}
\begin{itemize}
\item First
\item Second
\item Third
\end{itemize}
\begin{itemize}
\processCSV{mylist.csv}
\end{itemize}
\begin{enumerate}
\processCSV{mylist.csv}
\end{enumerate}
\defaultenumerate
\begin{enumerate}
\processCSV{mylist.csv}
\end{enumerate}
\end{document}