修复定义headings

修复定义headings

使用如下最小文档

\documentclass{scrartcl}
\pagestyle{headings}
\begin{document}
\section{Introduction}
\end{document}

我收到以下错误latex filename.tex

! 额外\其他。
\@sect ...sname}{\scr@ds@tocentry}\fi \fi \else
                                              \def \@svsechd {#6{\hskip ...
l.49 \section{简介}

有人能帮忙查明问题出在哪里吗?

  • 如果我将文档类更改为文章,它可以正常工作
  • 如果我删除 \pagestyle{headings},它就可以正常工作
  • 如果我将标题改为空,它就可以正常工作

版本:

pdfTeX 3.1415926-2.5-1.40.14 (TeX Live 2013/Arch Linux)
kpathsea version 6.1.1
...
Compiled with libpng 1.6.10; using libpng 1.6.10
Compiled with zlib 1.2.8; using zlib 1.2.8
Compiled with poppler version 0.24.5

和 KOMA-Script ( scrartcl.cls)

%%% From File: $Id: scrkernel-version.dtx 1560 2013-12-19 07:13:30Z mjk $

答案1

就像补充贡萨洛的回答。您遇到了 KOMA-Script 版本 3.12 的一个已知错误。

参见(可惜只有德语)KOMA-Script 3.12 中出现的问题和挑战

scrartcl:
[…]
Wenn man den Seitenstil headings aktiviert, wird man mit Fehlern wegen eines \fi zu viel
bombadiert.
Workaround: Paket scrlayer-scrpage (oder notfalls scrpage2) laden und Seitenstil
scrheadings verwenden.
Hinweis: Der Fehler ist in der experimentellen Release behoben.

这意味着您观察到的错误已在实验版本中被删除,您可以从页面下载该版本,该页面的链接位于“experimentellen Release”字样后面,但同样是德语。幸运的是,Markus Kohm 为此页面创建了一个英语配套文档:使用最新的 KOMA-Script 和 TeX Live、MacTeX 或 MiKTeX

如果不使用这个实验版本,您应该加载(KOMA-Script)包scrlayer-scrpage并使用pagestylescrheadings,类似于 Gonzalo 建议的。(在我看来,对于 3.12 版本,不再需要使用包scrpage2,因为scrlayer-scrpage它向下兼容,只要您从未使用过的内部命令scrpage2。)

答案2

作为Speravir 的答案指出,这是一个错误;headings页面样式应该与 KOMA 类一起使用。一个可能的解决方法是加载scrpage2包并更改为useheadings样式:

\documentclass{scrartcl}
\usepackage{scrpage2}
\pagestyle{useheadings}
\begin{document}
\section{Introduction}
\end{document}

该文件第206页scrguien提到这一点:

该包scrpage2主要用于使用提供的样式或定义自己的样式。但是,可能还需要切换回文档类提供的样式。这似乎应该用 来完成\pagestyle{headings},但这样做的缺点是,稍后将讨论的命令\automark\manualmark无法按预期运行。因此,应该使用 v\pagestyle{useheadings}` 切换回原始样式,它可以自动为手动和自动运行标题选择正确的页面样式。

答案3

使用headings会产生以下错误:

! Extra \else.
\@sect ...sname }{\scr@ds@tocentry }\fi \fi \else 
                                                  \def \@svsechd {#6{\hskip ...
l.6 \section{Introduction}

? 

正如 Speravir 的回答中所述,这是该类的当前(非实验)版本中的一个错误。如果您更喜欢使用标准headings而不是 Gonzalo Medina 的回答中的解决方法,您可能想尝试以下修复。

修复定义headings

下面的重新定义似乎解决了这个问题。标记的行在原始行中MODIFIED包含一个额外的内容,而在其他使用中则不存在。修复修改了该行以删除与宏的其他使用一致的内容。\fi\MakeMarkcase\fi

\documentclass{scrartcl}
\usepackage{kantlipsum}
\makeatletter
  \renewcommand*{\ps@headings}{\let\@mkboth\markboth
    \renewcommand*{\@evenhead}{%
      \set@tempdima@hw\hss\hb@xt@ \@tempdima{\vbox{%
          \hb@xt@ \@tempdima{{\headfont\strut\leftmark\hfil}}%
          \if@hsl \vskip 1.5\p@ \hrule \fi}}}%
    \renewcommand*{\@oddhead}{%
      \set@tempdima@hw\hb@xt@ \@tempdima{\vbox{%
          \hb@xt@ \@tempdima{{\headfont\hfil\strut\rightmark
              \if@twoside\else\hfil\fi}}%
          \if@hsl \vskip 1.5\p@ \hrule \fi}}\hss}%
    \renewcommand*{\@evenfoot}{%
      \set@tempdima@hw\hss\hb@xt@ \@tempdima{\vbox{%
          \if@fsl \hrule \vskip 3\p@ \fi
          \hb@xt@ \@tempdima{{\pagemark\hfil}}}}}%
    \renewcommand*{\@oddfoot}{%
      \set@tempdima@hw\hb@xt@ \@tempdima{\vbox{%
          \if@fsl \hrule \vskip 3\p@ \fi
          \hb@xt@ \@tempdima{{\hfil\pagemark
              \if@twoside\else\hfil\fi}}}}\hss}%
    \renewcommand*{\sectionmark}[1]{%
      \if@twoside\expandafter\markboth\else\expandafter\markright\fi
      {\MakeMarkcase{\ifnumbered{section}{\sectionmarkformat}{}##1}}{}}% MODIFIED
    \renewcommand*{\subsectionmark}[1]{%
      \if@twoside
        \markright{%
          \MakeMarkcase{\ifnumbered{subsection}{\subsectionmarkformat}{}##1}%
        }%
      \fi
    }%
  }%
\makeatother
\pagestyle{headings}

\begin{document}
\section{Introduction}
\kant[1]
\subsection{Subsection}
\kant[2]
\section{Another Section}
\kant[3]
\section{Yet Another Section}
\kant[4]
\subsection{Another Subsection}
\kant[5]
\end{document}

结果

标题

答案4

正如已经解释过的,这是一个KOMA 3.12开发人员自 2013 年 12 月底以来就知道的漏洞,并在实验版本中进行了修复。由于我在 1 月初就遇到了这个漏洞,因此我不得不为自己的源代码进行修补,以下是我的修补程序:

\pagestyle{headings}% must be before the patch
\makeatletter
\def\buggysectionmark #1{% KOMA 3.12 as released to CTAN December 2013
    \if@twoside\expandafter\markboth\else\expandafter\markright\fi
    {\MakeMarkcase{\ifnumbered{section}{\sectionmarkformat\fi}{}#1}}{}}
\ifx\buggysectionmark\sectionmark
\def\sectionmark #1{%
    \if@twoside\expandafter\markboth\else\expandafter\markright\fi
    {\MakeMarkcase{\ifnumbered{section}{\sectionmarkformat}{}#1}}{}}
\fi
\makeatother

这个想法是,一旦你的安装有了下一个版本,KOMAscript该问题将会得到修复,补丁将不会做任何事情(因为测试\ifx将检测到\sectionmark不再是有缺陷的版本),并且补丁将不会做任何事情,你不必再次摆弄你的遗留源。

相关内容