tikz 外部化和 renewindex

tikz 外部化和 renewindex

我对名为 renewindex 的类遇到了一个奇怪的问题,这个调用破坏了( )langscibook的外部化功能。tikzforest

\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}

相关内容