Почему текс / латекс не ускоряется при последующих запусках? - PullRequest
12 голосов
/ 28 апреля 2010

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

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 28 апреля 2010

Давайте попробуем понять, как работает 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 очень сложна.Не так ли?

4 голосов
/ 28 апреля 2010

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

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

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

3 голосов
/ 28 апреля 2010

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

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

2 голосов
/ 28 апреля 2010

Существуют такие решения, как preview-latex, которые предварительно компилируют материал в специальный файл формата для ускорения работы. Вы должны помнить, что TeX оптимизирует страницы на локальной основе. На уровне двигателя нет материала, фиксируемого на конкретной странице, поэтому вы не можете просто «переэкспонировать одну страницу».

1 голос
/ 30 апреля 2010

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

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

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

1 голос
/ 28 апреля 2010

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

...