編譯 Latex 文件的腳本
我用來編譯 Latex 終端的命令是:
$latex <file>.tex $dvips -Go -ta4 -Ppdf <file>.div $ps2pdf <file>.ps
我想要做的是製作一個我將執行的腳本,它將生成上面列出的所有命令,並在必要時
$./ltx <file>.tex
更改.tex
副檔名。.div``.ps
我該怎麼做以及我必須學習什麼才能知道將來如何做這種事情?
我將輸入另一個答案,只是為了為未來的努力提供一些額外的視角。
你的部分問題說
像
$./ltx <file>.tex
…一樣奔跑這意味著(通過
./
語法) ltx 腳本存在於您的目前目錄中。這是一個人為的限制,恕我直言,因為也許下週你想處理不同目錄中的一些不同文件。創建一個 shell 腳本是解決這個問題的一個明顯方法——您有多個命令一直連結在一起,並且您不想在每次想要生成新的 postscript 文件時都鍵入它們。jcoppens展示瞭如何做到這一點;正如其中一位評論者指出的那樣,您可以將此 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
or.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
(關於失去的輸入文件。第二個附加行是特定於 bash 的,正在檢查您傳入的參數是否以 string 結尾
.tex
。我添加這個是因為後續命令需要這樣一個文件,而參數擴展正在嘗試刪除這樣一個副檔名,所以如果你呼叫ltx somefile
,修改後的函式將返回退出程式碼 2 而不會呼叫latex。你問題的最後一部分是:
我必須學習什麼才能知道將來如何做這種事情?
我認為你已經開始了正確的道路:你有一個現實世界的問題,你認為可以使用 shell 腳本(或以某種方式)變得更好。你來到了 U&L 的環境,那裡有志同道合的人對這些事情有了解。該站點還有數千個類似的問題和答案,可以解決不同人的具體問題。
研究類似問題的其他答案,例如shell-script、shell和bash中的答案(正如您最初標記的那樣)。對評分最高的、最短的或最新的進行排序,看看你是否能理解它們的工作原理。將有趣的複製到系統上的遊樂場區域並進行試驗。改變他們,看看會發生什麼!
查看您系統上可能可用的 shell(例如bash、zsh、ksh)並通讀它們的手冊頁以了解它們提供的功能。試驗這些功能,直到你理解它們。在閱讀描述時,想想你可能能夠解決或改進的其他問題。
將以下內容另存為
ltx
:#!/bin/sh latex $1.tex dvips -Go -ta4 -Ppdf $1.dvi ps2pdf $1.ps
使其可執行
chmod 755 ltx
看看bash 腳本如何製作腳本。
編輯:來自 Kalvin Lee 的建議(下面的評論):要使腳本在任何地方都可用,請將其複製到路徑上的目錄:很可能最合適的地方是
/usr/local/bin
.