我怎样才能让 \chapter(或其他命令)不执行任何操作?

我怎样才能让 \chapter(或其他命令)不执行任何操作?

我尝试过renewcommand这样的:

\renewcommand\chapter{}

但是当我\chapter{test}在文档中写入时,仍然有文本“测试”,只是没有任何格式。

答案1

只需使用\renewcommand{\chapter}{}就会将移动参数留在流输入中,并对其进行排版,例如

\chapter{foo}会产生\chapter{foo}参数不再是参数,而是一个排版文本,即将foo被打印。

\chapter本身没有参数,但会分支到\@chapter\@schapter,具体取决于版本\chapter\chapter*

带星号的章节使用\@schapter,有一个参数,而\@chapter有一个可选参数和一个强制参数。(对于bookreport类,语句为真,memoir略有不同。)我将提出两种解决方案:更简单的解决方案\RenewDocumentCommand和更基本的解决方案,即捕获\@chapter\@chapter

这在主体中绝对不执行任何操作document:它吞噬了\chapter*等类型的宏及其宏。

它捕获带星号的版本 (s)、可选参数 (o) 和参数mandatory,然后让它什么都不做,所以甚至\tableofcontents不会打印标题(它使用\chapter*{\contentsname}

\documentclass{book}

\usepackage{xparse}


\RenewDocumentCommand{\chapter}{som}{%
}

\begin{document}
\tableofcontents
\chapter{Foo}
\end{document}

这是一种不使用的方法xparse

\documentclass{book}


\makeatletter

%\def\chapter%

% branches into \@chapter and \@schapter

\renewcommand{\@chapter}[2][]{%
}
\renewcommand{\@schapter}[1]{%
}
\makeatother

\begin{document}
\tableofcontents
\chapter[foo]{Foobar}
\end{document}

\let\chapter\relax当然使用也不是一个好主意!

现在:让某些命令不执行任何操作的一般问题取决于宏的类型。无参数宏,例如,\foo可以使用 来静音\let\foo\relax

答案2

在有 s 的常规文档类下\chapter,你必须捕获三个可能的论点:

  1. *,例如\chapter*{<title>}

  2. 可选参数[.. ],例如\chapter[<toc>]{<title>}

  3. 强制参数{... },如同\chapter{<title>}

请注意,上述三个参数可以混合使用,如\chapter*[<toc>]{<title>}。要执行\chapter无操作,您可以使用以下任一方法:

  1. xparse

    \usepackage{xparse}
    \RenewDocumentCommand{\chapter}{s o m}{}
    \RenewDocumentCommand{\tableofcontents}{}{}
    \RenewDocumentCommand{\listoffigures}{}{}
    \RenewDocumentCommand{\listoftables}{}{}
    
  2. LaTeX2e 宏重新定义:

    \makeatletter
    \renewcommand{\chapter}{\@ifstar\@chapter\@chapter}
    \renewcommand{\@chapter}[2][]{}
    \renewcommand{\tableofcontents}{}% or \let\tableofcontents\relax
    \renewcommand{\listoffigures}{}% or \let\listoffigures\relax
    \renewcommand{\listoftables}{}% or \let\listoftables\relax
    \makeatother
    

在这两种情况下,可能还必须抑制与 ToC 相关的命令,以避免设置(甚至是虚构的)ToC。


memoir使用四个可能的参数:

  1. *,例如\chapter*{<title>}

  2. 第一个可选参数[. ],例如\chapter[<toc>]{<title>}

  3. 第二个可选参数[.. ],例如\chapter[<toc>][<header>]{<title>}

  4. 强制参数{... },如同\chapter{<title>}

要覆盖这些,需要进行与上面提到的类似的设置:

  1. xparse

    \usepackage{xparse}
    
    \RenewDocumentCommand{\chapter}{s o o m}{}
    \RenewDocumentCommand{\tableofcontents}{s}{}
    \RenewDocumentCommand{\listoffigures}{s}{}
    \RenewDocumentCommand{\listoftables}{s}{}
    
  2. LaTeX2e 宏重新定义:

    \makeatletter
    \renewcommand{\chapter}{\@ifstar\@chapter\@chapter}
    \renewcommand{\@chapter}[1][]{\@@chapter}
    \newcommand{\@@chapter}[2][]{}
    \renewcommand{\tableofcontents}{\@ifstar{}{}}
    \renewcommand{\listoffigures}{\@ifstar{}{}}
    \renewcommand{\listoftables}{\@ifstar{}{}}
    \makeatother
    

相关内容