部分重新編譯,如何?

部分重新編譯,如何?

像 BaKoMa TeX 和 texpad 這樣的編輯器似乎能夠重新編譯單一頁面。我對如何自己實現這一點感興趣,但一直無法找到如何做到這一點。

我希望更有知識的人能夠在這裡提供一些答案,我理想地尋找的是一步一步的過程,理想情況下可以整合到編輯器中(我協助 LaTeX 的開發) Workshop VSCode 擴充)。

答案1

奧克特克斯,Emacs 最著名的 *TeX 主模式有一個TeX-command-region功能,它將在先前用滑鼠選擇的檔案的任何部分上運行編譯器(當然您也可以用鍵盤完成)。如果你想實作這個函數程式碼,你可以很容易地在Emacs中查看它。

由於我不再是 Emacs 用戶,我只是運行我的不太優雅但有效的外部 shell 腳本。應該與任何 texlive 安裝和 ksh,也許任何其他 shell 一起使用。這當然不應該在任何編輯器中實現。

#!/bin/ksh
#tex_region.sh first_line last_line file [master file]

#where am I?
ousuisje=$(pwd)
#is there a master file?
if [[ -s $4 ]];
then
   maitre=$4;
else
   maitre=$3;
fi
#copy the preamble
sed -e '/maketitle/,$d' $maitre > /tmp/$maitre ;
#copy file from line $2 to line $3
head -n $2 $3 |tail -n $(( $2 - $1 + 1 )) |\
#absolute path to graphic files
sed "/includegraphics/s:{\([^}]\+}\):{$ousuisje/\1:">> /tmp/$maitre
#add \end{document} to temporary file
echo -E "\end{document}" >> /tmp/$maitre

#goes to /tmp
cd /tmp

#checks which *latex has to be called then compile
laoulualatex=$(grep -c '^\\\usepackage{polyglossia}' $maitre)
if (( $laoulualatex == 1 )) ;
then
   # if your distro is texlive, binaries should be in $TEXDIR/bin
   lualatex $maitre ;
else
   pdflatex $maitre ;
fi

######read the pdf with mupdf (code inspired by Vincent Lozano's framabook
###### "pour aller plus loin avec la ligne de commande")
#checks whether the pdf is opened with mupdf
pidpdf=$(ps -U dthiriet | grep mupdf | grep ${maitre%tex}pdf | cut -d' ' -f1)
if test -z $pidpdf ;
   #if not, calls mupdf
then 
   mupdf ${maitre%tex}pdf & 
else
   #send a SIGHUP signal to mupdf to actualize the pdf
   kill -s HUP $pidpdf ;
fi ;

#####back to my file
cd $ousuisje

PS 最好在腳本中使用絕對路徑來呼叫程序,但我在複製腳本時刪除了它們,以使該腳本更加可移植。

答案2

\include只是為了確保:您知道如何擁有一個主文檔並使用, \input,包含盡可能多的部分\includeonly,詳細資訊請參閱此處:我什麼時候應該使用 \input 和 \include?。這使得重新編譯相當快。

您甚至可以透過使用預編譯格式來加速編譯,請參閱套件 mylatexformat。

如果你讓 Latexmk 在後台編譯,你可以提高它。

也許您的編輯器允許自動儲存,例如在您停止打字後兩秒鐘。 Latexmk 注意到儲存並開始使用預編譯格式進行編譯。

最後,您幾乎可以立即獲得已更改內容的頁面的圖片。

答案3

為了實現真正的線上編譯,其他軟體(例如 BaKoMa TeX)使用修改後的 (La-)TeX。使用較新的 LuaTeX,可以更輕鬆地深入了解內部結構,也許這是您可以研究的路線。

作為解決方法,可以做的是使用 LaTeX 開始編譯,直到編輯器中目前遊標位置的位置。假設您的完整文件如下所示:

\documentclass{article}
\begin{document}

$1$
\newpage
$2$

[遊標位置]

Some more example text.

此時 DVI 檔案仍會被寫入,而不是繼續、在此結束輸入併中止編譯。

\newpage
$3$
\newpage
$4$

\end{document}

可以使用 LaTeX 輸入並編譯第一個區塊。然後,當使用者短暫休息時,編譯可以繼續,並且可以中止,例如在下一頁。然後 DVI 文件幾乎立即可用。然後,您可以在背景再次啟動編譯過程,直到遊標所在的位置,這樣就不會中斷使用者工作流程。

對於修改後的 LaTeX 可執行文件,第一個最佳化是將編譯過程記錄在一種快取中,以便當前頁面之前的部分不需要再次編譯,除非它發生變化。這使得這種方法在某種程度上也是可行的,沒有程式設計方式可以用後面頁面上的程式碼影響前面頁面的內容。這將 LaTeX 檔案與 C 原始檔案區分開來,在 C 原始檔案的末尾可以更改先前的部分。

答案4

我知道這並不完全是您想要的,但是有一些 VIM 插件可以提供文件的即時預覽。

vim-latex-即時預覽就可以獲得這樣的效果。當然,這僅在使用 VIM 作為編輯器時有效。我不是 EMACS 用戶,但我確信那裡也有類似的功能。

我希望這可以引導您走向正確的方向。

相關內容