Исправление определенияheadings

Исправление определенияheadings

С минимальным документом, таким как

\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это больше не тот релиз, в котором есть ошибка), и патч ничего не сделает, и вам не придется снова возиться с вашими устаревшими исходниками.

Связанный контент