С минимальным документом, таким как
\documentclass{scrartcl}
\pagestyle{headings}
\begin{document}
\section{Introduction}
\end{document}
Я получаю следующую ошибкуlatex filename.tex
! Дополнительно \else. \@sect ...sname }{\scr@ds@tocentry }\fi \fi \else \def \@svsechd {#6{\hskip ... л.49 \section{Введение}
Может ли кто-нибудь помочь определить, в чем может быть проблема?
- Если я изменю класс документа на article, то все будет работать нормально.
- Если я уберу \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», но она снова на немецком языке. К счастью, Маркус Ком создал для этой страницы английский компаньон:Использование самой последней версии KOMA-Script с TeX Live, MacTeX или MiKTeX.
Без использования этой экспериментальной версии вам следует загрузить пакет (KOMA-Script) scrlayer-scrpage
и использовать pagestyle scrheadings
, аналогично тому, как предложил Гонсало.(На мой взгляд, начиная с версии 3.12, больше нет необходимости использовать package scrpage2
, поскольку scrlayer-scrpage
она совместима с предыдущими версиями, при условии, что вы никогда не использовали внутренние команды package scrpage2
.)
решение2
КакОтвет Сперавирауказывает, что это ошибка; 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 года и которая была исправлена в экспериментальном релизе. Поскольку я сам столкнулся с этой ошибкой в начале января, мне пришлось пропатчить ее для собственных источников, и вот мой патч:
\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
это больше не тот релиз, в котором есть ошибка), и патч ничего не сделает, и вам не придется снова возиться с вашими устаревшими исходниками.