如何清除先前使用 \AtEndDocument 声明的内容?

如何清除先前使用 \AtEndDocument 声明的内容?

我正在使用一个类文件,该文件用于\AtEndDocument在文档末尾包含目录。但是,我想覆盖原始文件\AtEndDocument并强制文档完全不包含目录没有必须更改文档类别。我该如何实现?

不包含以下内容的文件.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{docclass}[2009/07/02 Whitepaper Style]
\DeclareOption{a5paper}{\OptionNotUsed}
\DeclareOption{b5paper}{\OptionNotUsed}
\DeclareOption{letterpaper}{\OptionNotUsed}
\DeclareOption{legalpaper}{\OptionNotUsed}
\DeclareOption{executivepaper}{\OptionNotUsed}
\DeclareOption{landscape}{\OptionNotUsed}
\DeclareOption{twoside}{\OptionNotUsed}
\DeclareOption{draft}{\OptionNotUsed}
\DeclareOption{notitlepage}{\OptionNotUsed}
\DeclareOption{openright}{\OptionNotUsed}
\DeclareOption{leqno}{\OptionNotUsed}
\DeclareOption{fleqn}{\OptionNotUsed}
\DeclareOption{openbib}{\OptionNotUsed}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{report}}
\ProcessOptions
%%
\LoadClass[a4paper,11pt,oneside,onecolumn,final,openany,chapterprefix=false]{scrreprt}
\RequirePackage[T1]{fontenc}
\RequirePackage[english]{babel}
\RequirePackage[english]{varioref}
\RequirePackage[ansinew]{inputenc}
\RequirePackage[pdftex]{graphicx}
\RequirePackage{wrapfig}
\RequirePackage{color}
\RequirePackage{float}
\RequirePackage{datetime}
\RequirePackage{fancyvrb}
\RequirePackage{fancyhdr}
\RequirePackage{ae}
\RequirePackage{bbding}
\RequirePackage{amsmath}
\RequirePackage[hang,flushmargin]{footmisc}
\RequirePackage[
    pdftex,
    colorlinks=true,
    linkcolor=black,
    citecolor=black,
    urlcolor=black,
    menucolor=black,
    filecolor=black,
    breaklinks=false,
    bookmarksnumbered=false,
    pdfpagelayout=OneColumn,
    pdfstartview=FitH
    ]{hyperref}

%% more commands

\fontfamily{cmss}

\AtBeginDocument{%
  \hypersetup{%
    pdftitle={\HREFpdftitle},
    pdfauthor={\HREFpdfauthor},
    pdfsubject={\HREFpdfsubject},
    pdfkeywords={\HREFpdfkeywords},
    pdfcreator={\HREFpdfcreator}
  }%
}

\AtEndDocument{%
    \newpage\pdfbookmark[0]{Contents}{TOC}\tableofcontents\thispagestyle{fancy}
}

该文件:

\documentclass{docclass}
\begin{document}
\section*{Section 1}
foo bar baz
\section*{Section 2}
lorem ipsum ...
\end{document}

笔记:我曾尝试简单地将其包含\AtEndDocument{}在文档中,但这并没有产生预期的结果。

答案1

\makeatletter
\global\let\@enddocumenthook\@empty
\makeatother

将清除保存添加的标记的宏\AtEndDocument

\AtEndDocument{} 

不起作用,因为你可以多次调用此命令添加对现有钩子的声明(这样不添加任何内容,但保留现有的声明)

答案2

这是一个通用的解决方案。由于 中可能存在不可扫描的标记\@enddocumenthook,因此我首先检查可扫描性,然后再尝试从标记列表中过滤测试标记\@enddocumenthook。这个解决方案并不简单。

您可以\@enddocumenthook在 (1) 处释放并执行\show\y以查看最后的示例是否按要求运行。

如果测试标记在 中不唯一\@enddocumenthook,则可能会发生错误匹配。为此,我引入了一个新命令\NewAtEndDocument,用于\AtEndDocument在 中过滤标记时代替\@enddocumenthook

必须将令牌按其被包含的同一批物品过滤掉\@enddocumenthook

\documentclass[a4paper]{article}
\usepackage{catoptions}
\newletcs\ltsrelax\relax
\robust@def\NewAtEndDocument#1{%
  \g@addto@macro\@enddocumenthook{\ltsrelax#1\ltsrelax}%
}
\robust@def\FilterAtEndDocumentHook{%
  \begingroup
  \endlinechar\m@ne
  \edef\reserved@a##1{%
    \def##1\detokenize{macro}:->####1\ltsrelax{%
      \def\string\reserved@a{####1}%
    }%
    \edef##1{##1\meaning\@enddocumenthook\ltsrelax}%
  }%
  \reserved@a\reserved@a
  \makeatletter\everyeof{\noexpand}%
  \scantokens\expandafter{\reserved@a}\relax
  \ifx\@enddocumenthook\reserved@a\else
    \endgroup
    \@latex@error{\noexpand\@enddocumenthook is no longer scannable}\@ehd
  \fi
  \cpt@testst\Filt@rAtEndDocumentHook
}
\robust@def\Filt@rAtEndDocumentHook#1{%
  \def\filter@remove##1{%
    \xifinsetFT{##1}{\cptoxdetok\@enddocumenthook}{}{%
      \def\reserved@a####1##1####2\filter@nil{%
        \def\@enddocumenthook{####1####2}%
        \ifboolFT{cpt@st}{}{\filter@remove{##1}}%
      }%
      \expandafter\reserved@a\detokenize\expandafter
        {\@enddocumenthook}\filter@nil
    }%
  }%
  \expandafter\filter@remove\expandafter{\detokenize{\ltsrelax#1\ltsrelax}}%
  \cptscantokens\@enddocumenthook
  \postgroupdef\@enddocumenthook\endgroup
}

% Examples:
\NewAtEndDocument{\def\x#1{#1}}
\NewAtEndDocument{\def\y#1{#1}}
\NewAtEndDocument{\def\x#1{#1}}
% The starred variant of \FilterAtEndDocumentHook will remove all occurrences of
% the test token ('\def\x#1{#1}' in the following example). The non-starred form
% will remove only one occurrence.
\FilterAtEndDocumentHook*{\def\x#1{#1}}
% \@enddocumenthook % (1)

\makeatother
\begin{document}

\end{document}

这是一个不需要重新扫描的解决方案\@enddocumenthook。这是首选。

\documentclass[a4paper]{article}
\usepackage{catoptions}
\makeatletter

\let\do@enddoc\@firstofone
\def\added@enddocumenthook{}
\grightaddtocs\@enddocumenthook{\added@enddocumenthook}
\robust@def\NewAtEndDocument#1{%
  \cptexpandarg{\grightaddtocs\added@enddocumenthook}%
    {\noexpand\do@enddoc{\cpttrimspace{#1}}}%
}
\robust@def*\FilterAtEndDocumentHook{%
  \begingroup
  \cpt@testopt\Filt@rAtEndDocumentHook{1}%
}
\robust@def\Filt@rAtEndDocumentHook[#1]#2{%
  \edef\reserved@b{\cpttrimspace{#2}}%
  \@tempcnta\z@
  \def\do@enddoc##1{%
    \toks@{\edef\added@enddocumenthook
      {\expandcsonce\added@enddocumenthook\unexpanded{\do@enddoc{##1}}}}%
    \edef\reserved@a{\unexpanded{##1}}%
    \ifx\reserved@a\reserved@b
      \advance\@tempcnta\@ne
      \ifnum\@tempcnta>\@iden{#1}\relax
        \the\toks@
      \fi
    \else
      \the\toks@
    \fi
  }%
  \expandafter\def\expandafter\added@enddocumenthook\expandafter
    {\expandafter}\added@enddocumenthook
  \postgroupdef\added@enddocumenthook\endgroup
}

% Examples:
\NewAtEndDocument{\def\x#1{#1}}
\NewAtEndDocument{\def\y#1{#1}}
\NewAtEndDocument{\def\x#1{#1}}
% Use the optional argument of \FilterAtEndDocumentHook to specify the number of
% occurrences of the test token to be removed (2 in the following example).
\FilterAtEndDocumentHook[2]{\def\x#1{#1}}
% \@enddocumenthook % (1)
% \show\y

\makeatother
\begin{document}

\end{document}

相关内容