Частичная перекомпиляция, как?

Частичная перекомпиляция, как?

Редакторы вроде 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, но я уверен, что там тоже есть похожие возможности.

Надеюсь, это поможет вам двигаться в правильном направлении.

Связанный контент