重新定义 \chapter{...} 命令时出现问题

重新定义 \chapter{...} 命令时出现问题

我想将 的定义更改\chapter[...]{...}\chapter[...]{...‎}‎‎‎\thispagestyle{empty}。为此,我使用以下代码:

\documentclass{book}
\let\origchapter\chapter
\renewcommand{\chapter}[2][]{%
\origchapter[#1]{#2}
\thispagestyle{empty}
}
\begin{document}
\tableofcontents
\chapter{Bla Bla}
Some text ...
\newpage
\chapter{Bla Bla}
\end{document}

一切都正常,但是当我\tableofcontents‎在 ‎‎ ‎‎‎ 之后\begin{‎document},我会收到以下错误:

! LaTeX Error: Something's wrong--perhaps a missing \item.‎‎

我做错了什么?

答案1

对 Werner 的回答进行补充。

未知\chapter

的定义\chapter可能不包含\thispagestyle{empty},因为它隐藏在稍后调用的宏中,或者此操作看起来不同。然后,​​像 Werner 的答案中那样的修补将失败,因为{plain}的定义文本中缺少\chapter。因此,以下示例提供了一个通用解决方案,它\chapter使用星号形式和可选参数重新定义:

\documentclass{report}

\makeatletter
\newcommand*{\saved@chapter}{}
\let\saved@chapter\chapter
\renewcommand*{\chapter}{%
  \begingroup
  \toks@{\endgroup\saved@chapter}%
  \@ifstar{%
    \toks@\expandafter{\the\toks@*}%
    \final@chapter
  }{\next@chapter}%
}
\newcommand*{\final@chapter}[1]{%
  \the\toks@{#1}%
  \thispagestyle{empty}%
}
\newcommand*{\next@chapter}{%
  \@ifnextchar[{\opt@chapter}{\final@chapter}%
}
\newcommand*{\opt@chapter}{}
\def\opt@chapter[#1]{%
  \toks@\expandafter{\the\toks@[{#1}]}%
  \final@chapter
}
\makeatother

\begin{document}
\tableofcontents
\chapter*{Chapter with star}
\chapter{Chapter without optional argument}
\chapter[Chapter's optional argument]{Chapter with optional argument}
\end{document}

KOMA-Script

该类KOMA-Script使用以下定义\chapter

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
  \thispagestyle{\chapterpagestyle}%
  \global\@topnum\z@
  \@afterindentfalse
  \secdef\@chapter\@schapter
}

它缺少plain,因为它被 替换了\chapterpagestyle。但是,这个宏可以重新定义,不需要重新定义\chapter

\renewcommand*{\chapterpagestyle}{empty}

班级memoir

章节memoir支持特殊的页面样式chapter

\newcommand\chapter{%
  \ifartopt\par\@nameuse{chapterblock}\else
    \clearforchapter
    \thispagestyle{chapter}
    \global\@topnum\z@
  \fi
  \m@mindentafterchapter
  \@ifstar{\@m@mschapter}{\@m@mchapter}}

可以通过以下方式更改页面样式\aliaspagestyle

\aliaspagestyle{chapter}{empty}

完整示例

以下示例涵盖五种情况:

  • \chapter不可用。
  • 班级memoir
  • KOMA-Script课程。
  • 通过 进行修补etoolbox\patchcmd参见 Werner 的回答)。
  • 的通用重新定义\chapter

代码:

\documentclass{scrreprt}

\makeatletter
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname chapter\endcsname\relax
  \wlog{* No \string\chapter.}%
\else
  \@ifclassloaded{memoir}{%
    % Class memoir
    \aliaspagestyle{chapter}{empty}%
    \wlog{* Chapter page style redefined via \string\aliaspagestyle.}%
  }{%
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname chapterpagestyle\endcsname\relax
      % Patching with etoolbox
      \RequirePackage{etoolbox}[2010/09/12]%
      \patchcmd{\chapter}{plain}{empty}{%
        \wlog{* Chapter patched by \string\patchcmd.}%
      }{%
        % Generic case
        \newcommand*{\saved@chapter}{}%
        \let\saved@chapter\chapter
        \renewcommand*{\chapter}{%
          \begingroup
          \toks@{\endgroup\saved@chapter}%
          \@ifstar{%
            \toks@\expandafter{\the\toks@*}%
            \final@chapter
          }{\next@chapter}%
        }
        \newcommand*{\final@chapter}[1]{%
          \the\toks@{#1}%
          \thispagestyle{empty}%
        }
        \newcommand*{\next@chapter}{%
          \@ifnextchar[{\opt@chapter}{\final@chapter}%
        }
        \newcommand*{\opt@chapter}{}%
        \def\opt@chapter[#1]{%
          \toks@\expandafter{\the\toks@[{#1}]}%
          \final@chapter
        }%
        \wlog{* Chapter redefined.}%
      }%
    \else
      % KOMA-Script classes
      \renewcommand*{\chapterpagestyle}{empty}%
      \wlog{* Chapter page style set by redefining \string\chapterpagestyle.}%
    \fi
  }%
\fi
\makeatother

\begin{document}
\tableofcontents
\chapter*{Chapter with star}
\chapter{Chapter without optional argument}
\chapter[Chapter's optional argument]{Chapter with optional argument}
\end{document}

答案2

你使用的参数不是最佳的,因为在没有可选参数的情况下\chapter{<stuff>}默认为,而不是。最好使用\chapter[<stuff>]{<stuff>}\chapter[]{<stuff>}\chapteretoolbox

\documentclass{book}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\patchcmd{\chapter}% <cmd>
  {plain}% <search>
  {empty}% <replace>
  {}{}% <success><failure>
\begin{document}
\tableofcontents
\chapter{Bla Bla}
Some text ...
\newpage
\chapter{Bla Bla}
\end{document}

这将搜索plainin\chapter并将其更改为。 inempty的原始定义\chapterbook.cls是:

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}

相关内容