我对名为 renewindex 的类遇到了一个奇怪的问题,这个调用破坏了( )langscibook
的外部化功能。tikz
forest
\documentclass{scrbook}
\usepackage{tikz}
\usepackage{index}
\AtBeginDocument{
\makeindex
\renewindex{default}{adx}{and}{lsNameIndexTitle}
}
\usepackage[external]{forest}
% All externalized graphics go go the \externaldirectory
\tikzexternalize[prefix=external-figures/]
\useforestlibrary{linguistics}
\forestapplylibrarydefaults{linguistics}
\begin{document}
\begin{figure}
\centerline{
\begin{forest}
[V
[NP [er] ]
[V
[NP
[Det [das] ]
[N [Buch] ] ]
[V
[NP
[Det [dem] ]
[N [Mann] ] ]
[V [gibt] ] ] ] ]
\end{forest}
}
\end{figure}%
\end{document}
如果取消注释该\renewindex
行,则一切都正常。
答案1
据我所知,如果您删除\AtBeginDocument{...}
makeindex 代码周围的代码,它就会起作用。您面临的问题就是未定义的索引“default”。从外部化图形的日志文件中:
! LaTeX Error: Index type `default' not defined.
\makeindex
定义此索引类型默认值。但是 tikz 不会处理它,因为您在文档开头就做了这件事。
如果您确实需要尽可能晚地执行此操作,请考虑使用该etoolbox
包并切换到:
\AtEndPreamble{
\makeindex
\renewindex{default}{adx}{and}{lsNameIndexTitle}
\tikzexternalize[prefix=external-figures/]
}
你的 MWE(可编译并工作)将如下所示:
\documentclass{scrbook}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{index}
\AtEndPreamble{
\makeindex
\renewindex{default}{adx}{and}{lsNameIndexTitle}
\tikzexternalize[prefix=external-figures/]
}
\usepackage[external]{forest}
% All externalized graphics go go the \externaldirectory
\useforestlibrary{linguistics}
\forestapplylibrarydefaults{linguistics}
\begin{document}
\begin{figure}
\centerline{
\begin{forest}
[V
[NP [er] ]
[V
[NP
[Det [das] ]
[N [Buch] ] ]
[V
[NP
[Det [dem] ]
[N [Mann] ] ]
[V [gibt] ] ] ] ]
\end{forest}
}
\end{figure}%
\end{document}
答案2
\tikzexternalize
执行 LaTeX\nofiles
来抑制辅助文件的生成,因为“这些文件的生成不是线程安全的” [pgfcoreexternal.code.tex] 并且\nofiles
执行\let\makeindex\relax
和\let\makeglossary\relax
。
因此,\tikzexternalize
在加载之后index.sty
但在执行之前执行\makeindex
将会失败。(如前所述)在这个答案中,索引default
永远不会被定义,因此重新定义它将是一个错误。)OP的示例属于此类,因为它\tikzexternalize
在加载后执行index.sty
,并\makeindex
在文档开始时执行。上述答案中提出的两种解决方案显然避免了不希望出现的情况。
也可以在不改变加载/执行顺序的情况下解决问题。这有时可能很方便:
\let\origmakeindex\makeindex
\tikzexternalize[prefix=external-figures/]
\let\makeindex\origmakeindex
顺便说一句,PGF 的作者意识到执行\nofiles
可能会对某些文档造成问题。PGF 可防止与 发生冲突glossary.sty
(\renewcommand
如果\makeglossary
发生冲突,则显然会失败\makeglossary
)\let
,\relax
但遗憾的是,保护机制不会自动覆盖index.sty
。
另一个细节:一个更简单(不起作用)的例子,它既不使用也不scrbook
使用forest
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\usepackage{index}
\AtBeginDocument{
\makeindex
\renewindex{default}{adx}{and}{lsNameIndexTitle}
}
\tikzexternalize[prefix=external-figures/]
\begin{document}
\begin{tikzpicture}
\node{A};
\end{tikzpicture}
\end{document}