![如何清除先前使用 \AtEndDocument 声明的内容?](https://linux22.com/image/247666/%E5%A6%82%E4%BD%95%E6%B8%85%E9%99%A4%E5%85%88%E5%89%8D%E4%BD%BF%E7%94%A8%20%5CAtEndDocument%20%E5%A3%B0%E6%98%8E%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我正在使用一个类文件,该文件用于\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}