![自动处理 TeX / LaTeX 数据](https://linux22.com/image/314122/%E8%87%AA%E5%8A%A8%E5%A4%84%E7%90%86%20TeX%20%2F%20LaTeX%20%E6%95%B0%E6%8D%AE.png)
我有一个相当复杂的 C 程序,它能够将原始文本输出到文本文件,然后将其打印在点阵打印机上。这些列表现在需要进行排版更新,最终以 PDF 格式存在,可以在普通激光打印机上打印。为此,我打算使用 LaTeX。我无法更换 C 程序,只能修改“打印/文本输出”功能。
要生成的文档的总体布局是明确定义的,但数据行数却没有定义。
因此,第一步我编写了一个 LaTeX“模板”文件,如下所示:
\documentclass{article}
\begin{document}
Dear --MRMRS-- --NAME--, we hope ...
sed 's/KEYWORD/programoutput/'
然后让我的程序用它以原始形式生成的数据替换关键字(最后用命令替换)。到目前为止,这种方法效果很好。如前所述,生成的文件某些部分--MRMRS--
的--NAME--
长度事先并不清楚。例如,文档后面会有具有明确定义的结构的表格,但这些表格每次的长度可能都不同,因此我不能简单地预先定义给定的数量--ROWxCOLy--
:
\begin{tabular}{cccc}
Col1 & Col2 & Col3 & Col4 \\
\hrule
% now how to fill the content sequentially without knowing the size beforehand?
\end{tabular}
Thank your, we hope to hear from you on --DATE-- ...
\end{document}
目前得到的数据如下
Col1 Col2 Col3 Col4
Col1 Col2 Col3 Col4
Col1 Col2 Col3 Col4
COLSPANNED LINE
Col1 Col2 Col3 Col4
Col1 Col2 Col3 Col4
... variable amount of lines
There can be special lines that need a full column span (span whole width)
but they come in well-defined order
我想到的第一个解决方案是直接在数据生成程序中硬编码 LateX 代码,为整个表格设置一个关键字,然后在程序中使用硬编码的 LaTeX 代码生成该关键字。但出于明显的维护原因,我想尽可能避免这种情况(尽可能将布局和逻辑分开)。
还有哪些其他可能的解决方案可以向 LaTeX 文档提供定义明确但长度未知的数据?
答案1
自动处理 TeX / LaTeX 数据
您的问题中的问题是“顺序”一词。不可能连续生成一个 TeX/LaTeX 文档。产生有效输出的 TeX/LaTeX 文档有一个开始,更重要的是,有一个结束。当文档完成且无错误时,输出完成,TeX/LaTeX 工作完成。一旦完成,您就无法将数据“输入”到该文档中。
您可以做的是构建一个 LaTeX 框架文档,\input some_external_data
并在每次外部数据发生变化时重新生成输出。
主题是:在运行 LaTeX 作业时,您必须定义要生成的数据的内容和长度,因为输出文档不会在数据发生变化时自动更新,除非再次运行 LaTeX 作业。至少,除非使用相当复杂、定制的方法,这在很大程度上取决于您使用的查看器或输出介质。
改进原来的方法
改变处理数据的方式可能会有所帮助
Dear --MRMRS-- --NAME--, we hope ...
这里你使用自定义模板语言来生成 TeX 文件。我想这就是你所说的“硬编码”。
将输出形式(布局)和逻辑分开是一种很好的做法,同样,尽可能将生成的数据与模板分开,并且以下一个处理器可以理解的方式翻译信息集(输入或数据)(在我们的例子中,下一个处理器是 LaTeX)也是一种很好的做法。
我说明了我的意思:LaTeX 不知道如何处理 --MRMRS-- 和此类构造,尽管 TeX 机器通常能够设置这样的解析器。但这会使事情变得非常复杂,难以控制和调试。因此,当您定义模板时,请保持在语言 LaTeX 语言域中:
Dear \MRMRS{} \NAME{}, we hope ...
让我们简单一点,假设这就是我们的整个模式,那么文本形式的数据集可能是
Mrs
Moneypenny
C 程序可能会将这些输入数据转换为 C 语言已知的形式:
struct greeting {
char* mrmrs;
char* name;
};
现在 C 程序(或其他程序)的目的是将其翻译成 LaTeX 语言
\def\MRMRS{Mr}
\def\NAME{Moneypenny}
您现在可以将处理后的数据读入 LaTeX 程序,这是一个真正的 LaTeX 程序,而不是要由任何人处理的模板,并且从原始数据到输出文档的每个步骤都可以与其他过程分开调试。
答案2
为了“尽可能地将布局和逻辑分开”,更简洁的方法是让您的程序编写 XML 而不是原始文本。
然后可以将其转换(可能使用 XSL)为 LaTeX 或任何其他您喜欢的输出格式,包括原始文本。
当然,这需要额外的时间。
一个快速而粗略的解决方案:如果列文本是固定宽度的,您可以考虑使用tabbing
而不是tabular
。这样,您只需定义最大列数,但只使用您需要的列数。因此无需计算列数。
一个高级示例:通过声明而不是示例来设置标签