在我试图澄清一些尚无定论的话题和“有人成功了吗”系列的一部分时(例如有人在 Linux 中成功播放 Acrobat 中嵌入的电影吗?),下面是一个新问题:
是否有人在任何系统(例如 GNU/Linux)中使用 PDF 查看器和编辑器的特定组合,成功创建并打开 PDF 中的链接,从而打开文本文件在某一行?
您使用了哪些编辑器(例如 gedit、emacs、vim)和查看器(例如 evince、acrobat)以及设置(例如 acrobat 中的安全设置)的具体组合?
我当前的策略是使用命令
\href{run:textfile.txt}{Link to text file (line 20)}
当然,这不会将光标带到正确的行,我必须手动搜索该行。(确认后,它在 Evince 和 Acrobat 中都会执行此操作)。
问题是,如何做同样的事情,但打开文本中的某一行。我失败的尝试是
\href{run:/usr/bin/gedit +20 textfile.txt}{Link to text file (line 20)}
尝试利用允许在某一行打开文件的命令行选项。事实上,这根本行不通,因为它不被识别为命令行(在 evince 中,"Error when getting information for file '/usr/bin/gedit +20 textfile.txt': No such file or directory."
在 acrobat 中:"Could not open the file '/usr/bin/gedit +20 textfile.txt'"
我甚至想过劫持某些查看器/编辑器的“反向搜索”功能,使其从 PDF 中的某个位置链接回任意行或文件),但我不知道从哪里开始(现在,我不关心解决方案的代码有多复杂,只要它能与现有的查看器和编辑器一起使用就行)
(为了说明,我在 GNU/Linux 中使用 Acrobat 9.4.1、Evince 3.8.3 和 gedit 3.8.3)
(之前的一些不确定的答案:https://tex.stackexchange.com/a/2982/1871和https://tex.stackexchange.com/a/123982/1871)
编辑:澄清:我不想链接到 TeX 源,而是想链接到任意文本文件。
编辑2:经过一番研究,我发现,原则上,Javascript 可以执行外部程序(可能在禁用某些安全墙之后),并且 Javascript 可以嵌入到 PDF 中。这可能是答案吗?(至少对于 Acrobat Viewer 来说)
答案1
要从 PDF 编辑器启动具有特定选项的不相关文本文件,可能需要间接地执行此操作。
- 创建一个脚本来启动您想要的所有内容(例如包含
gedit +42 file.txt
)。根据查看器,file.txt
可能需要绝对路径。 - 从 TeX 链接到该脚本(例如使用
href
) - 脚本扩展名(例如
.sh
或.mygedit
,rungeditfromline42.sh
或rungeditfromline42.mygedit
)必须属于可执行 MIME 类型。
根据查看器,需要设置以下一项(或两项):
- (
Evince, Acroread
) 扩展必须与某种类型的脚本执行相关联。我找到的一种方法如下(用 Bash 替换 Java):https://ask.fedoraproject.org/en/question/9735/how-do-i-launch-jar-files-using-nautilus/?answer=15275#post-id-15275(我不知道有没有自动的方法可以做到这一点)。 - (
xpdf
)使脚本可执行chmod +x rungeditfromline42.sh
。 - (尚无解决方案
Okular
)
所有这些都acroread
知道如何处理(在其他情况下,将被视为任何普通文本)。我还注意到,出于某种原因,evince
需要完整路径(在脚本内)。
我在 Fedora 20 中测试了这个问题。http://latex-beamer-class.10966.n7.nabble.com/run-a-shell-script-from-a-beamer-generated-pdf-td2049.html。但我认为这些说明并不完整。
编辑2015:如何使脚本扩展与某种类型的脚本执行相关联?(上述第 4 点)
(如果不采取此步骤,Acrobat 或 Evince 可能会打开脚本文件但不执行该脚本)
创建~/.local/share/applications/
一个名为run-gedit.desktop
:
[Desktop Entry]
Encoding=UTF-8
Type=Application
Exec=bash %f
Icon=icon
Name=run-gedit
Comment=Run the gedit file
右键nautilus
单击rungeditfromline42.mygedit
文件(参见上文)并单击“打开方式”选项卡,向下滚动直到找到“run-gedit”,然后单击它并“设置为默认值”。转到 Evince,单击链接以测试脚本是否运行。
关于SyncTeX
自 2008 年起,可以使用SyncTeX
它来实现源文件和 PDF 文件之间的同步。
为了实现同步,SyncTeX 创建了一个格式的辅助文件filename.synctex.gz
。
一些 LaTeX 编辑器默认使用 SyncTeX。您根本不需要更改源.tex
文件。例如,TeXWorks
您只需要在 PDF 查看器中单击鼠标右键即可打开菜单,然后选择转到源代码(转到与 PDF 查看器中实际单击的行相对应的行),然后在文本编辑器中执行相同的过程,您就可以返回 PDF 查看器(显示您实际正在编辑的页面)。
答案2
这不是答案,而是我进行的一些研究的结果。我分享这些结果,希望有人参与其中hyperref
并/或pdflatex
可以利用它们做点什么。
简单文件的结果
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\begin{document}
\href{run:file.txt}{test}
\end{document}
可以使用qpdf --qpdf in.pdf out.pdf
任何文本编辑器进行检查。代表链接的注释如下:
/A <<
/F (file.txt)
/S /Launch
>>
现在,/F
仅指定文件,因此除了Fran 的方法。这与我收到的错误消息一致:查看器尝试打开具有给定名称的文件,包括参数等。我猜查看器可以尝试将传递的文件名解释为 shell 命令,但是很好。
然而,调查PDF 规范发射行动(第 659 页)揭示:
可选的 Win、Mac 和 Unix 条目允许操作字典包含用于启动指定应用程序的平台特定参数。如果给定平台没有此类条目,则使用 F 条目。表 8.54 显示了 Windows 平台的特定平台启动参数。在发布时,Mac OS 和 UNIX 平台的参数尚未定义。
因此,据我了解,
/A <<
/Win <<
/F (editor)
/P (+20 file.txt)
>>
/S /Launch
>>
应该现在可以在 Windows 下工作,还有类似的东西可能有一天能在其他操作系统下工作。