在我的特殊包组合中,我得到了错误No room for new \write. \tablecontents
和Bad number (16). \tablecontents
。以下 MWE 在 TeX Live 2015 中引发了此错误。pdflatex
如lualatex
您所见,我添加了自己的内容寄存器loi
。我可以分别删除几乎每个包,错误就会直接消失。
有谁知道这个包装组合有什么问题吗?
\documentclass{scrartcl}
% load packages
\usepackage{ifluatex}
\ifluatex
\usepackage{fontspec}
\fi
\usepackage{adjustbox, amsmath, blindtext, datatool, fancybox, fixme, graphicx, marginnote, pgfplots}
\usepackage{imakeidx}
\usepackage{biblatex}
\usepackage{glossaries}
\usepackage{hyperref}
% load package for code code highlighting
\usepackage{minted}
% define Open Issue and corresponding List of Open Issues
\newcommand{\openissue}[2][Unlabeled]{%
\par%
{\refstepcounter{loicounter}%
\phantomsection% comment out if hyperref is noy used
\addcontentsline{loi}{figure}{%
\protect\numberline{%
\ifcsname c@chapter\endcsname%
\thechapter.%
\fi%
\theloicounter%
}{#1: #2}%
}%
\textbf{Open Issue -- #1:} #2}%
\par%
}
% define counter
\makeatletter
\ifcsname c@chapter\endcsname%
\newcounter{loicounter}[chapter]%
\else
\newcounter{loicounter}%
\fi%
\newcommand*{\listopenissuesname}{List of Open Issues}
\newcommand{\listofopenissues}{%
\ifcsname chapter\endcsname%
\chapter*{\listopenissuesname}%
\else%
\section*{\listopenissuesname}%
\fi%
\@starttoc{loi}%
}
\makeatother
\fxsetup{status = draft}
\makeglossaries
\makeindex
\begin{document}
% include open issues
\listofopenissues
% include list of corrections
\listoffixmes
% include indicies
\tableofcontents % Inhaltsverzeichnis einbinden
\end{document}
答案1
解决方案是使用,\usepackage{morewrites}
因为基本上任何已经加载的包都会抓取至少一个(写入)文件句柄,但文件句柄的数量仅限于 16 个寄存器,除非morewrites
加载,这会扩展寄存器的数量。
问题是:有些软件包真的需要吗?
\jobname.log
以下是该文件的简短摘录
\@dtl@write=\write3 % package datatool
\Verbatim@Outfile=\write4 % fancyvrb
\w@pgf@writea=\write5 % pgf
\blx@bcfout=\write6 % biblatex
\FV@OutFile=\write7 % fancyvrb again
\@xs@message=\write8 % xstring
\minted@code=\write9 % minted
\glswrite=\write10 % glossaries
\glo@main@file=\write11 % glossaries again
\noroom@idxfile=\write12 % imakeidx
\@outlinefile=\write13 % hyperref?
\tf@loi=\write14 % code itself with \addcontentsline{loi}
\tf@lox=\write15 % fixme package
! No room for a new \write.
\tf@toc=\write16 % Failure here
答案2
LaTeX 最多可以打开 16 个文件,但许多软件包都会打开这些文件。
我发现有 3 种针对此错误的建议解决方案:
- 使用 LuaLaTeX,其限制将是操作系统的限制(从未尝试过)
- 使用 morewrites 软件包(使用了一段时间,但后来遇到了错误)
- 使用 KOMA-Script 的 scrwfile 包(我目前的选择)
morewrites 和 scrwfile 采用了不同的方法来解决这个问题,但两者都以某种方式改变了 LaTeX 内核。深度魔法。