我希望在我的 PDF 中有一个通过pdflatex
执行 shell 脚本生成的链接,这部分效果很好。
我遇到的问题是我需要 PDF 中的链接才能将参数传递给 shell 脚本。我认为这与转义字符有关,但我不知道如何解决它。
警告
- 如果你是不是如果您完全熟悉使用该
Terminal
应用程序的 Unix shell 脚本,您可能不想运行此程序。我并不知道按原样运行此程序会有什么危险,但我不想在应用Termimal
程序启动时惊动任何人。 - 根据您的
Preferences
情况,Terminal
您可能需要关闭Terminal
启动的窗口。 ~/TempFile.txt
即使我已指定,执行脚本(通过单击输出 PDF 中的链接)也会覆盖/tmp/TempFile.txt
。不确定为什么会这样。- 该
MyScript.command
文件将在您运行的目录中创建pdflatex
,因此您可能需要在完成此测试用例后手动删除它。
要运行 MWE:
为了能够在 Mac OS 上使用此 MWE(无法评论其他平台):
pdflatex
数学家- 在 Finder 中找到文件
MyScript.command
,选择File/Get Info
并确保将其设置为使用 打开Terminal.app
。当我将文件扩展名从 更改为 时.sh
,这对我来说似乎没有必要.command
,但我在这里记录下来,以防其他人有不同的设置或想要使用不同的文件扩展名。 - 然后返回 MWE 生成的 PDF 并尝试单击链接。
生成的 PDF 如下所示:
单击第一个链接将打开TempFile.txt
包含以下内容的文件:
Start of additional parameters
End of additional parameters
单击第二个链接应该会产生(一旦它起作用):
Start of additional parameters
xyz
abc
End of additional parameters
笔记:
- 此刻,我仅有的对 MacOS 感兴趣,但欢迎非 Mac 解决方案,以防其他人想要做类似的事情,或者我需要在其他时间在 Windows 上运行它。
参考:
平均能量损失
\documentclass{article}
\usepackage[colorlinks=true]{hyperref}
%\usepackage{filecontents}% Commented to prevent overwriting files
\newcommand*{\TempFile}{/tmp/TempFile.txt}%
\newcommand*{\MyExecutableScript}{MyScript.command}%
\newcommand*{\MyExecutableScriptRunTimeParameters}{abc xyz}%
\begin{filecontents*}{\MyExecutableScript}
#!/bin/bash
echo "Start of additional parameters" > \TempFile
echo $2 >> \TempFile
echo $1 >> \TempFile
echo "End of additional parameters" >> \TempFile
open \TempFile
exit 0
\end{filecontents*}
\begin{document}
\immediate\write18{chmod +x \MyExecutableScript}% make file executable
\href{run:\MyExecutableScript}{Click to execute \MyExecutableScript}% <-- This works
\href{run:\MyExecutableScript\space \MyExecutableScriptRunTimeParameters}%
{Click to execute \MyExecutableScript\space with parameters}% <-- This not so much :-(
\end{document}
答案1
根据PDF 规范对于 PDF 1.7 (ISO 32000-1:2008),您就没那么幸运了。Launch
动作的动作字典为选项定义了以下键:
Win
字典 (可选)包含 Windows 特定启动参数的字典(参见表 204)。
Mac
(未定义)(可选)Mac OS 特定的启动参数;尚未定义。
Unix
(未定义)(可选)UNIX 特定的启动参数;尚未定义。
#
对于 Windows,可以在启动规范之后指定参数\href
:
\href{run:\MyExecutableScript#\MyExecutableScriptRunTimeParameters}{...}
对于其他操作系统,一种笨拙的解决方法是将参数编码到脚本名称中,然后脚本查找其名称并解码参数。我已实现此方法的一个示例可在项目中看到vpe
。