
Редакторы вроде BaKoMa TeX и texpad, похоже, способны перекомпилировать отдельные страницы. Мне интересно, как сделать это самому, но я не смог найти, как это сделать.
Я надеюсь, что кто-то более знающий сможет дать здесь ответы. В идеале я ищу пошаговый процесс, в идеале такой, который можно было бы интегрировать в редактор (я помогаю в разработке расширения LaTeX Workshop VSCode).
решение1
AucTeX, 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
P.S. Лучше вызывать программы по их абсолютным путям в скрипте, но я удалил их при копировании своего скрипта, чтобы сделать его немного более переносимым.
решение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-live-предварительный просмотрвы можете получить этот эффект. Конечно, это будет работать только при использовании VIM в качестве редактора. Я не пользователь EMACS, но я уверен, что там тоже есть похожие возможности.
Надеюсь, это поможет вам двигаться в правильном направлении.