从 LaTeX 生成的 PDF 运行 shell 脚本(带参数)

从 LaTeX 生成的 PDF 运行 shell 脚本(带参数)

我希望在我的 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(无法评论其他平台):

  1. pdflatex数学家
  2. 在 Finder 中找到文件MyScript.command,选择File/Get Info并确保将其设置为使用 打开Terminal.app。当我将文件扩展名从 更改为 时.sh,这对我来说似乎没有必要.command,但我在这里记录下来,以防其他人有不同的设置或想要使用不同的文件扩展名。
  3. 然后返回 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

相关内容