部分重新编译,怎么做?

部分重新编译,怎么做?

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 源文件(在文件末尾可以更改前一页的内容)不同。

答案4

我知道这并不是您正在寻找的,但是 VIM 有一些插件可以提供文档的实时预览。

vim-latex-实时预览你可以获得这种效果。当然,这只有在使用 VIM 作为编辑器时才有效。我不是 EMACS 用户,但我确信那里也有类似的功能。

我希望这可以为您指明正确的方向。

相关内容