Кажется, я часто сталкиваюсь с проблемами емкости и каждый раз увеличиваю лимиты. На этом сайте есть несколько вопросов, касающихся этого. Однако, похоже, есть некоторая противоречивая информация и нет единого места, гдевсеэти ограничения детализированы.
Основной вопрос:
Итак, то, что я ищу, это
- Имя переменной
- Значение по умолчанию.
- Абсолютныймаксимальное значение, на которое его можно установить.
- Какие шаги я могу предпринять, чтобы минимизировать эти использования. Что ДЕЛАТЬ и НЕ ДЕЛАТЬ для каждого из этих ограничений емкости.
Настройки, о которых я знаю, указаны в конце файла журнала:
106477 strings out of 493042
2524840 string characters out of 39884661
12363848 words of memory out of 12435455
103471 multiletter control sequences out of 15000+600000
197845 words of font info for 228 fonts, out of 8000000 for 9000
1143 hyphenation exceptions out of 8191
86i,17n,86p,10523b,3398s stack positions out of 5000i,500n,10000p,200000b,80000s
но могут быть и другие, которые здесь не перечислены. Моя непосредственная проблема с words of memory
тем, что приведенные выше цифры получены в результате первого запуска индексации. Если я попытаюсь выполнить второй запуск, то я получу TeX Capacity Exceeded
.
ПримерыДругойПеременные:
Из комментариев Дэвиса Карлайла, есть также extra_mem_top
и extra_mem_bot
, которые также могут быть использованы. Но, допускает ли это большее words of memory
или они связаны с одним из других ограничений емкости в отчете. Опять же, какой максимум я могу установить для них?
Возможные действия, которые можно и нельзя выполнять:
Некоторые из вопросов, которые у меня возникли в отношении минимизации использования, перечислены здесь, поэтому, возможно, их можно будет охватить в разделах «ЧТО НУЖНО» и «ЧТО НЕ НУЖНО» для каждой из переменных.
Лучше использовать
\def\foo{xxx}
вместо\newcommand*{\foo}{xxx}
. Я могу выполнить проверку на наличие дублирующихся имен макросов вне TeX.Увеличивают ли имена макросов с большим количеством символов частоту использования некоторых из них?
Например,
\expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx}
есть ли какие-либо проблемы в regrads to capacity. Будет ли лучше для меня сопоставитьdir1/dir1/long-file-name
с какой-то более короткой строкой, например,ZXyw
чтобы сэкономить на этих ограничениях. Да, теряется читаемость, но я могу автоматизировать эту замену.Приводит ли повторение текста к более частому использованию лимитов: Что из перечисленного будет лучше:
\MyMacro{../../../../dirA/dirB/dirC/dirD/file0001.tex} \MyMacro{../../../../dirA/dirB/dirC/dirD/file0002.tex} ... \MyMacro{../../../../dirA/dirB/dirC/dirD/file5000.tex}
или
\def\Path{../../../../dirA/dirB/dirC/dirD/} \MyMacro{\Path/file0001.tex} \MyMacro{\Path/file0002.tex} ... \MyMacro{\Path/file5000.tex}
Помогает ли
\undef
использование макросов после того, как они больше не нужны, преодолеть эти ограничения?
Конечно, я могу поэкспериментировать с теми вещами, которые я придумал, но, возможно, есть и другие вещи, которые можно сделать, чтобы сократить использование этих ограниченных строк и слов.
Пример непоследовательности
У меня
/usr/local/texlive/2015/texmf.cnf
(main_memory = 12435455
12,4 М), что является заявленным максимумом согласноlatex выдает мне ошибку: Ой, мои внутренние константы были стерты. Если я попытаюсь увеличить его всего на 1, то12435456
я действительно получуOuch---my internal constants have been clobbered!---case 14
. Даже после выполненияsudo vi texmf.cnf
согласноУвеличить емкость LaTeX.Однако решение Томаса Ф. ШтурмаКак расширить «размер основной памяти» TeX? (перегрузка памяти pgfplots)показывает
100571134 words of memory out of 103000000
таким образом, это означает, что максимум составляет не менее 103M.
Кроме того, в файле
/usr/local/texlive/2015/texmf-dist/web2c/texmf.cnf
есть комментарий, чтоMemory. Must be less than 8,000,000 total.
. Ну, это явно неверно, так как я могу использовать больше, чем это.
Примечания:
Я предполагаю, что любые изменения будут внесены в файл, о котором сообщается
kpsewhich texmf.cnf
в ответе Лео Лю наКак расширить «размер основной памяти» TeX? (перегрузка памяти pgfplots), что в моем случае/usr/local/texlive/2015/texmf.cnf
Если существуют другие способы настройки некоторых из них, мне бы хотелось их также узнать.
- Моя главная проблема сейчас — индексация большого количества записей и
words of memory
лимит. Меня меньше волнует время выполнения (в разумных пределах), больше — превышение этих лимитов. - Я использую TeXLive2015, если это имеет значение. Но если ограничения зависят от дистрибутива, было бы неплохо знать и это.
- Этот вопрос не касается состояний ошибок, которые приводят к превышению ограничений по емкости (например, мой наивный вопросПревышена емкость текста (если удалить % после использования макроса)).
Использованная литература:
- Существуют ли ограничения на количество новых макросов или команд в TeX/LaTeX?перечисляет упомянутые здесь переменные и предоставляет тестовый пример. Однако он сосредоточен конкретно на ограничениях, основанных на количестве макросов.
- Компоненты использования памяти (La)TeXотличная ссылка, так что, возможно, эти ответы можно добавить туда, а это закрыть как дубликат?
решение1
Лучше ли использовать \def\foo{xxx} вместо \newcommand*{\foo}{xxx}. Я могу выполнить проверку на наличие дублирующихся имен макросов вне TeX.
Нет, это одно и то же.
Например, есть ли у \expandafter\newcommand\csname dir1/dir1/long-file-name\endcsname{xxxx} какие-либо проблемы с емкостью?
теоретически да, csname должно где-то храниться, так что это занимает 2524840 символов строки из 39884661
но вы, по-видимому, собираетесь сделать его всего на 20 символов меньше, так что особой разницы из 39884661 не будет
Что из перечисленного будет лучше:
снова незначительно первый использует больше, так как он определяет еще одно csname ( \path
), которое выводит один из
103471 multiletter control sequences out of 15000+600000
но вы еще далеки от этого предела
Помогает ли \undefing макросов после того, как они больше не нужны, справиться с этими ограничениями?
да, именно поэтому latex удаляет множество команд при \begin{document}
записи хеша, не освобождается (количество многобуквенных команд), но освобождается основная память, используемая для сохранения определения.
решение2
Много лет назад я выступил с докладом о проблемах «превышение емкости TeX» с некоторой справочной информацией, основными причинами и возможностями их предотвращения.
Первая часть доклада была опубликована в"Die TeXnische Komödie" выпуск 1995/3, стр. 22 и далее.
На странице 24 приведена таблица со всеми (стандартными) сообщениями об ошибках переполнения TeX.web, связанными с ними параметрами TeX.web и настройками параметров.
Минусы: (1) доклад и статья только на немецком языке, (2) у меня никогда не было достаточно времени, чтобы завершить серию статей, включая все оставшиеся темы во 2-й и 3-й части, и (3) она основана на стандартной версии TeX.web или web2c "bigTeX", без e-TeX, pdfTeX, XeTeX, LuaTeX и подобных расширенных вариантов.