部分的な再コンパイルはどのように行うのですか?

部分的な再コンパイルはどのように行うのですか?

BaKoMa TeX や texpad などのエディタは、個々のページを再コンパイルできるようです。これを自分で実現する方法に興味があるのですが、やり方がわかりません。

もっと知識のある人が答えを提供してくれることを期待しています。私が理想的に探しているのは、ステップバイステップのプロセスであり、理想的にはエディターに統合できるようなプロセスです (私は LaTeX Workshop VSCode 拡張機能の開発を支援しています)。

答え1

オークテックスEmacs の最も有名な *TeX 用メジャーモードにはTeX-command-region、マウスで以前に選択したファイルの任意の部分に対してコンパイラを実行する関数があります (もちろん、キーボードでも実行できます)。実装したい場合は、Emacs 内でこの機能コードを簡単に確認できます。

私はもう Emacs ユーザーではないので、あまりエレガントではないが機能する外部シェル スクリプトを実行するだけです。texlive インストールと ksh、おそらく他のシェルでも動作するはずです。これはどのエディターにも実装されるべきではありません。

#!/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 をバックグラウンドでコンパイルすれば、その効果を高めることができます。

おそらく、エディタは、入力を止めてから 2 秒後に自動的に保存することを許可しているのでしょう。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 ユーザーではありませんが、そこにも同様の機能があることは確かです。

これがあなたを正しい方向に導くことを願っています。

関連情報