Cómo usar patchcmd para insertar \clearpage antes de \chapter para evitar romper la página

Cómo usar patchcmd para insertar \clearpage antes de \chapter para evitar romper la página

Quiero que mi documento no comience nuevas páginas cuando haya un nuevo capítulo. Mi código es el siguiente:

\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á nuevas páginas para el primer y segundo capítulo, pero no para el tercero.

¿Por qué mi \patchcmd no funciona?

Respuesta1

Primero, tienes un error de sintaxis en la \patchcmdlínea porque te falta un par de llaves:

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

Esto no tiene consecuencias en este caso, porque el parche falla, por lo \beginque se absorbió como el quinto argumento que se entrega debido a la falla.

Razón principal: la \chaptermacro no tiene \clearpageningún texto de reemplazo, lo cual es

\scr@startchapter{chapter}

y es \scr@startchapterque hay que parchearlo

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

Siempre verifique el significado de una macro antes de intentar parchearla.

Probablemente quieras eliminar ambos \cleardoublepagey \clearpage, entonces

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

Me parece conveniente agregar algo como \ddt, que advertirá sobre fallas con Undefined control sequence \ddt. Cuando estoy seguro de que el parche funciona correctamente, lo elimino.

Respuesta2

Con una clase KOMA-Script puede utilizarla \RedeclareSectionCommandpara configurar style=sectionlos títulos de los capítulos. Por lo que no es necesario parchear 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}

ingrese la descripción de la imagen aquí

Respuesta3

Aquí hay una solución. Uno necesita parchear\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}

información relacionada