错误:TeX 容量超出,抱歉 - MiKTeX

错误:TeX 容量超出,抱歉 - MiKTeX

我有一份大型文档,大约 3 年前编译得很好。我回过头来检查它,每次我尝试编译它时都会得到! TeX capacity exceeded, sorry [save size=50000]。我尝试遵循任何好的想法,比如这里或者这里。第二个对我没有帮助,因为我使用 MiKTeX(我无法找到任何像texmf.cnfMiKTeX 这样的文件)。我尝试按照第一个步骤操作,但要么不起作用,要么我太笨了……(抱歉!)。我尝试执行
initexmf --admin --edit-config-file=latex
进入extra_mem_top = 2000000和/或main_memory = 5000000
随后
initexmf --admin --dump=latex
但结果仍然是同样的错误。

我正在发布 MWE,但它没有产生错误。有趣的是,我的文档由两大部分组成。当我编译它时,只包含其中一部分,它编译得很好。当我只用第二部分编译它时也是一样。只有在编译整个文档(包括两个大部分)时,它才会产生错误,构建输出显示为:

在此处输入图片描述

有人知道如何解决这个问题吗?它看起来确实像是一个内存错误,而不是代码错误(因为只有一半时代码编译得很好)...

编辑:奇怪的是,我或多或少可以确定产生错误的行。当我从文档中删除该部分时,错误出现在下一部分。看起来错误总是在同一行,无论内容是什么。

\documentclass[paper=a5,fontsize=10pt,twoside,twocolumn,pagesize,DIV=15,headsepline,titlepage,openright]{scrbook}
\usepackage{scrlayer-scrpage}
\usepackage{cmap}
\usepackage[utf8x]{inputenc}
\usepackage[vietnamese,polish,english,ngerman]{babel}
\usepackage[T5,T1]{fontenc}
\usepackage{longtable}
\usepackage{lmodern}

\newcommand*\de{\fontencoding{T1}\selectfont\selectlanguage{ngerman}}
\newcommand*\en{\fontencoding{T1}\selectfont\selectlanguage{english}}
\newcommand*\pl{\fontencoding{T1}\selectfont\selectlanguage{polish}}
\newcommand*\vn{\fontencoding{T5}\selectfont\selectlanguage{vietnamese}}

\newcommand{\textfsf}{\sffamily\bfseries\selectfont}
\newcommand{\textksf}{\sffamily\itshape\small\selectfont}

\makeatletter
\g@addto@macro\description{\raggedright}
\makeatother

\setlength{\parindent}{0pt}
\setlength{\parskip}{0.8ex plus 0.4ex minus 0.2ex}
\flushbottom

\clearscrheadings
\ihead{}
\chead{}
\ohead{\rightmark}
\ifoot{}
\cfoot{}
\ofoot{\pagemark}
\pagestyle{scrheadings}

\pdfinfo{
/Title (xxx.pdf)
/Creator (xxx)
/Producer (xxx)
/Author (xxx)
/CreationDate (D:20100101000000)
/ModDate (D:20100101000000)
/Subject (xxx)
/Keywords (xxx)
}

\begin{document}
\frontmatter
\title{\pl ZÓŁTA KROWA\\ \vn CHÀO MỪNG}
\subtitle{\pl NA ŁĄCE\\ \vn CÁC BẠN}
\author{\pl dzień\\ \vn tốt}
\date{}
\publishers{\pl Wydawcy}
\maketitle
\mainmatter
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \\
\backmatter
\end{document}

答案1

我定义

\def\ten{
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
}\def\hundred{\ten\ten\ten\ten\ten\ten\ten\ten\ten\ten}
\def\thousand{\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred}

为了进行多种语言更改。我还制作了一个包装器宏

\newcommand{\languagechange}[3]{%
  \newcommand{#1}{%
    \fontencoding{#2}\selectfont
    \selectlanguage{#3}%
  }%
}
\languagechange{\de}{T1}{ngerman}
\languagechange{\en}{T1}{english}
\languagechange{\pl}{T1}{polish}
\languagechange{\vn}{T5}{vietnamese}

使用以下方式编译文档

\thousand\thousand\thousand

(即 3000 个段落),保存大小的统计信息为

12194s

总分80000s。加上 3000 段,我得到 24175 分。

另一方面,如果我\languagechange将的定义改为

\newcommand{\languagechange}[3]{%
  \wlog{Lang: #3}%
  \newcommand{#1}{%
    \csname otherlanguage*\endcsname{#3}%
  }%
}

保存大小的统计数据下降到 389s。主要原因是它将\selectlanguage自身写入文件aux,这对保存大小产生了不良影响。顺便说一句,没有必要发出\fontencoding{T5}\selectfont in order to switch to Vietnamese, because this is already taken care of bybabel`。

完整示例:

\documentclass[paper=a5,fontsize=10pt,twoside,twocolumn,pagesize,DIV=15,headsepline,titlepage,openright]{scrbook}
\usepackage{scrlayer-scrpage}
\usepackage{cmap}
\usepackage[utf8]{inputenc}
\usepackage[vietnamese,polish,english,ngerman]{babel}
\usepackage[T5,T1]{fontenc}
\usepackage{longtable}
\usepackage{lmodern}

\newcommand{\languagechange}[3]{%
%  \wlog{Lang: #3}%
  \newcommand{#1}{%
%    \fontencoding{#2}\selectfont
    \csname otherlanguage*\endcsname{#3}%
  }%
}
\languagechange{\de}{T1}{ngerman}
\languagechange{\en}{T1}{english}
\languagechange{\pl}{T1}{polish}
\languagechange{\vn}{T5}{vietnamese}

\newcommand{\textfsf}{\sffamily\bfseries\selectfont}
\newcommand{\textksf}{\sffamily\itshape\small\selectfont}

\makeatletter
\g@addto@macro\description{\raggedright}
\makeatother

\setlength{\parindent}{0pt}
\setlength{\parskip}{0.8ex plus 0.4ex minus 0.2ex}
\flushbottom

\clearscrheadings
\ihead{}
\chead{}
\ohead{\rightmark}
\ifoot{}
\cfoot{}
\ofoot{\pagemark}
\pagestyle{scrheadings}

\pdfinfo{
/Title (xxx.pdf)
/Creator (xxx)
/Producer (xxx)
/Author (xxx)
/CreationDate (D:20100101000000)
/ModDate (D:20100101000000)
/Subject (xxx)
/Keywords (xxx)
}

\begin{document}
\frontmatter
\title{\pl ZÓŁTA KROWA\\ \vn CHÀO MỪNG}
\subtitle{\pl NA ŁĄCE\\ \vn CÁC BẠN}
\author{\pl dzień\\ \vn tốt}
\date{}
\publishers{\pl Wydawcy}
\maketitle
\mainmatter

\def\ten{
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
\pl tu będzie trochę tekstu \vn vẫn có bằng tiếng Việt \par
}\def\hundred{\ten\ten\ten\ten\ten\ten\ten\ten\ten\ten}
\def\thousand{\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred\hundred}

%\tracingrestores=1

\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand
\thousand\thousand\thousand

\backmatter
\end{document}

最终结果为 884 页,包含 30000 个段落和 60000 个语言变化。最终统计数据如下

Here is how much of TeX's memory you used:
 5560 strings out of 492639
 122151 string characters out of 6129301
 308623 words of memory out of 5000000
 9358 multiletter control sequences out of 15000+600000
 62048 words of font info for 39 fonts, out of 8000000 for 9000
 1141 hyphenation exceptions out of 8191
 51i,18n,70p,9111b,389s stack positions out of 5000i,500n,10000p,200000b,80000s

如您所见,只使用了堆栈大小的一小部分。

相关内容