Почему Tex/Latex не ускоряется при последующих запусках?
Мне действительно интересно, почему даже последние системы Tex/Latex не используют никакого кэширования для ускорения последующих запусков. Каждый раз, когда я исправляю одну запятую *, вызов Latex обходится мне примерно в одно и то же время, потому что ему нужно загружать и конвертировать каждый файл изображения.
(* Я знаю, что даже изменение крошечной запятой может повлиять на всю структуру, но, конечно, хорошо написанный формат кэша может увидеть влияние этого. Кроме того, могут быть ситуации, когда 100% -ная корректность не требуется, пока она быстра.)
Есть ли что-то в языке Tex, которое делает это сложным или невозможным для выполнения, или просто в первоначальной реализации Tex этого не было необходимости (потому что это все равно было бы медленно на этих больших компьютерах)?
Но с другой стороны, почему это не так раздражает других людей, что они запустили разветвление, которое имеет какое-то кэширование (или прозрачное преобразование файлов Tex в формат, который быстрее разбирается)?
Что я могу сделать, чтобы ускорить последующие заезды латекса? Кроме размещения всего материала в файлах chapterXX.tex и последующего комментирования?
6 ответов
Давайте попробуем понять, как работает TeX. Что происходит, когда вы пишете следующее?
tex.exe myfile.tex
TeX читает ваш файл побайтно. Прежде всего, TeX конвертирует каждый символ в пару <category, ascii-code>
, Каждый символ имеет код категории и код ASCII. Код категории означает, что символ является открывающей скобкой ({
) или вход в математический режим ($
), символ-макрос (~
например) или буквой (A-Z
, a-z
).
Если TeX получает символы с кодом категории 11 (буквы) или 12 (другие символы: цифры, запятая, точка), TeX начинает абзац. Вы хотите кэшировать все абзацы.
Предположим, вы что-то изменили в своем документе. Как TeX может проверить, что все абзацы после ваших изменений одинаковы? Может быть, вы изменили категорию какого-нибудь персонажа. Я, быть может, ты изменил значение какого-то макроса. Или вы удалили }
где-то и таким образом изменил текущий шрифт.
Чтобы быть уверенным, что абзац одинаков, необходимо убедиться, что все символы абзаца одинаковы, что все категории символов одинаковы, текущий шрифт одинаков, все математические шрифты одинаковы, а значение некоторых внутренние переменные одинаковы (например, \hsize
, \vsize
, \pretolerance
, \tolerance
, \hypenpenalty
, exhyphenpenalty
, \widowpenalty
, \spaceskip
,...,........)
Вы можете быть уверены только в том, что все подписанные до ваших изменений одинаковы. Но в этом случае вы должны сохранить все состояния после каждого абзаца.
Ваша система SuperCachedTeX
это очень сложно. Не так ли?
Если вы используете pdftex, то вы можете использовать --draftmode
в командной строке для первых запусков. Это указывает pdftex не создавать PDF.
Конечно, многие вещи могут быть кэшированы (например, графическая информация), но то, как работает TeX, усложняет задачу. При запуске TeX происходит довольно сложная инициализация, и один запуск TeX всегда означает ровно один записанный PDF. Для того, чтобы сделать кэширование, вам нужно хранить данные в памяти (чтобы быть эффективными).
Вы можете использовать IPC и поговорить с демоном, чтобы получить кэшированную информацию. Но это будет включать в себя много программирования. TeX для обычных целей настолько молниеносно быстр, что это мало что дает. Но, с другой стороны, это хороший вопрос, так как я видел, как LaTeX работает (на современном оборудовании), которые работают> 10 часов, которые выиграли бы от кэширования.
Еще один ответ, не строго связанный:
Вы можете использовать макрос LaTeX \include{...}
и с \includeonly{}
Вы можете перезапустить свой документ только для подмножества. Но это не кэширование и не дает вам полный документ.
Существуют такие решения, как preview-latex, которые предварительно компилируют материал в специальный файл формата для ускорения работы. Вы должны помнить, что TeX оптимизирует страницы на локальной основе. На уровне двигателя нет материала, фиксируемого на определенной странице, поэтому вы не можете просто "переэкспонировать одну страницу".
У Tex есть возможность кэширования, именованные файлы форматов, и я думаю, что, по мере того, как Алексея следует ценный обзор проблем, представляющих состояние Tex, должна быть возможность использовать их для возобновления редактирования после любого извлечения страницы.
Основная проблема заключается в том, что разрывы страниц будут влиять на абзацы или плавающие элементы, и они могут не возникать в определенном месте текста, но могут возникать при выполнении макросов, которые были вызваны в зависимости от переходного состояния, передаваемого им при их вызове.
Таким образом, чтобы идея создания "точек останова" работала, нужно было взломать внутренние компоненты Tex, чтобы получить дополнительную информацию, помимо той, которая обычно выдается в форматных файлах, и упаковать их с состоянием вспомогательных файлов. Учитывая то, что Джозеф говорит о средствах просмотра фрагментов Tex, зачем кому-то мешать взломать Tex для этого?
На самом деле правильный ответ (IMO): LaTeX уже кэширует информацию в своем выходном файле (.aux
дополнительные файлы для других пакетов). Таким образом, если вы добавите запятую, эта информация будет использоваться повторно, и, следовательно, набор будет выполняться гораздо быстрее, чем без .aux
файл.