编译 Latex 文件的脚本

编译 Latex 文件的脚本

我用来编译 Latex 终端的命令是:

$latex <file>.tex
$dvips -Go -ta4 -Ppdf <file>.div
$ps2pdf <file>.ps

我想做的是制作一个我将运行的脚本$./ltx <file>.tex,它将执行上面列出的所有命令,并在必要时 将.tex扩展名更改为.div和。.ps

我该如何做以及我必须学习什么才能知道将来如何做这种事情?

答案1

将以下内容另存为ltx

#!/bin/sh

latex $1.tex
dvips -Go -ta4 -Ppdf $1.dvi
ps2pdf $1.ps

使其可执行chmod 755 ltx

看一下bash 脚本如何制作脚本。

编辑:Kalvin Lee 的建议(下面的评论):要使脚本随处可用,请将其复制到路径上的目录:很可能最合适的位置是/usr/local/bin.

答案2

我将输入另一个答案,只是为了为未来的工作提供一些额外的视角。

你的问题的一部分说

跑得像$./ltx <file>.tex...

这意味着(通过./语法)ltx 脚本存在于您的当前目录中。恕我直言,这是一个人为的限制,因为也许下周您想要处理不同目录中的一些不同文件。

创建 shell 脚本是解决这个问题的一个明显的解决方案——您有多个命令始终链接在一起,并且您不想每次想要生成新的 postscript 文件时都键入它们。杰科彭斯显示这个怎么做;正如一位评论者指出的那样,您可以将此 shell 脚本放在更中心的位置(~/bin?)并更新您$PATH以包含该目录,以便您可以ltx file.tex在有 file.tex 的任何地方键入,它会执行您想要的操作。

另一种选择是创建别名。不过,别名是有限的,因为 shell 仅当它们是命令中的第一个单词时才会展开它们,并且无法多次引用传递的参数(它只是附加到别名文本中)。

另一种选择是创建一个函数。函数可以在 shell 的启动文件中定义,因此不需要对您的文件进行任何修改$PATH,并且可以从您所在的任何目录执行。

这是执行您想要的功能的初稿:

function ltx() {
  latex "$1" && \
    dvips -Go -ta4 -Ppdf "${1%.tex}.div" && \
      ps2pdf "${1%.tex}.ps"
}

我对您的初始命令进行了两项主要修改和一项小调整:

  1. 在行的末尾,我添加了&&告诉 shell 的符号:“如果前一个命令已成功返回,则仅执行下一个命令。”如果您指定的 file.tex 不存在,或者命令latex由于某种原因失败,这可以节省额外的错误。该行中的最后一个字符\告诉 shell 下一行应被视为当前行的一部分——一个延续。在这种情况下,这并不是绝对必要的,因为 shell 认为&&需要另一个命令来跟随它。我喜欢将其包含在我编写的脚本中,以便更明显地表明意图是将这两行(或多行)放在一起。我还缩进了后续行以使其更加清晰。

  2. 我在第一次调用中更改为file.tex$1并使用了 bash参数扩展在以下调用中,为了引用file.tex您传递给函数的 ,然后删除.tex扩展以添加回.div.ps扩展中。

  3. 我还引用了变量扩展,以便您可以根据file with spaces.tex需要命名文件,并且 shell 将在所有命令中保留文件名。

该函数的初稿将起作用,但我将指出我将采取的几个额外步骤:

function ltx() {
  [ -r "$1" ] || return 1
  [[ $1 =~ .tex$ ]] || return 2
  echo latex "$1" &&
    dvips -Go -ta4 -Ppdf "${1%.tex}.div" &&
      ps2pdf "${1%.tex}.ps"
}

第一个新的附加行检查您传入的参数是否实际存在并且可读。如果不是,该函数将返回,而不调用任何其他命令,返回代码为 1。您可以更改此测试以输出其他内容 ( That file does not exist, please try something else),或者完全保留它,然后知道 Latex 命令会给您一个错误关于丢失的输入文件。

第二个附加行是 bash 特定的,并检查您传入的参数是否以字符串结尾.tex。我添加此文件是因为后续命令需要这样的文件,并且参数扩展试图消除这样的扩展,所以如果你调用ltx somefile,修改后的函数将返回退出代码 2 并且不调用 Latex.

你问题的最后一部分是:

我必须学习什么才能知道将来如何做这种事情?

我认为你已经开始走上正确的道路:你有一个现实世界的问题,你认为可以通过 shell 脚本(或某种方式)来解决这个问题。你来到了 U&L 的环境,这里有志趣相投且了解这些事情的人。该网站还有数千个类似的问题和答案,可以解决各种人的具体问题。

研究类似问题的其他答案,例如,, 和(正如您最初标记的那样)。对评价最高的、最短的或最新的进行排序,看看您是否能理解它们的工作原理。将有趣的内容复制到系统上的游乐场区域并进行试验。改变它们看看会发生什么!

查看系统上可能有的 shell(例如,,)并阅读他们的手册页以了解他们提供的功能。尝试这些功能,直到您理解它们为止。在阅读描述时,想想您可能能够解决或改进的其他问题。

相关内容