![从单独的文件中解析任意文本](https://linux22.com/image/255935/%E4%BB%8E%E5%8D%95%E7%8B%AC%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E8%A7%A3%E6%9E%90%E4%BB%BB%E6%84%8F%E6%96%87%E6%9C%AC.png)
我对 TeX 的世界还很陌生,所以如果这个问题不清楚或者之前有人问过,请多包涵。我开始摸索 TeX 和它的数百万个插件和扩展。
附注:如果我在攻读计算机科学学位时了解 TeX,那么写我的论文就会容易得多 - 比其他文档创建和文字处理软件包我更喜欢它。
我正在构建一个 TeX 文档,我希望将所有格式信息存储在主文档中,并将所有文本存储在单独的文件中,但我还希望在 TeX 找到给定的文本条目时执行一些任意解析。
例如,如果我正在使用这是一个例子(主要是因为它清晰的部分分离设计),TeX 是否能够从文件中提取每个部分的文本,对其进行解析以使其适合格式并仅显示 N 个数字条目?
在示例文件中,作者创建了一个名为 \EducationEntry 的命令,其代码如下:
\newcommand{\EducationEntry}[4]{
\noindent \textbf{#1} \hfill
\colorbox{Black}{%
\parbox{6em}{%
\hfill\color{White}#2}} \par
\noindent \textit{#3} \par
\noindent\hangindent=2em\hangafter=0 \small #4
\normalsize \par}
那么,是否有可能有一个文本文件,内容如下:
BA Some course or other | 2502-2504 | University of Mars | Details
MA More courses | 2504-2506 | University of The Moon | Details
这样 TeX 就可以读取每一行,按给定字符分隔(在本例中为 '|',但可以是任何字符),并为每一行创建一个 \EducationEntry?
我正在考虑为我正在编写的用户指南和一些翻译项目实现一个非常相似的结构。如果可以做到这一点,并且对于像我这样的新用户来说并不太复杂,那么它将使一致的格式变得容易得多。目前,我还处于文档整体外观的规划/设计阶段。但是,我已经准备好了所有文本。
如果有帮助的话,我在 MS Windows 和 Ubuntu 12.04 上都使用 TexMaker 3.5(但我怀疑这会产生很大的区别)并且我通过 PS 直接输出为 PDF。
答案1
我同意评论中说预处理数据文件更好的说法。但是,作为 expl3 编程的练习,这里有一种方法:
\begin{filecontents*}{\jobname.ls1}
BA Some course or other | 2502-2504 | University of Mars | Details
MA More courses | 2504-2506 | University of The Moon | Details
\end{filecontents*}
\begin{filecontents*}{\jobname.ls2}
BA Some course or other + 2502-2504 + University of Mars + Details
MA More courses + 2504-2506 + University of The Moon + Details
\end{filecontents*}
\documentclass{article}
\usepackage{xparse,xcolor}
\ExplSyntaxOn
\NewDocumentCommand{\readdata}{O{|} m}
{
\taylor_readdata:nn { #1 } { #2 }
}
\seq_new:N \l__taylor_line_seq
\ior_new:N \g__taylor_read_ior
\cs_new_protected:Npn \taylor_readdata:nn #1 #2
{
\ior_open:Nn \g__taylor_read_ior { #2 }
\ior_map_inline:Nn \g__taylor_read_ior
{ \__taylor_doline:nn { #1 } { ##1 } }
\ior_close:N \g__taylor_read_ior
}
\cs_new_protected:Npn \__taylor_doline:nn #1 #2
{
\seq_set_split:Nnn \l__taylor_line_seq { #1 } { #2 }
\use:x
{
\exp_not:N \EducationEntry
\seq_map_function:NN \l__taylor_line_seq \__taylor_brace:n
}
}
\cs_new:Npn \__taylor_brace:n #1 { { #1 } }
\ExplSyntaxOff
\newcommand{\EducationEntry}[4]{
\noindent \textbf{#1} \hfill
\colorbox{black}{%
\parbox{6em}{%
\hfill\color{white}#2}} \par
\noindent \textit{#3} \par
\noindent\hangindent=2em\hangafter=0 \small #4
\normalsize \par}
\begin{document}
\readdata{\jobname.ls1}
\bigskip
\readdata[+]{\jobname.ls2}
\end{document}
可以将列分隔符指定为的可选参数\readdata
。