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 用户,但我确信那里也有类似的功能。
我希望这可以为您指明正确的方向。