Проблема с fancyhdr, печатающим неправильное название раздела

Проблема с fancyhdr, печатающим неправильное название раздела

У меня проблема с in fancyhdrв сочетании с appendixпакетом. Проблема возникает - насколько я заметил - только когда я компилирую одностраничный документ. В twosideрежиме все, кажется, компилируется правильно.

Как вы можете видеть в MWE, заголовок основного раздела есть на каждой странице. На странице библиографии заголовок также находится в заголовке. Однако он остается там для следующих страниц документа, хотя вложения имеют свои собственные заголовки.

В twosideрежиме это не так.

Есть ли ошибка в моем коде или это ошибка в fancyhdrпакете appendix?

Я буду очень благодарен за любую помощь.


МВЭ

\documentclass[11pt]{article}
% \documentclass[11pt, twoside]{article}

\usepackage{geometry}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\usepackage[titletoc, title, header]{appendix}
\usepackage{biblatex}
\usepackage{lipsum}

\geometry{%
    a4paper,%
    top = 3cm,%
    bottom = 3.5cm,%
    inner = 2.5cm,%
    outer = 2.5cm,%
    nomarginpar,%
    showframe = false%
}

\fancypagestyle{general}{%
    \fancyhf{}                  % Clean fields
    \renewcommand{\headrulewidth}{0.4pt}
    \renewcommand{\footrulewidth}{0.4pt}
    \fancyhead[R]{\itshape\nouppercase{\leftmark}}
    \fancyfoot[R]{\thepage}
}

\let\printbibliographyCopy\printbibliography
\renewcommand{\printbibliography}{%
    \cleardoublepage%
    \addcontentsline{toc}{section}{\refname}%
    \pagenumbering{Roman}%
    \printbibliographyCopy%
    \cleardoublepage%
}

\AtBeginEnvironment{appendices}{%
    \let\oldSection\section%
    \renewcommand{\section}[1]{%
        \cleardoublepage%
        \oldSection{#1}%
    }%
}

\title{\texttt{fancyhdr} issue}
\author{Sam}
\date{}

\bibliography{refs}

\begin{document}
    \thispagestyle{general}%
    \pagestyle{general}%

    \maketitle

    \section{\lipsum[1][1]}
    \lipsum[1-3]

    \subsection{\lipsum[1][2]}
    \lipsum[4-6]

    \subsection{\lipsum[1][3]}
    \lipsum[7-10]

    \section{\lipsum[2][1]}
    \lipsum[1-3]

    \subsection{\lipsum[2][2]}
    \lipsum[4-6]

    \subsection{\lipsum[2][3]}
    \lipsum[7-10]

    \section{\lipsum[3][1]}
    \lipsum[1-3]

    \subsection{\lipsum[3][2]}
    \lipsum[4-6]

    \subsection{\lipsum[3][3]}
    \lipsum[7-13]\cite{Nobody06}

    \printbibliography

    \begin{appendices}
        \section{\lipsum[4][1]}
        \lipsum[1-3]

        \section{\lipsum[5][1]}
        \lipsum[1-3]

        \section{\lipsum[6][1]}
        \lipsum[1-3]
    \end{appendices}
\end{document}

Скриншоты

Нормальный раздел в режиме onesideилиtwoside Нормальный раздел


Ссылки в режиме onesideилиtwoside Рекомендации


Приложение в twosideрежиме Приложение в двухстороннем режиме


Приложение в onesideрежиме Приложение в одностороннем режиме

решение1

Тот же эффект можно воспроизвести в следующей упрощенной модели МВЭ.

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{fancyhdr}
\usepackage[titletoc, title, header]{appendix}
\usepackage{lipsum}


\fancypagestyle{general}{%
  \fancyhf{}%
  \renewcommand{\headrulewidth}{0.4pt}%
  \renewcommand{\footrulewidth}{0.4pt}%
  \fancyhead[R]{\itshape\nouppercase{\leftmark}}%
  \fancyfoot[R]{\thepage}%
}
\pagestyle{general}%

\begin{document}
  \section{\lipsum[1][1]}
  \lipsum[1-3]

  \begin{appendices}
    \section{\lipsum[4][1]}
    \lipsum[1-3]
  \end{appendices}
\end{document}

Проблема конкретно заключается в параметре, headerпереданном в appendix. Параметр описан в руководстве как

Добавляет имя (например, «Приложение») перед каждым приложением в заголовках страниц. Имя задается значением \appendixname. Обратите внимание, что это поведение по умолчанию для классов, имеющих главы.

Если опция включена, то \sectionmarkв начале среды будет выполнено следующее appendicesпереопределение

\def\sectionmark##1{%
  \if@twoside
    \markboth{\@formatsecmark@pp{#1}}{}
  \else
    \markright{\@formatsecmark@pp{#1}}{}
  \fi}

Обратите внимание, как различается определение между twosideи oneside. Это определение согласуется с обычными определениями в article.cls.

Когда fancyhdrзагружен, определение классов \sectionmarkin article-like всегда включает только \markbothнезависимо от настройки twoside/ oneside. Это всегда

\def\sectionmark##1{%
  \markboth{\MakeUppercase{%
    \ifnum \c@secnumdepth>\z@
      \thesection\hskip 1em\relax
    \fi
    ##1}}{}

Простое решение — не использовать опцию header, appendixпоскольку она, по-видимому, не была написана с учетом особенностейfancyhdr . Тогда вы не увидитеПриложениев заголовке, хотя. Если вы хотите сохранить это, вы можете пропатчить, appendicesкогда fancyhdrзагружается.

\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
\usepackage{fancyhdr}
\usepackage[titletoc, title, header]{appendix}
\usepackage{lipsum}


\fancypagestyle{general}{%
  \fancyhf{}%
  \renewcommand{\headrulewidth}{0.4pt}%
  \renewcommand{\footrulewidth}{0.4pt}%
  \fancyhead[R]{\itshape\nouppercase{\leftmark}}%
  \fancyfoot[R]{\thepage}%
}
\pagestyle{general}%

% patch appendices for fancyhdr
\makeatletter
\@ifpackageloaded{fancyhdr}
  {\apptocmd\appendices{%
     \if@chapter@pp
     \else
       \if@dohead@pp
         \def\sectionmark#1{\markboth{\@formatsecmark@pp{#1}}{}}%
       \fi
     \fi}}
  {}
\makeatother

\begin{document}
  \section{\lipsum[1][1]}
  \lipsum[1-3]

  \begin{appendices}
    \section{\lipsum[4][1]}
    \lipsum[1-3]
  \end{appendices}
\end{document}

В заголовке указано «Приложение A Quisque ullamcorper placerat ipsum».

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