Как использовать patchcmd для вставки \clearpage перед \chapter, чтобы избежать разрыва страницы

Как использовать patchcmd для вставки \clearpage перед \chapter, чтобы избежать разрыва страницы

Я хочу, чтобы мой документ не начинал новые страницы, когда есть новая глава. Мой код следующий:

\documentclass{scrbook}
\usepackage{etoolbox}

\patchcmd{\chapter}{\clearpage}{}{}
\begin{document}

\chapter{Preliminary}
first chapter

\chapter{Discussion}
second chapter

{\let \clearpage \relax\chapter{Advanced}}
final chapter
\end{document}

Этот код создаст новые страницы для первой и второй глав, но не для третьей.

Почему мой \patchcmd не работает?

решение1

Во-первых, в строке есть синтаксическая ошибка \patchcmd, поскольку пропущена пара фигурных скобок:

\patchcmd{<macro>}{<search>}{<replace>}{<success>}{<failure>}

В данном случае это не имеет никаких последствий, поскольку патч не выполняется, поэтому \beginон был поглощен, поскольку пятый аргумент был доставлен из-за сбоя.

Основная причина: \chapterмакрос не имеет \clearpageв своем заменяющем тексте, что

\scr@startchapter{chapter}

и это \scr@startchapterто, что должно быть исправлено

% scrbook.cls, line 4030:
\newcommand*{\scr@startchapter}[1]{%
  \if@openright\cleardoublepage\else\clearpage\fi
  \scr@ifundefinedorrelax{#1pagestyle}{}{%
    \ifstr{#1pagestyle}{}{}{%
      \thispagestyle{\@nameuse{#1pagestyle}}%
    }%
  }%
  \global\@topnum\z@
  \@afterindentfalse
  \expandafter\SecDef\csname @#1\expandafter\endcsname\csname @s#1\endcsname
}

Всегда проверяйте значение макроса, прежде чем пытаться его исправить.

Вероятно, вы захотите удалить и то , \cleardoublepageи другое \clearpage, поэтому

\makeatletter
\patchcmd{\scr@startchapter}
  {\if@openright\cleardoublepage\else\clearpage\fi}% search
  {}% replace
  {}{\ddt}
\makeatother

Мне кажется удобным добавить что-то вроде \ddt, которое будет предупреждать о неудаче с Undefined control sequence \ddt. Когда я уверен, что патч успешен, я удаляю его.

решение2

С классом KOMA-Script вы можете использовать \RedeclareSectionCommandего для установки style=sectionзаголовков глав. Так что нет необходимости что-либо патчить.

\documentclass{scrbook}[2015/10/03]

\RedeclareSectionCommand[
  style=section,
  indent=0pt
]{chapter}

\begin{document}
\chapter{Preliminary}
first chapter
\chapter{Discussion}
second chapter
\chapter{Advanced}
final chapter
\end{document}

введите описание изображения здесь

решение3

Вот решение. Нужно пропатчить\scr@startchapter

\documentclass{scrbook}
\usepackage{etoolbox}

\makeatletter
\if@openright
\patchcmd{\scr@startchapter}{\cleardoublepage}{}{}{}
\else
\patchcmd{\scr@startchapter}{\clearpage}{}{}{}
\fi
\makeatother
\begin{document}

\chapter{Preliminary}
first chapter

\chapter{Discussion}
second chapter

\end{document}

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