我想知道 SyncTeX 是否支持以单个单词的精度进行正向搜索和反向搜索。TeXLive 和 MikTeX 中的“默认”实现似乎只能以行的精度进行同步。
就像使用 SyncTEX 进行直接和反向同步其中,Jérôme Laurens 提到:
借助 iTEXMac2 中实现的附加技术,我们甚至可以通过单词进行同步(见图 1),本质上总能在输入和输出之间找到精确的单词对应关系。
有没有方法可以用 MikTeX 或 TeXLive 做同样的事情?事实上,我希望的是反向搜索,而不是正向搜索。但当然,如果两者都能做到,那就完美了。
如果还没有方法,有人研究过这个吗?
编辑: 看Synctex 和环境这是“逐字” SyncTeX 的可能副作用(或要求?)。
答案1
关于更好的 SyncTeX'ing......
TeX 中的向后搜索本质上是一个糟糕的问题。例如,如果您按住 Ctrl 键并单击 latex 文档输出标题中的单词,您应该向后返回到包含 \maketitle 命令(创建标题的命令)的行,还是包含 \title 命令(定义标题的命令)的行。两种解决方案都可以接受,没有一种比另一种更好。话虽如此,我们必须接受,只要 tex 宏没有被深入使用,向后同步才会令人满意。在这种情况下,可以这样做
- 就像 TeXShop 一样:当用户按住 Ctrl 键并单击输出中的某个位置时,向左取 10 个字符,向右取 10 个字符,然后尝试匹配源中的这 21 个字符序列。与 SyncTeX 结合将解决歧义问题
- 就像 iTeXMac2 一样:当用户按住 ctrl 并单击输出中的某个位置时,取出单击位置的单词,取出其前两个单词和其后两个单词。然后按顺序在源文件中查找这 5 个单词。当然,通常会出现很多次这种情况,您只需说明,当在源文件中找到的单词跨越最短间隔时,就会找到更好的单词。与 SyncTeX 结合也可以解决歧义问题。
事实上,我只使用了 3 个以上字母的单词,以便有意义并避免较短单词的高频率。有时我们找不到全部 5 个单词,而只找到 4 个或 3 个。重要的是歧义很少见。理论上,我们可以显示在向后搜索中找到的所有出现情况,但在实践中,这有时难以理解,并且是一种糟糕的 UI 设计。
尽管 iTeXMac2 的效果远优于 TeXShop,但该技术由于带有重音字母而不适用于外语,除非使用 utf8 编码和正确的字体。不过,您可以使用 Levenshtein 距离或一些弱变体来规避此限制,但计算成本可能会很高。
无论如何,所有这些都假设输出在某种程度上是可读的,这意味着输出查看器必须足够聪明。OS X 上的 pdf 阅读器长期以来一直非常酷,其他操作系统上的阅读器也开始逐渐实现更高级的东西。
另一种完全不同的方法是,如果不仅记录行号,还记录列号,那么 SyncTeX 的效果会更好。不幸的是,TeX 引擎只使用行号。我不知道在 TeX 中实现列号需要多少工作量,但我的感觉是这超出了我的能力范围(至少在时间上……)。但 SyncTeX 已经支持列号,这是第一步。
答案2
请原谅我的无知——实际上,Jérôme 的上述论文包含了很多答案。总结如下:
SyncTeX 深深嵌入到 TeX 中
TeX 不记录输入文件的列信息
因此,我们能得到的最好的结果是行精度加上通过文本分析增加的精度
感谢这个想法,那么下面的方法怎么样?TeX 文档经过预处理,以便将每个空格转换为换行符,并准确引用输入文件中的位置。文件i.tex
\begin{document}
Lorem ipsum
\end{document}
变成
\begin{document}%i.tex:1:1
Lorem %i.tex:2:5
ipsum%i.tex:2:10
\end{document}%i.tex:3:1
并且,如果空格的 catcode 不变,LaTeX 可以等效地解析它。(这并不完全正确,见下文。)当前 SyncTeX 将准确匹配预处理文件中的行,剩下要做的就是解析预处理文件中的注释。
整个预处理和映射工作可以通过一个小的包装器来完成pdflatex
。Martin filehook
Scharrer 的包将帮助“动态”触发引用文件的预处理,无论是通过 TeX 代码(使用 catchfile 包逐个字符地预处理输入文件?)或使用--shell-escape
。
正如 egreg 提到的,依赖于空格和换行符区别的宏和环境:
verbatim
和lstlisting
环境、\verb
宏\index
……这些必须保持不变,否则。目前,我还没有找到一种简单的方法来处理包装器中“专业知识”的缺失。
这只是一个粗略的想法,还有一些设计问题需要解决。欢迎提出意见。
这终极问题这里是:什么是更简单的——给 TeX 一个列计数器,或者尝试生成一个每行一个单词(一个字符?)的等效文档。
答案3
首先我想确认我是否正确理解了您的问题。您是否有兴趣使用 MikTeX 的直接和反向搜索来查找 Windows 操作系统上常用的 TeX 发行版和相关软件?
如果您要解决的问题已经解决,那么它已经解决了。我不是 Windows 用户,但我知道至少有两种方法可以进行反向和直接搜索。
我最喜欢的是安装 TeXWorks IDE(由编辑器和 PDF 查看器组成),它本质上类似于 MAC 版 TeXShop。您不需要做任何特别的事情就可以进行反向搜索。单击 PDF 查看器中您正在处理的单词,您将被带到源代码。直接搜索的工作原理类似,但您必须在单击时按住一个键(我忘了是哪一个)。
Windows 版 WinEdt (TeX IDE) 自 99 年以来只能进行直接和反向搜索。不幸的是,WinEdt 的每个版本都变得越来越臃肿,这似乎是现代软件工程的当前趋势。好消息是我没有运行 Windows,所以我甚至没有理论上的机会使用 WinEdt。
TeXWorks 有两个严重的缺点(至少对我来说)。
a. 第一个问题是 TeXWoks 默认使用 pdflatex,而我经常使用 pstricks,因此我需要 dvi->ps->pdf。这个问题可以“轻松”解决。
b. 更重要的一个问题实际上阻止我在 OpenBSD 机器上使用 TeXWorks,那就是我还没有找到在 TeXWorks 编辑器中使用 vi(这里是 nvi 用户)键绑定的方法(我期待大家的评论,告诉我我错了)。这是一个更严重的问题,因为需要(除非)已经有人将绑定硬编码到 TeXWorks 中。
我其实还有一个问题想问那些可能试图回答你问题的人。我个人不使用直接搜索和反向搜索有两个原因。
i. srctex 本来应该进行同步,但对于分散在多个文件中并使用 \input 命令调用的大型文档,它不能很好地工作。pdfsync 是否能更好地工作?
ii. 对于 nvi,反向搜索很棘手,因为每次单击 Xdvi 中的工作时,文档都会在新的 nvi 实例中打开。直接搜索甚至不起作用。这不是可以轻松解决的问题。我更希望 TeXWorks 能够完成 vi 模拟而不仅仅是键绑定。我的意思是使用正则表达式、shell 转义命令和 sed、awk 脚本(我不使用 Perl)、exrc 配置的执行进行搜索。对于编辑器来说,这要求太高了。额外的好处是 nvi 不支持语法突出显示和可靠的无限撤消,而 TeXWorks 编辑器支持这些功能。
答案4
从AucTeX 更新日志v. 11.89:
现在,您还可以使用 PDF Tools(Emacs 的文档查看器)来打开 PDF 输出文件。有了它,向前和向后搜索可以精确到单词级别。
不管怎样,我只能在反向同步时实现字级精度。在正向同步时,PDF 视图缓冲区左侧边缘显示的箭头可能会偏离多达六行。
Emacs 28.2 (MSYS2) 带有最新的 pdf 工具。
当然,YMMV。
问题: 是否有人尝试过将 synctex 与 EAF PDF 查看器结合使用并获得更好的准确性?