新しい章があるときにドキュメントが新しいページを開始しないようにしたいです。コードは次のとおりです。
\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}
このコードは、第 1 章と第 2 章では新しいページを開始しますが、第 3 章では開始しません。
\patchcmd が動作しないのはなぜですか?
答え1
\patchcmd
まず、中括弧のペアが欠落しているため、行に構文エラーがあります。
\patchcmd{<macro>}{<search>}{<replace>}{<success>}{<failure>}
この場合、パッチが失敗したため、影響はありません。そのため、\begin
失敗のために 5 番目の引数が配信されると、それが吸収されました。
主な理由:\chapter
マクロの置換テキストに「no」が含まれていない\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}