![编译 Latex 文件的脚本](https://linux22.com/image/93211/%E7%BC%96%E8%AF%91%20Latex%20%E6%96%87%E4%BB%B6%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我用来编译 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"
}
我对您的初始命令进行了两项主要修改和一项小调整:
在行的末尾,我添加了
&&
告诉 shell 的符号:“如果前一个命令已成功返回,则仅执行下一个命令。”如果您指定的 file.tex 不存在,或者命令latex
由于某种原因失败,这可以节省额外的错误。该行中的最后一个字符\
告诉 shell 下一行应被视为当前行的一部分——一个延续。在这种情况下,这并不是绝对必要的,因为 shell 认为&&
需要另一个命令来跟随它。我喜欢将其包含在我编写的脚本中,以便更明显地表明意图是将这两行(或多行)放在一起。我还缩进了后续行以使其更加清晰。我在第一次调用中更改为
file.tex
,$1
并使用了 bash参数扩展在以下调用中,为了引用file.tex
您传递给函数的 ,然后删除.tex
扩展以添加回.div
或.ps
扩展中。我还引用了变量扩展,以便您可以根据
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脚本,壳, 和巴什(正如您最初标记的那样)。对评价最高的、最短的或最新的进行排序,看看您是否能理解它们的工作原理。将有趣的内容复制到系统上的游乐场区域并进行试验。改变它们看看会发生什么!
查看系统上可能有的 shell(例如巴什,桀骜,克什)并阅读他们的手册页以了解他们提供的功能。尝试这些功能,直到您理解它们为止。在阅读描述时,想想您可能能够解决或改进的其他问题。