使用 catchfile 包逐个字符地预处理输入文件?

使用 catchfile 包逐个字符地预处理输入文件?

\CatchFileDef是否可以使用包中的或\CatchFileEdef命令读取文件catchfile,然后将其精确副本输出到另一个文件?输入和输出编码怎么样?彼此配合良好catchfile吗?filehook

如果是的:这样做的目的是将空格转换为换行符并添加辅助信息(朝着 使用 SyncTeX 进行正向-反向搜索,精度达到单个单词)。这种逐字符分析的 (La)TeX 实现是什么样的,它能否很好地扩展到大文件?

我正在寻找一种可以与当前版本一起使用的解决方案pdflatex,也许--shell-escape使用小型 Perl 脚本也能达到同样的效果?我愿意听取建议。

答案1

\CatchFileDef是否可以使用包中的或\CatchFileEdef命令读取文件catchfile,然后将其精确副本输出到另一个文件?

否。软件包catchfile使用 TeX\input逐行读取文件:

  • 行尾标记已被删除。
  • 行尾的空格字符将被删除(无论 catcode 如何)。
  • 如果\endlinechar包含有效字符代码,则该字符将添加为结束行标记。在 TeX 或 pdfTeX 中,有效范围是 0 到 255。在 XeTeX 或 LuaTeX 中,范围更大。

由于生产线末端的变化,通常无法进行精确的复制。

书写也存在问题。添加行尾标记。根据 TeX 编译器及其设置,某些字符可能以小写十六进制数字的\write形式写成 -notation ^^xxxx

如果使用 pdfTeX,至少可以读取和分析二进制文件。可扩展原语\pdffiledump以指定的偏移量和长度读取一些字节并扩展为十六进制转储。

输入和输出编码怎么样?

该软件包stringenc提供从一种编码到另一种编码的转换。例如,您可以读取 latin-1 格式的文件,然后将其写入 UTF-8 格式。

相处catchfile和玩得好吗?filehook

它们没有共同的游乐场。包需要并使用在 LaTeX 中保存为的catchfile可扩展原语。包不会重新定义。这在没有任何限制的 TeX 中是不可能的。文件名可以由空格标记或非字符的不可扩展标记终止。文件名不能通过分隔参数读取,因为不知道文件名是如何终止的。无限制参数无法捕获空格标记,因为 TeX 在查找参数的过程中会忽略它们。剩余的前瞻功能破坏了可扩展性。因此包挂钩到 LaTeX 的许多更高级别的输入宏。\input\@@inputfilehook\@@input\futureletfilehook

包裹彼此catchfile之间filehook互不打扰、互不认识。

其背后的意图是将空格转换为换行符并添加辅助信息(转向使用 SyncTeX 进行正向-反向搜索,精度达到单个单词)。 (La)TeX 实现的这种逐字符分析会是什么样子,它是否适用于大文件?

如果你只是转换文本文件,那么我认为你不需要精确的副本。那么 TeX 在读取一行时所做的更改可能是可以接受的。包的另一种方法是使用和catchfile逐行读取。在前一种情况下,整个文件被读入内存,后一种情况是逐行读取文件,并且对于较大的文件来说,其扩展性更好。\openin\read

相关内容