Como usar o patchcmd para inserir \clearpage antes de \chapter para evitar quebra de página

Como usar o patchcmd para inserir \clearpage antes de \chapter para evitar quebra de página

Quero que meu documento não inicie novas páginas quando houver um novo capítulo. Meu código é o seguinte:

\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}

Este código iniciará novas páginas para o primeiro e segundo capítulos, mas não para o terceiro.

Por que meu \patchcmd não está funcionando?

Responder1

Primeiro, você tem um erro de sintaxe na \patchcmdlinha, porque está faltando um par de chaves:

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

Isso não tem consequências neste caso, porque o patch falha, então \beginisso foi absorvido quando o quinto argumento foi entregue por causa da falha.

Principal motivo: a \chaptermacro não possui \clearpagetexto substituto, que é

\scr@startchapter{chapter}

e é \scr@startchapterisso que deve ser corrigido

% 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
}

Sempre verifique o significado de uma macro antes de tentar corrigi-la.

Você provavelmente deseja remover ambos \cleardoublepagee \clearpage, então

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

Acho conveniente adicionar algo como \ddt, que alertará sobre falhas com Undefined control sequence \ddt. Quando tenho certeza de que o patch foi bem-sucedido, eu o removo.

Responder2

Com uma classe KOMA-Script você pode usar \RedeclareSectionCommandpara definir style=sectionos títulos dos capítulos. Portanto, não há necessidade de corrigir nada.

\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}

insira a descrição da imagem aqui

Responder3

Aqui está uma solução. É preciso corrigir\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}

informação relacionada