修正定義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 腳本 ( 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並使用 pagestyle scrheadings,類似於 Gonzalo 建議的那樣。(在我看來,3.12 版本不再需要使用 package scrpage2,因為scrlayer-scrpage它是向下相容的,只要你從未使用過 的內部指令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 年 12 月下旬以來已知的錯誤,並在實驗版本中修復。當我一月初遇到這個錯誤時,我必須為我自己的原始程式碼修補它,這是我的補丁:

\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不再是有問題的版本)並且該補丁將不會執行您沒有執行的任何操作再次擺弄你的遺留資源。

相關內容