[i]makeidx 与 scrlayer-scrpage 以及标题中的制表符一起使用会导致“出现问题 - 可能缺少 \item。\end{theindex}”错误

[i]makeidx 与 scrlayer-scrpage 以及标题中的制表符一起使用会导致“出现问题 - 可能缺少 \item。\end{theindex}”错误

我尝试为我的一个文档添加索引。但是失败了,下面的 MWI 也失败了。神秘的错误消息是:

Something's wrong--perhaps a missing \item. \end{theindex}

MWI:

\documentclass{scrreport}

\RequirePackage{scrlayer-scrpage}

\cohead[
                {
                \begin{tabbing}
                               plain      \= header content
                \end{tabbing}
                }
                ]
                {
                               header content
                }

\usepackage{makeidx}
\usepackage{hyperref}

\makeindex

\begin{document}
                
Test \index{indexEntry}.

\printindex

\end{document}

问题似乎出在宏tabbing的纯样式条目中的环境中\cohead

tabbing用环境替换tabular环境消除了错误 - 但我仍然想知道实际的问题是什么。

此外,用 替换似乎\usepackage{makeidx}可以\usepackage{imakeidx}消除此 MWI 的错误 - 但对于我的完整文档却无效。

如果有人知道我在这里做错了什么 - 请告诉我。

谢谢,

约翰内斯

答案1

一、问题分析

环境theindex(由 插入\printindex)更改 的定义以\item执行其他操作,这基本上破坏了所有列表。在 LaTeX 中,列表比您想象的要多,包括tabbing。现在,当页面在更改的定义生效时结束时,它也会影响页眉和页脚(仅在那时排版),从而导致错误。产生错误的一个更简单的例子是

\documentclass{scrreprt}

\usepackage{scrlayer-scrpage}

\cohead{%
  \begin{tabbing}
    one \= two
  \end{tabbing}%
}

\begin{document}
                
Hello World!
\let\item\relax

\end{document}

甚至

\documentclass{article}

\begin{document}
                
\let\item\relax
\begin{tabbing}
  Hello World!
\end{tabbing}

\end{document}

该怎么办?

现在,我们可以小心地恢复标题中的 的原意\item,并消除错误。但是,我仍然不建议这样做,因为tabbing即使这样,环境也无法很好地处理不同标题部分的对齐。(\let\item\relax从上面的第一个示例中删除。标题是否设置\cohead在中心?)

相反,在我看来你确实想要一张桌子。

\documentclass[
    headlines=2,
  ]{scrreprt}

\usepackage{scrlayer-scrpage}
\usepackage{makeidx}
\usepackage{hyperref}

\usepackage{showframe}

\lohead*{left text for alignment and such}
\rohead*{right text for alignment and such}
\cohead*{%
  \strut\smash{%
    \begin{tabular}[b]{ l l }
      one & two \\
      three & four \\
    \end{tabular}%
  }%
}

\makeindex

\begin{document}
                
Test\index{indexEntry}.

\printindex

\end{document}

MWE 输出

关于此的一些说明:

  • showframe只是为了让我们能看到类型区域。

  • 用来headlines=2使页眉足够高以容纳两行文本。

  • 使用tabular可选参数指定与标题其余部分的垂直对齐([b]用于底部对齐)。

  • scrlayer-scrpage将标题的各个部分放在 中\parbox,默认情况下, 垂直居中其内容并围绕其内容(这会使[b]之前的内容变得毫无用处)。出于某种原因,没有提供更改此设置的选项。为了解决这个问题而不进入包的内部,我使用了以下技巧:我删除了 表格的高度\smash并添加了\strut(零宽度规则)。也就是说, 的内容\cohead现在具有 的宽度tabular和 的高度\strut,从而实现了所需的对齐。

    请注意,这也意味着如果您的标题太高,LaTeX 无法再警告您(因为我们删除了该高度)。即使没有,您也不会收到警告headlines=2。您必须自己检查高度。

答案2

我不确定tabbing那个位置在做什么(它使 LaTeX 发出有关头部高度的警告)。

您可以通过指定将索引中的第一页样式设置为 使用的样式来解决此问题scrlayer-scrpage

\documentclass{scrreport}

\usepackage{scrlayer-scrpage}
\usepackage{imakeidx}
\usepackage{hyperref}

\cohead[%
  \begin{tabbing}
  plain \= header content
  \end{tabbing}%
]{%
  header content%
}


\makeindex
\indexsetup{firstpagestyle=plain.scrheadings}

\begin{document}

\chapter{whatever}

Test\index{indexEntry}.

\printindex

\end{document}

但头部高度的问题仍有待解决。

Package scrlayer-scrpage Warning: \headheight to low.
(scrlayer-scrpage)                At least 58.8pt needed,
(scrlayer-scrpage)                but only 17.0pt found.
(scrlayer-scrpage)                I'll enlarge \headheight, for further
(scrlayer-scrpage)                processing, but you should do this yourself,
(scrlayer-scrpage)                e.g., setting typearea's option
(scrlayer-scrpage)                `headheight=58.8pt'.
(scrlayer-scrpage)                I'll also decrease \topmargin on input line 26.

相关内容