\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 ^^xx
。xx
如果使用 pdfTeX,至少可以读取和分析二进制文件。可扩展原语\pdffiledump
以指定的偏移量和长度读取一些字节并扩展为十六进制转储。
输入和输出编码怎么样?
该软件包stringenc
提供从一种编码到另一种编码的转换。例如,您可以读取 latin-1 格式的文件,然后将其写入 UTF-8 格式。
相处
catchfile
和玩得好吗?filehook
它们没有共同的游乐场。包需要并使用在 LaTeX 中保存为的catchfile
可扩展原语。包不会重新定义。这在没有任何限制的 TeX 中是不可能的。文件名可以由空格标记或非字符的不可扩展标记终止。文件名不能通过分隔参数读取,因为不知道文件名是如何终止的。无限制参数无法捕获空格标记,因为 TeX 在查找参数的过程中会忽略它们。剩余的前瞻功能破坏了可扩展性。因此包挂钩到 LaTeX 的许多更高级别的输入宏。\input
\@@input
filehook
\@@input
\futurelet
filehook
包裹彼此catchfile
之间filehook
互不打扰、互不认识。
其背后的意图是将空格转换为换行符并添加辅助信息(转向使用 SyncTeX 进行正向-反向搜索,精度达到单个单词)。 (La)TeX 实现的这种逐字符分析会是什么样子,它是否适用于大文件?
如果你只是转换文本文件,那么我认为你不需要精确的副本。那么 TeX 在读取一行时所做的更改可能是可以接受的。包的另一种方法是使用和catchfile
逐行读取。在前一种情况下,整个文件被读入内存,后一种情况是逐行读取文件,并且对于较大的文件来说,其扩展性更好。\openin
\read