使用如下最小文档
\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
不再是有缺陷的版本),并且补丁将不会做任何事情,你不必再次摆弄你的遗留源。