Почему Tex/Latex не ускоряется в последующих прогонах?

Мне действительно интересно, почему даже последние системы Tex/Latex не используют кеширование для ускорения последующих запусков. Каждый раз, когда я фиксирую одну запятую *, вызов Latex стоит меня примерно столько же времени, потому что ему нужно загрузить и преобразовать каждый файл изображения.

(* Я знаю, что даже изменение крошечной запятой может повлиять на всю структуру, но, конечно, хорошо написанный формат кеша может видеть влияние этого. Кроме того, могут быть ситуации, когда 100% -ная правильность не требуется в течение долгого времени как его быстро.)

Есть ли что-то на языке Tex, которое делает это сложным или невозможным для достижения или это просто в оригинальной реализации Tex, не было необходимости в этом (потому что это было бы медленным в любом случае на этих больших компьютерах)

Но с другой стороны, почему это так не раздражает других людей, что они запустили вилку, которая имеет какое-то кэширование (или прозрачное преобразование файлов Tex в формат, который быстрее разбирается)?

Есть ли что-нибудь, что я могу сделать, чтобы ускорить последующие прогоны Latex? За исключением того, что все вещи помещаются в файлы chapterXX.tex, а затем комментируете их?

Ответ 1

Попробуйте понять, как работает TeX. Что происходит, когда вы пишете следующее?

tex.exe myfile.tex

TeX считывает ваш файл байтом байтом. Прежде всего, TeX преобразует каждый char в пару <category, ascii-code>. Каждый символ имеет код категории и код ascii. Код категории означает, что символ является открывающей скобкой ({) или вход в математический режим ($), символ-макрос (~, например) или буква (A-Z, A-Z).

Если TeX получает символы с кодом категории 11 (буквы) или 12 (другие символы: цифры, запятая, период), TeX начинает абзац. Вы хотите кэшировать все абзацы.

Предположим, вы что-то изменили в своем документе. Как TeX может проверить, что все абзацы после ваших изменений совпадают? Может быть, вы изменили категорию некоторых char. Я бы изменил значение какого-то макроса. Или вы удалили } где-то и, таким образом, изменили текущий шрифт.

Чтобы быть уверенным, что абзац тот же, вы должны быть уверены, что все символы в абзаце одинаковы, что все категории символов одинаковы, текущий шрифт один и тот же, все математические шрифты одинаковы, а значение некоторых внутренние переменные одинаковы (например, \hsize, \vsize, \pretolerance, \tolerance, \hypenpenalty, exhyphenpenalty, \widowpenalty, \spaceskip,...,........)

Вы можете быть уверены, что все параграфы перед вашими изменениями одинаковы. Но в этом случае вы должны сохранять все состояния после каждого абзаца.

Ваша система SuperCachedTeX очень сложна. Не правда ли?

Ответ 2

Если вы используете pdftex, вы можете использовать --draftmode в командной строке для первых запусков. Это указывает pdftex не создавать PDF файл.

Конечно, многие вещи могут быть кэшированы (например, графическая информация, например), но способ работы TeX затрудняет работу. Существует довольно сложная инициализация TeX, когда он запускается, и один запуск TeX всегда означает ровно один PDF файл. Чтобы сделать кеширование, вам нужно сохранить данные в памяти (чтобы быть эффективными).

Вы можете использовать IPC и поговорить с демоном, чтобы получить кешированную информацию. Но это потребует много программистов. TeX для обычных целей так невероятно быстро, что это действительно не очень много. Но, с другой стороны, это хороший вопрос, так как я видел, как LaTeX запускает (на аппарате с током), который работает > 10 часов, которые могли бы извлечь выгоду из кеширования.

Ответ 3

Есть такие решения, как предварительный латекс, который предварительно компилирует материал в выделенный файл формата для достижения скорости. Вы должны помнить, что TeX оптимизирует страницы на локальном уровне. Конкуренция на уровне двигателя материала не фиксируется на конкретной странице, поэтому вы не можете просто "перефразировать одну страницу".

Ответ 4

Еще один ответ, не связанный строго:

Вы можете использовать макрос LaTeX \include{...} и с \includeonly{} вы можете повторно запустить свой документ только для подмножества. Но это не кеширование, и он не дает вам полный документ.

Ответ 5

Собственно, правильный ответ (IMO): LaTeX уже кэширует информацию в своем выходном файле (.aux, дополнительные файлы для других пакетов). Поэтому, если вы добавляете запятую, эта информация повторно используется, и, следовательно, запуск набора будет намного быстрее, чем без этого файла .aux.

Ответ 6

У Tex есть средство кэширования, именованные файлы формата, и, я думаю, запустите Alexey ценное резюме проблем, представляющих состояние Tex, должно быть возможно использовать их, чтобы разрешить возобновление редактирования после извлечения любой страницы.

Основная проблема заключается в том, что разрывы страниц будут влиять на абзацы или поплавки, и они могут не встречаться в определенной точке текста, но могут возникать при выполнении макросов, которые были вызваны в зависимости от состояния переходного процесса, переданного им, когда они были вызваны.

Итак, чтобы создать идею создания "контрольных точек", нужно было бы взломать внутренние элементы Tex, чтобы сбрасывать дополнительную информацию, кроме тех, которые нормированы в файлах формата, и упаковывать их в состояние вспомогательных файлов. Учитывая то, что Джозеф говорит о предварительном просмотре фрагментов Tex, почему кто-то должен взломать Tex для этого?