How do I reset the current AtBeginDocument?
up vote
12
down vote
favorite
The following is actually a simplified version from a large job.
documentclass{memoir}
AtBeginDocument{First}
AtBeginDocument{Second}
AtBeginDocument{Third}
% I want to cancel the above at this point
AtBeginDocument{New First}
AtBeginDocument{New Second}
AtBeginDocument{New Third}
begin{document}
end{document}
I need to cancel the current AtBeginDocument
accumulations at some midpoint (coming from another homegrown style file from which I need to use some of the macros) and then add some more.
How do I do this?
macros
add a comment |
up vote
12
down vote
favorite
The following is actually a simplified version from a large job.
documentclass{memoir}
AtBeginDocument{First}
AtBeginDocument{Second}
AtBeginDocument{Third}
% I want to cancel the above at this point
AtBeginDocument{New First}
AtBeginDocument{New Second}
AtBeginDocument{New Third}
begin{document}
end{document}
I need to cancel the current AtBeginDocument
accumulations at some midpoint (coming from another homegrown style file from which I need to use some of the macros) and then add some more.
How do I do this?
macros
add a comment |
up vote
12
down vote
favorite
up vote
12
down vote
favorite
The following is actually a simplified version from a large job.
documentclass{memoir}
AtBeginDocument{First}
AtBeginDocument{Second}
AtBeginDocument{Third}
% I want to cancel the above at this point
AtBeginDocument{New First}
AtBeginDocument{New Second}
AtBeginDocument{New Third}
begin{document}
end{document}
I need to cancel the current AtBeginDocument
accumulations at some midpoint (coming from another homegrown style file from which I need to use some of the macros) and then add some more.
How do I do this?
macros
The following is actually a simplified version from a large job.
documentclass{memoir}
AtBeginDocument{First}
AtBeginDocument{Second}
AtBeginDocument{Third}
% I want to cancel the above at this point
AtBeginDocument{New First}
AtBeginDocument{New Second}
AtBeginDocument{New Third}
begin{document}
end{document}
I need to cancel the current AtBeginDocument
accumulations at some midpoint (coming from another homegrown style file from which I need to use some of the macros) and then add some more.
How do I do this?
macros
macros
asked Dec 13 at 12:27
Masroor
11k64686
11k64686
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
up vote
9
down vote
accepted
I'm not sure I understand your use case precisely. Left to myself, I'd be hugely reluctant to fiddle with AtBeginDocument
(or @begindocumenthook
) directly, because lots of packages (and the internal workings of LaTeX itself) use them for various purposes, and I don't see how I could be sure that I wouldn't break something unintentionally.
Might it be better to define a separate accumulator macro of your own, and then to have that executed AtBeginDocument
? You can then safely mess with that macro to your heart's content, without clobbering anything else that has been innocently making use of AtBeginDocument
.
Something like:
documentclass{memoir}
makeatletter
defMyAtBeginDocument{g@addto@macromy@begindocumenthook}
letmy@begindocumenthook@empty
defMyResetBeginDocument{globalletmy@begindocumenthook@empty}
AtBeginDocument{my@begindocumenthook}
makeatother
AtBeginDocument{THATpar}
MyAtBeginDocument{NOT THISpar}
MyResetBeginDocument
MyAtBeginDocument{THISpar}
begin{document}
We should see THIS then THAT!
end{document}
Note that THIS comes before THAT because my@begindocument
is executed as part of @begindocumenthook
before the additional material added by AtBeginDocument{THATpar}
because it comes in via my@begindocumenthook
which in turn got added to @begindocumenthook
first. You might need to (and could) delay that addition until later.
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
add a comment |
up vote
11
down vote
AtBeginDocument
just adds (appends) code to the 'hook' @begindocumenthook
, at the beginning of the document the collected code is executed.
In theory you can clear the hook at any time with
makeatletter
let@begindocumenthook@empty
makeatother
but that might be a bit risky since many packages expect AtBeginDocument
to work properly.
If there are only a few AtBeginDocument
s you want to skip over, it might be safer to disable the command temporarily with
makeatletter
letAtBeginDocument@gobble
makeatother
Of course you can also save the contents of the hook
makeatletter
let@masroor@saved@begindocumenthook@begindocumenthook
makeatother
and then after a few AtBeginDocument
s you want to ignore restore it again
makeatletter
let@begindocumenthook@masroor@saved@begindocumenthook
makeatother
Your solution is a very nice one. It also let me understand how exactlyAtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently usingAtBeginDocument
. And not all can be ignored.
– Masroor
Dec 13 at 18:00
add a comment |
up vote
4
down vote
This is similar to Paul Stanley's answer but with slightly different UI. This
defines AllowAtBeginDocumentToBeResetable
which makes all subsequent uses of AtBeginDocument
resetable. To reset these you invoke ClearResetableAtBeginDocumentList
.
Thus your example code would look like:
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
which produces:
Notes:
- Note that this requires that all external packages MUST be included before you issue
AllowAtBeginDocumentToBeResetable
.
Code:
documentclass{memoir}
makeatletter
let@OldAtBeginDocumentAtBeginDocument
newcommand{@ResetableBegindDoumentItems}{}%
newcommand{AllowAtBeginDocumentToBeResetable}{%
ifdefined@AtBeginDocumentIncludesResetableListelse
gdef@AtBeginDocumentIncludesResetableList{}% Don't execute this again
AtBeginDocument{@ResetableBegindDoumentItems}%
fi
renewcommand{AtBeginDocument}[1]{%
g@addto@macro@ResetableBegindDoumentItems{{##1}}%
}%
}
newcommand*{ClearResetableAtBeginDocumentList}{%
gdef@ResetableBegindDoumentItems{}%
}
makeatother
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
begin{document}
end{document}
add a comment |
up vote
4
down vote
I can offer a few routines for introducing sub-hooks within the AtBeginDocument
-hook and maintaining them.
1) AtBeginDocumentSubHook
Syntax:
AtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Adds a new AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to the AtBeginDocument
-hook and defines that AtBeginDocument
-sub-hook to deliver ⟨tokens⟩
.
2) AddToContentOfAtBeginDocumentSubHook
Syntax:
AddToContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨prepend-tokens⟩}%
{⟨append-tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to additionally deliver ⟨prepend-tokens⟩
in front of the tokens that are already in this sub-hook and to additionally deliver ⟨append-tokens⟩
behind the tokens that are already in this sub-hook.
3) ReplaceContentOfAtBeginDocumentSubHook
Syntax:
ReplaceContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to deliver ⟨tokens⟩
.
4) RemoveAtBeginDocumentSubHook
Syntax:
RemoveAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
Removes the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
from the AtBeginDocument
-hook.
documentclass{memoir}
makeatletter
%%----------------------------------------------------------------------
%% Paraphernalia
%%----------------------------------------------------------------------
newcommandUD@firstoftwo[2]{#1}%
newcommandUD@secondoftwo[2]{#2}%
newcommandUD@Exchange[2]{#2#1}%
newcommandUD@name{}longdefUD@name#1#{romannumeral0UD@innername{#1}}%
newcommandUD@innername[2]{%
expandafterUD@Exchangeexpandafter{csname#2endcsname}{ #1}%
}%
%%----------------------------------------------------------------------
%% Check whether argument is empty:
%%......................................................................
%% UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
newcommandUD@CheckWhetherNull[1]{%
romannumeral0expandafterUD@secondoftwostring{expandafter
UD@secondoftwoexpandafter{expandafter{string#1}expandafter
UD@secondoftwostring}expandafterUD@firstoftwoexpandafter{expandafter
UD@secondoftwostring}expandafterexpandafterUD@firstoftwo{ }{}%
UD@secondoftwo}{expandafterexpandafterUD@firstoftwo{ }{}UD@firstoftwo}%
}%
%%----------------------------------------------------------------------
%% Remove AtBeginDocument-sub-hook from AtBeginDocument-hook:
%%......................................................................
%% RemoveAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}
%% removes the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> from the AtBeginDocument-hook.
newcommand*RemoveAtBeginDocumentSubHook[1]{%
begingroup
UD@namelongdefkeep##1{@begindocumentsubhook@#1}{##1}%
UD@namelongdefremove##1{@begindocumentsubhook@#1}{}%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
UD@CheckWhetherNull
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
{UD@nameexpandafterremove@begindocumenthook{@begindocumentsubhook@#1}}%
{%
endgroup
@latex@info{Removal of undefined stringAtBeginDocument-sub-hookMessageBreak`#1' obsolete}%
}{%
@latex@info{Removing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
endgroup
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
toks@
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
{expandafterexpandafterexpandafter@gobbleexpandafterkeepexpandafter.@begindocumenthook}%
xdef@begindocumenthook{thetoks@}%
}%
}%
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
}%
%%----------------------------------------------------------------------
%% Introduce new AtBeginDocument-sub-hook:
%%......................................................................
%% AtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Adds a new AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to the AtBeginDocument-hook
%% and defines that AtBeginDocument-sub-hook to deliver <tokens>.
newcommandAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{Introducing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
UD@namenewcommand{@begindocumentsubhook@#1}{}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
UD@nameAtBeginDocument{@begindocumentsubhook@#1}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}{%
@latex@error{Sub-Hook `#1' already definedon@line}{%
Use either stringRemoveAtBeginDocumentSubHookspace for removing the sub-hook,MessageBreak
or stringReplaceContentOfAtBeginDocumentSubHookspace for replacing the content of theMessageBreak
sub-hook,MessageBreak
or stringAddToContentOfAtBeginDocumentSubHookspace for adding tokens to the sub-hook.%
}%
}%
}%
%%----------------------------------------------------------------------
%% Replace all tokens of an AtBeginDocument-sub-hook:
%%......................................................................
%% ReplaceContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to deliver <tokens>.
newcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{To be replaced stringAtBeginDocument-sub-hookMessageBreak`#1' does not exist}%
AtBeginDocumentSubHook{#1}{#2}%
}{%
@latex@info{Replacing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
%%----------------------------------------------------------------------
%% Add tokens to an AtBeginDocument-sub-hook:
%%......................................................................
%% AddToContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<prepend-tokens>}%
%% {<append-tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to additionally deliver <prepend-tokens>
%% in front of the tokens that are already in this hook and to additionally
%% deliver <append-tokens> behind the tokens that are already in this hook.
newcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{stringAtBeginDocument-sub-hook `#1' where tokensMessageBreak shall be added does not exist}%
AtBeginDocumentSubHook{#1}{#2#3}%
}{%
@latex@info{Adding tokens to stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
toks@expandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafter{%
UD@nametheexpandaftertoks@{@begindocumentsubhook@#1}#3%
}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
AtBeginDocument{%
renewcommandRemoveAtBeginDocumentSubHook[1]{%
@bsphack
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
@latex@info{Removal of stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
}%
renewcommandAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Introducing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Replacing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@bsphack
@latex@info{Adding to stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2#3%
}%
}%
makeatother
%expandaftershowcsname @begindocumenthookendcsname
AtBeginDocumentSubHook{SomeSubHook}{Somepar}
AtBeginDocumentSubHook{FirstSubHook}{Firstpar}
AtBeginDocumentSubHook{SecondSubHook}{Secondpar}
AtBeginDocumentSubHook{ThirdSubHook}{Thirdpar}
AtBeginDocumentSubHook{FourthSubHook}{Fourthpar}
% Let's cancel/change some of the above at this point
RemoveAtBeginDocumentSubHook{SomeSubHook}
ReplaceContentOfAtBeginDocumentSubHook{FirstSubHook}{New Firstpar}
ReplaceContentOfAtBeginDocumentSubHook{SecondSubHook}{New Secondpar}
ReplaceContentOfAtBeginDocumentSubHook{ThirdSubHook}{Thi}
AddToContentOfAtBeginDocumentSubHook{ThirdSubHook}{New }{rdpar}
%expandaftershowcsname @begindocumenthookendcsname
begin{document}
end{document}
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f464682%2fhow-do-i-reset-the-current-atbegindocument%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
9
down vote
accepted
I'm not sure I understand your use case precisely. Left to myself, I'd be hugely reluctant to fiddle with AtBeginDocument
(or @begindocumenthook
) directly, because lots of packages (and the internal workings of LaTeX itself) use them for various purposes, and I don't see how I could be sure that I wouldn't break something unintentionally.
Might it be better to define a separate accumulator macro of your own, and then to have that executed AtBeginDocument
? You can then safely mess with that macro to your heart's content, without clobbering anything else that has been innocently making use of AtBeginDocument
.
Something like:
documentclass{memoir}
makeatletter
defMyAtBeginDocument{g@addto@macromy@begindocumenthook}
letmy@begindocumenthook@empty
defMyResetBeginDocument{globalletmy@begindocumenthook@empty}
AtBeginDocument{my@begindocumenthook}
makeatother
AtBeginDocument{THATpar}
MyAtBeginDocument{NOT THISpar}
MyResetBeginDocument
MyAtBeginDocument{THISpar}
begin{document}
We should see THIS then THAT!
end{document}
Note that THIS comes before THAT because my@begindocument
is executed as part of @begindocumenthook
before the additional material added by AtBeginDocument{THATpar}
because it comes in via my@begindocumenthook
which in turn got added to @begindocumenthook
first. You might need to (and could) delay that addition until later.
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
add a comment |
up vote
9
down vote
accepted
I'm not sure I understand your use case precisely. Left to myself, I'd be hugely reluctant to fiddle with AtBeginDocument
(or @begindocumenthook
) directly, because lots of packages (and the internal workings of LaTeX itself) use them for various purposes, and I don't see how I could be sure that I wouldn't break something unintentionally.
Might it be better to define a separate accumulator macro of your own, and then to have that executed AtBeginDocument
? You can then safely mess with that macro to your heart's content, without clobbering anything else that has been innocently making use of AtBeginDocument
.
Something like:
documentclass{memoir}
makeatletter
defMyAtBeginDocument{g@addto@macromy@begindocumenthook}
letmy@begindocumenthook@empty
defMyResetBeginDocument{globalletmy@begindocumenthook@empty}
AtBeginDocument{my@begindocumenthook}
makeatother
AtBeginDocument{THATpar}
MyAtBeginDocument{NOT THISpar}
MyResetBeginDocument
MyAtBeginDocument{THISpar}
begin{document}
We should see THIS then THAT!
end{document}
Note that THIS comes before THAT because my@begindocument
is executed as part of @begindocumenthook
before the additional material added by AtBeginDocument{THATpar}
because it comes in via my@begindocumenthook
which in turn got added to @begindocumenthook
first. You might need to (and could) delay that addition until later.
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
add a comment |
up vote
9
down vote
accepted
up vote
9
down vote
accepted
I'm not sure I understand your use case precisely. Left to myself, I'd be hugely reluctant to fiddle with AtBeginDocument
(or @begindocumenthook
) directly, because lots of packages (and the internal workings of LaTeX itself) use them for various purposes, and I don't see how I could be sure that I wouldn't break something unintentionally.
Might it be better to define a separate accumulator macro of your own, and then to have that executed AtBeginDocument
? You can then safely mess with that macro to your heart's content, without clobbering anything else that has been innocently making use of AtBeginDocument
.
Something like:
documentclass{memoir}
makeatletter
defMyAtBeginDocument{g@addto@macromy@begindocumenthook}
letmy@begindocumenthook@empty
defMyResetBeginDocument{globalletmy@begindocumenthook@empty}
AtBeginDocument{my@begindocumenthook}
makeatother
AtBeginDocument{THATpar}
MyAtBeginDocument{NOT THISpar}
MyResetBeginDocument
MyAtBeginDocument{THISpar}
begin{document}
We should see THIS then THAT!
end{document}
Note that THIS comes before THAT because my@begindocument
is executed as part of @begindocumenthook
before the additional material added by AtBeginDocument{THATpar}
because it comes in via my@begindocumenthook
which in turn got added to @begindocumenthook
first. You might need to (and could) delay that addition until later.
I'm not sure I understand your use case precisely. Left to myself, I'd be hugely reluctant to fiddle with AtBeginDocument
(or @begindocumenthook
) directly, because lots of packages (and the internal workings of LaTeX itself) use them for various purposes, and I don't see how I could be sure that I wouldn't break something unintentionally.
Might it be better to define a separate accumulator macro of your own, and then to have that executed AtBeginDocument
? You can then safely mess with that macro to your heart's content, without clobbering anything else that has been innocently making use of AtBeginDocument
.
Something like:
documentclass{memoir}
makeatletter
defMyAtBeginDocument{g@addto@macromy@begindocumenthook}
letmy@begindocumenthook@empty
defMyResetBeginDocument{globalletmy@begindocumenthook@empty}
AtBeginDocument{my@begindocumenthook}
makeatother
AtBeginDocument{THATpar}
MyAtBeginDocument{NOT THISpar}
MyResetBeginDocument
MyAtBeginDocument{THISpar}
begin{document}
We should see THIS then THAT!
end{document}
Note that THIS comes before THAT because my@begindocument
is executed as part of @begindocumenthook
before the additional material added by AtBeginDocument{THATpar}
because it comes in via my@begindocumenthook
which in turn got added to @begindocumenthook
first. You might need to (and could) delay that addition until later.
answered Dec 13 at 14:03
Paul Stanley
14k42746
14k42746
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
add a comment |
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
I particularly liked the idea of not messing with @begindocumenthook. Otherwise, packages innocently using AtBeginDocument would never know what hit them. For my scenario, your solution turned out to be the most suitable one. The one from Peter Grill was a very close second. There is no special reason behind this, I had started working on your's first.
– Masroor
Dec 14 at 2:10
add a comment |
up vote
11
down vote
AtBeginDocument
just adds (appends) code to the 'hook' @begindocumenthook
, at the beginning of the document the collected code is executed.
In theory you can clear the hook at any time with
makeatletter
let@begindocumenthook@empty
makeatother
but that might be a bit risky since many packages expect AtBeginDocument
to work properly.
If there are only a few AtBeginDocument
s you want to skip over, it might be safer to disable the command temporarily with
makeatletter
letAtBeginDocument@gobble
makeatother
Of course you can also save the contents of the hook
makeatletter
let@masroor@saved@begindocumenthook@begindocumenthook
makeatother
and then after a few AtBeginDocument
s you want to ignore restore it again
makeatletter
let@begindocumenthook@masroor@saved@begindocumenthook
makeatother
Your solution is a very nice one. It also let me understand how exactlyAtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently usingAtBeginDocument
. And not all can be ignored.
– Masroor
Dec 13 at 18:00
add a comment |
up vote
11
down vote
AtBeginDocument
just adds (appends) code to the 'hook' @begindocumenthook
, at the beginning of the document the collected code is executed.
In theory you can clear the hook at any time with
makeatletter
let@begindocumenthook@empty
makeatother
but that might be a bit risky since many packages expect AtBeginDocument
to work properly.
If there are only a few AtBeginDocument
s you want to skip over, it might be safer to disable the command temporarily with
makeatletter
letAtBeginDocument@gobble
makeatother
Of course you can also save the contents of the hook
makeatletter
let@masroor@saved@begindocumenthook@begindocumenthook
makeatother
and then after a few AtBeginDocument
s you want to ignore restore it again
makeatletter
let@begindocumenthook@masroor@saved@begindocumenthook
makeatother
Your solution is a very nice one. It also let me understand how exactlyAtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently usingAtBeginDocument
. And not all can be ignored.
– Masroor
Dec 13 at 18:00
add a comment |
up vote
11
down vote
up vote
11
down vote
AtBeginDocument
just adds (appends) code to the 'hook' @begindocumenthook
, at the beginning of the document the collected code is executed.
In theory you can clear the hook at any time with
makeatletter
let@begindocumenthook@empty
makeatother
but that might be a bit risky since many packages expect AtBeginDocument
to work properly.
If there are only a few AtBeginDocument
s you want to skip over, it might be safer to disable the command temporarily with
makeatletter
letAtBeginDocument@gobble
makeatother
Of course you can also save the contents of the hook
makeatletter
let@masroor@saved@begindocumenthook@begindocumenthook
makeatother
and then after a few AtBeginDocument
s you want to ignore restore it again
makeatletter
let@begindocumenthook@masroor@saved@begindocumenthook
makeatother
AtBeginDocument
just adds (appends) code to the 'hook' @begindocumenthook
, at the beginning of the document the collected code is executed.
In theory you can clear the hook at any time with
makeatletter
let@begindocumenthook@empty
makeatother
but that might be a bit risky since many packages expect AtBeginDocument
to work properly.
If there are only a few AtBeginDocument
s you want to skip over, it might be safer to disable the command temporarily with
makeatletter
letAtBeginDocument@gobble
makeatother
Of course you can also save the contents of the hook
makeatletter
let@masroor@saved@begindocumenthook@begindocumenthook
makeatother
and then after a few AtBeginDocument
s you want to ignore restore it again
makeatletter
let@begindocumenthook@masroor@saved@begindocumenthook
makeatother
edited Dec 13 at 13:29
answered Dec 13 at 12:36
moewe
85.2k9108328
85.2k9108328
Your solution is a very nice one. It also let me understand how exactlyAtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently usingAtBeginDocument
. And not all can be ignored.
– Masroor
Dec 13 at 18:00
add a comment |
Your solution is a very nice one. It also let me understand how exactlyAtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently usingAtBeginDocument
. And not all can be ignored.
– Masroor
Dec 13 at 18:00
Your solution is a very nice one. It also let me understand how exactly
AtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently using AtBeginDocument
. And not all can be ignored.– Masroor
Dec 13 at 18:00
Your solution is a very nice one. It also let me understand how exactly
AtBeginDocument
works. But eventually I failed to use it since in the homegrown style file, many packages were innocently using AtBeginDocument
. And not all can be ignored.– Masroor
Dec 13 at 18:00
add a comment |
up vote
4
down vote
This is similar to Paul Stanley's answer but with slightly different UI. This
defines AllowAtBeginDocumentToBeResetable
which makes all subsequent uses of AtBeginDocument
resetable. To reset these you invoke ClearResetableAtBeginDocumentList
.
Thus your example code would look like:
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
which produces:
Notes:
- Note that this requires that all external packages MUST be included before you issue
AllowAtBeginDocumentToBeResetable
.
Code:
documentclass{memoir}
makeatletter
let@OldAtBeginDocumentAtBeginDocument
newcommand{@ResetableBegindDoumentItems}{}%
newcommand{AllowAtBeginDocumentToBeResetable}{%
ifdefined@AtBeginDocumentIncludesResetableListelse
gdef@AtBeginDocumentIncludesResetableList{}% Don't execute this again
AtBeginDocument{@ResetableBegindDoumentItems}%
fi
renewcommand{AtBeginDocument}[1]{%
g@addto@macro@ResetableBegindDoumentItems{{##1}}%
}%
}
newcommand*{ClearResetableAtBeginDocumentList}{%
gdef@ResetableBegindDoumentItems{}%
}
makeatother
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
begin{document}
end{document}
add a comment |
up vote
4
down vote
This is similar to Paul Stanley's answer but with slightly different UI. This
defines AllowAtBeginDocumentToBeResetable
which makes all subsequent uses of AtBeginDocument
resetable. To reset these you invoke ClearResetableAtBeginDocumentList
.
Thus your example code would look like:
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
which produces:
Notes:
- Note that this requires that all external packages MUST be included before you issue
AllowAtBeginDocumentToBeResetable
.
Code:
documentclass{memoir}
makeatletter
let@OldAtBeginDocumentAtBeginDocument
newcommand{@ResetableBegindDoumentItems}{}%
newcommand{AllowAtBeginDocumentToBeResetable}{%
ifdefined@AtBeginDocumentIncludesResetableListelse
gdef@AtBeginDocumentIncludesResetableList{}% Don't execute this again
AtBeginDocument{@ResetableBegindDoumentItems}%
fi
renewcommand{AtBeginDocument}[1]{%
g@addto@macro@ResetableBegindDoumentItems{{##1}}%
}%
}
newcommand*{ClearResetableAtBeginDocumentList}{%
gdef@ResetableBegindDoumentItems{}%
}
makeatother
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
begin{document}
end{document}
add a comment |
up vote
4
down vote
up vote
4
down vote
This is similar to Paul Stanley's answer but with slightly different UI. This
defines AllowAtBeginDocumentToBeResetable
which makes all subsequent uses of AtBeginDocument
resetable. To reset these you invoke ClearResetableAtBeginDocumentList
.
Thus your example code would look like:
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
which produces:
Notes:
- Note that this requires that all external packages MUST be included before you issue
AllowAtBeginDocumentToBeResetable
.
Code:
documentclass{memoir}
makeatletter
let@OldAtBeginDocumentAtBeginDocument
newcommand{@ResetableBegindDoumentItems}{}%
newcommand{AllowAtBeginDocumentToBeResetable}{%
ifdefined@AtBeginDocumentIncludesResetableListelse
gdef@AtBeginDocumentIncludesResetableList{}% Don't execute this again
AtBeginDocument{@ResetableBegindDoumentItems}%
fi
renewcommand{AtBeginDocument}[1]{%
g@addto@macro@ResetableBegindDoumentItems{{##1}}%
}%
}
newcommand*{ClearResetableAtBeginDocumentList}{%
gdef@ResetableBegindDoumentItems{}%
}
makeatother
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
begin{document}
end{document}
This is similar to Paul Stanley's answer but with slightly different UI. This
defines AllowAtBeginDocumentToBeResetable
which makes all subsequent uses of AtBeginDocument
resetable. To reset these you invoke ClearResetableAtBeginDocumentList
.
Thus your example code would look like:
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
which produces:
Notes:
- Note that this requires that all external packages MUST be included before you issue
AllowAtBeginDocumentToBeResetable
.
Code:
documentclass{memoir}
makeatletter
let@OldAtBeginDocumentAtBeginDocument
newcommand{@ResetableBegindDoumentItems}{}%
newcommand{AllowAtBeginDocumentToBeResetable}{%
ifdefined@AtBeginDocumentIncludesResetableListelse
gdef@AtBeginDocumentIncludesResetableList{}% Don't execute this again
AtBeginDocument{@ResetableBegindDoumentItems}%
fi
renewcommand{AtBeginDocument}[1]{%
g@addto@macro@ResetableBegindDoumentItems{{##1}}%
}%
}
newcommand*{ClearResetableAtBeginDocumentList}{%
gdef@ResetableBegindDoumentItems{}%
}
makeatother
AllowAtBeginDocumentToBeResetable%% ALL EXTERNAL PACKAGES INCLUDED BEFORE HERE
AtBeginDocument{Firstpar}
AtBeginDocument{Secondpar}
AtBeginDocument{Thirdpar}
ClearResetableAtBeginDocumentList% I want to cancel the above at this point
AtBeginDocument{New Firstpar}
AtBeginDocument{New Secondpar}
AtBeginDocument{New Thirdpar}
begin{document}
end{document}
answered Dec 13 at 18:11
Peter Grill
163k25433745
163k25433745
add a comment |
add a comment |
up vote
4
down vote
I can offer a few routines for introducing sub-hooks within the AtBeginDocument
-hook and maintaining them.
1) AtBeginDocumentSubHook
Syntax:
AtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Adds a new AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to the AtBeginDocument
-hook and defines that AtBeginDocument
-sub-hook to deliver ⟨tokens⟩
.
2) AddToContentOfAtBeginDocumentSubHook
Syntax:
AddToContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨prepend-tokens⟩}%
{⟨append-tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to additionally deliver ⟨prepend-tokens⟩
in front of the tokens that are already in this sub-hook and to additionally deliver ⟨append-tokens⟩
behind the tokens that are already in this sub-hook.
3) ReplaceContentOfAtBeginDocumentSubHook
Syntax:
ReplaceContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to deliver ⟨tokens⟩
.
4) RemoveAtBeginDocumentSubHook
Syntax:
RemoveAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
Removes the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
from the AtBeginDocument
-hook.
documentclass{memoir}
makeatletter
%%----------------------------------------------------------------------
%% Paraphernalia
%%----------------------------------------------------------------------
newcommandUD@firstoftwo[2]{#1}%
newcommandUD@secondoftwo[2]{#2}%
newcommandUD@Exchange[2]{#2#1}%
newcommandUD@name{}longdefUD@name#1#{romannumeral0UD@innername{#1}}%
newcommandUD@innername[2]{%
expandafterUD@Exchangeexpandafter{csname#2endcsname}{ #1}%
}%
%%----------------------------------------------------------------------
%% Check whether argument is empty:
%%......................................................................
%% UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
newcommandUD@CheckWhetherNull[1]{%
romannumeral0expandafterUD@secondoftwostring{expandafter
UD@secondoftwoexpandafter{expandafter{string#1}expandafter
UD@secondoftwostring}expandafterUD@firstoftwoexpandafter{expandafter
UD@secondoftwostring}expandafterexpandafterUD@firstoftwo{ }{}%
UD@secondoftwo}{expandafterexpandafterUD@firstoftwo{ }{}UD@firstoftwo}%
}%
%%----------------------------------------------------------------------
%% Remove AtBeginDocument-sub-hook from AtBeginDocument-hook:
%%......................................................................
%% RemoveAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}
%% removes the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> from the AtBeginDocument-hook.
newcommand*RemoveAtBeginDocumentSubHook[1]{%
begingroup
UD@namelongdefkeep##1{@begindocumentsubhook@#1}{##1}%
UD@namelongdefremove##1{@begindocumentsubhook@#1}{}%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
UD@CheckWhetherNull
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
{UD@nameexpandafterremove@begindocumenthook{@begindocumentsubhook@#1}}%
{%
endgroup
@latex@info{Removal of undefined stringAtBeginDocument-sub-hookMessageBreak`#1' obsolete}%
}{%
@latex@info{Removing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
endgroup
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
toks@
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
{expandafterexpandafterexpandafter@gobbleexpandafterkeepexpandafter.@begindocumenthook}%
xdef@begindocumenthook{thetoks@}%
}%
}%
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
}%
%%----------------------------------------------------------------------
%% Introduce new AtBeginDocument-sub-hook:
%%......................................................................
%% AtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Adds a new AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to the AtBeginDocument-hook
%% and defines that AtBeginDocument-sub-hook to deliver <tokens>.
newcommandAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{Introducing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
UD@namenewcommand{@begindocumentsubhook@#1}{}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
UD@nameAtBeginDocument{@begindocumentsubhook@#1}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}{%
@latex@error{Sub-Hook `#1' already definedon@line}{%
Use either stringRemoveAtBeginDocumentSubHookspace for removing the sub-hook,MessageBreak
or stringReplaceContentOfAtBeginDocumentSubHookspace for replacing the content of theMessageBreak
sub-hook,MessageBreak
or stringAddToContentOfAtBeginDocumentSubHookspace for adding tokens to the sub-hook.%
}%
}%
}%
%%----------------------------------------------------------------------
%% Replace all tokens of an AtBeginDocument-sub-hook:
%%......................................................................
%% ReplaceContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to deliver <tokens>.
newcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{To be replaced stringAtBeginDocument-sub-hookMessageBreak`#1' does not exist}%
AtBeginDocumentSubHook{#1}{#2}%
}{%
@latex@info{Replacing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
%%----------------------------------------------------------------------
%% Add tokens to an AtBeginDocument-sub-hook:
%%......................................................................
%% AddToContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<prepend-tokens>}%
%% {<append-tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to additionally deliver <prepend-tokens>
%% in front of the tokens that are already in this hook and to additionally
%% deliver <append-tokens> behind the tokens that are already in this hook.
newcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{stringAtBeginDocument-sub-hook `#1' where tokensMessageBreak shall be added does not exist}%
AtBeginDocumentSubHook{#1}{#2#3}%
}{%
@latex@info{Adding tokens to stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
toks@expandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafter{%
UD@nametheexpandaftertoks@{@begindocumentsubhook@#1}#3%
}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
AtBeginDocument{%
renewcommandRemoveAtBeginDocumentSubHook[1]{%
@bsphack
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
@latex@info{Removal of stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
}%
renewcommandAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Introducing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Replacing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@bsphack
@latex@info{Adding to stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2#3%
}%
}%
makeatother
%expandaftershowcsname @begindocumenthookendcsname
AtBeginDocumentSubHook{SomeSubHook}{Somepar}
AtBeginDocumentSubHook{FirstSubHook}{Firstpar}
AtBeginDocumentSubHook{SecondSubHook}{Secondpar}
AtBeginDocumentSubHook{ThirdSubHook}{Thirdpar}
AtBeginDocumentSubHook{FourthSubHook}{Fourthpar}
% Let's cancel/change some of the above at this point
RemoveAtBeginDocumentSubHook{SomeSubHook}
ReplaceContentOfAtBeginDocumentSubHook{FirstSubHook}{New Firstpar}
ReplaceContentOfAtBeginDocumentSubHook{SecondSubHook}{New Secondpar}
ReplaceContentOfAtBeginDocumentSubHook{ThirdSubHook}{Thi}
AddToContentOfAtBeginDocumentSubHook{ThirdSubHook}{New }{rdpar}
%expandaftershowcsname @begindocumenthookendcsname
begin{document}
end{document}
add a comment |
up vote
4
down vote
I can offer a few routines for introducing sub-hooks within the AtBeginDocument
-hook and maintaining them.
1) AtBeginDocumentSubHook
Syntax:
AtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Adds a new AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to the AtBeginDocument
-hook and defines that AtBeginDocument
-sub-hook to deliver ⟨tokens⟩
.
2) AddToContentOfAtBeginDocumentSubHook
Syntax:
AddToContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨prepend-tokens⟩}%
{⟨append-tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to additionally deliver ⟨prepend-tokens⟩
in front of the tokens that are already in this sub-hook and to additionally deliver ⟨append-tokens⟩
behind the tokens that are already in this sub-hook.
3) ReplaceContentOfAtBeginDocumentSubHook
Syntax:
ReplaceContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to deliver ⟨tokens⟩
.
4) RemoveAtBeginDocumentSubHook
Syntax:
RemoveAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
Removes the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
from the AtBeginDocument
-hook.
documentclass{memoir}
makeatletter
%%----------------------------------------------------------------------
%% Paraphernalia
%%----------------------------------------------------------------------
newcommandUD@firstoftwo[2]{#1}%
newcommandUD@secondoftwo[2]{#2}%
newcommandUD@Exchange[2]{#2#1}%
newcommandUD@name{}longdefUD@name#1#{romannumeral0UD@innername{#1}}%
newcommandUD@innername[2]{%
expandafterUD@Exchangeexpandafter{csname#2endcsname}{ #1}%
}%
%%----------------------------------------------------------------------
%% Check whether argument is empty:
%%......................................................................
%% UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
newcommandUD@CheckWhetherNull[1]{%
romannumeral0expandafterUD@secondoftwostring{expandafter
UD@secondoftwoexpandafter{expandafter{string#1}expandafter
UD@secondoftwostring}expandafterUD@firstoftwoexpandafter{expandafter
UD@secondoftwostring}expandafterexpandafterUD@firstoftwo{ }{}%
UD@secondoftwo}{expandafterexpandafterUD@firstoftwo{ }{}UD@firstoftwo}%
}%
%%----------------------------------------------------------------------
%% Remove AtBeginDocument-sub-hook from AtBeginDocument-hook:
%%......................................................................
%% RemoveAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}
%% removes the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> from the AtBeginDocument-hook.
newcommand*RemoveAtBeginDocumentSubHook[1]{%
begingroup
UD@namelongdefkeep##1{@begindocumentsubhook@#1}{##1}%
UD@namelongdefremove##1{@begindocumentsubhook@#1}{}%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
UD@CheckWhetherNull
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
{UD@nameexpandafterremove@begindocumenthook{@begindocumentsubhook@#1}}%
{%
endgroup
@latex@info{Removal of undefined stringAtBeginDocument-sub-hookMessageBreak`#1' obsolete}%
}{%
@latex@info{Removing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
endgroup
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
toks@
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
{expandafterexpandafterexpandafter@gobbleexpandafterkeepexpandafter.@begindocumenthook}%
xdef@begindocumenthook{thetoks@}%
}%
}%
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
}%
%%----------------------------------------------------------------------
%% Introduce new AtBeginDocument-sub-hook:
%%......................................................................
%% AtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Adds a new AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to the AtBeginDocument-hook
%% and defines that AtBeginDocument-sub-hook to deliver <tokens>.
newcommandAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{Introducing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
UD@namenewcommand{@begindocumentsubhook@#1}{}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
UD@nameAtBeginDocument{@begindocumentsubhook@#1}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}{%
@latex@error{Sub-Hook `#1' already definedon@line}{%
Use either stringRemoveAtBeginDocumentSubHookspace for removing the sub-hook,MessageBreak
or stringReplaceContentOfAtBeginDocumentSubHookspace for replacing the content of theMessageBreak
sub-hook,MessageBreak
or stringAddToContentOfAtBeginDocumentSubHookspace for adding tokens to the sub-hook.%
}%
}%
}%
%%----------------------------------------------------------------------
%% Replace all tokens of an AtBeginDocument-sub-hook:
%%......................................................................
%% ReplaceContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to deliver <tokens>.
newcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{To be replaced stringAtBeginDocument-sub-hookMessageBreak`#1' does not exist}%
AtBeginDocumentSubHook{#1}{#2}%
}{%
@latex@info{Replacing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
%%----------------------------------------------------------------------
%% Add tokens to an AtBeginDocument-sub-hook:
%%......................................................................
%% AddToContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<prepend-tokens>}%
%% {<append-tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to additionally deliver <prepend-tokens>
%% in front of the tokens that are already in this hook and to additionally
%% deliver <append-tokens> behind the tokens that are already in this hook.
newcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{stringAtBeginDocument-sub-hook `#1' where tokensMessageBreak shall be added does not exist}%
AtBeginDocumentSubHook{#1}{#2#3}%
}{%
@latex@info{Adding tokens to stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
toks@expandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafter{%
UD@nametheexpandaftertoks@{@begindocumentsubhook@#1}#3%
}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
AtBeginDocument{%
renewcommandRemoveAtBeginDocumentSubHook[1]{%
@bsphack
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
@latex@info{Removal of stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
}%
renewcommandAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Introducing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Replacing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@bsphack
@latex@info{Adding to stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2#3%
}%
}%
makeatother
%expandaftershowcsname @begindocumenthookendcsname
AtBeginDocumentSubHook{SomeSubHook}{Somepar}
AtBeginDocumentSubHook{FirstSubHook}{Firstpar}
AtBeginDocumentSubHook{SecondSubHook}{Secondpar}
AtBeginDocumentSubHook{ThirdSubHook}{Thirdpar}
AtBeginDocumentSubHook{FourthSubHook}{Fourthpar}
% Let's cancel/change some of the above at this point
RemoveAtBeginDocumentSubHook{SomeSubHook}
ReplaceContentOfAtBeginDocumentSubHook{FirstSubHook}{New Firstpar}
ReplaceContentOfAtBeginDocumentSubHook{SecondSubHook}{New Secondpar}
ReplaceContentOfAtBeginDocumentSubHook{ThirdSubHook}{Thi}
AddToContentOfAtBeginDocumentSubHook{ThirdSubHook}{New }{rdpar}
%expandaftershowcsname @begindocumenthookendcsname
begin{document}
end{document}
add a comment |
up vote
4
down vote
up vote
4
down vote
I can offer a few routines for introducing sub-hooks within the AtBeginDocument
-hook and maintaining them.
1) AtBeginDocumentSubHook
Syntax:
AtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Adds a new AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to the AtBeginDocument
-hook and defines that AtBeginDocument
-sub-hook to deliver ⟨tokens⟩
.
2) AddToContentOfAtBeginDocumentSubHook
Syntax:
AddToContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨prepend-tokens⟩}%
{⟨append-tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to additionally deliver ⟨prepend-tokens⟩
in front of the tokens that are already in this sub-hook and to additionally deliver ⟨append-tokens⟩
behind the tokens that are already in this sub-hook.
3) ReplaceContentOfAtBeginDocumentSubHook
Syntax:
ReplaceContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to deliver ⟨tokens⟩
.
4) RemoveAtBeginDocumentSubHook
Syntax:
RemoveAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
Removes the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
from the AtBeginDocument
-hook.
documentclass{memoir}
makeatletter
%%----------------------------------------------------------------------
%% Paraphernalia
%%----------------------------------------------------------------------
newcommandUD@firstoftwo[2]{#1}%
newcommandUD@secondoftwo[2]{#2}%
newcommandUD@Exchange[2]{#2#1}%
newcommandUD@name{}longdefUD@name#1#{romannumeral0UD@innername{#1}}%
newcommandUD@innername[2]{%
expandafterUD@Exchangeexpandafter{csname#2endcsname}{ #1}%
}%
%%----------------------------------------------------------------------
%% Check whether argument is empty:
%%......................................................................
%% UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
newcommandUD@CheckWhetherNull[1]{%
romannumeral0expandafterUD@secondoftwostring{expandafter
UD@secondoftwoexpandafter{expandafter{string#1}expandafter
UD@secondoftwostring}expandafterUD@firstoftwoexpandafter{expandafter
UD@secondoftwostring}expandafterexpandafterUD@firstoftwo{ }{}%
UD@secondoftwo}{expandafterexpandafterUD@firstoftwo{ }{}UD@firstoftwo}%
}%
%%----------------------------------------------------------------------
%% Remove AtBeginDocument-sub-hook from AtBeginDocument-hook:
%%......................................................................
%% RemoveAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}
%% removes the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> from the AtBeginDocument-hook.
newcommand*RemoveAtBeginDocumentSubHook[1]{%
begingroup
UD@namelongdefkeep##1{@begindocumentsubhook@#1}{##1}%
UD@namelongdefremove##1{@begindocumentsubhook@#1}{}%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
UD@CheckWhetherNull
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
{UD@nameexpandafterremove@begindocumenthook{@begindocumentsubhook@#1}}%
{%
endgroup
@latex@info{Removal of undefined stringAtBeginDocument-sub-hookMessageBreak`#1' obsolete}%
}{%
@latex@info{Removing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
endgroup
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
toks@
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
{expandafterexpandafterexpandafter@gobbleexpandafterkeepexpandafter.@begindocumenthook}%
xdef@begindocumenthook{thetoks@}%
}%
}%
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
}%
%%----------------------------------------------------------------------
%% Introduce new AtBeginDocument-sub-hook:
%%......................................................................
%% AtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Adds a new AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to the AtBeginDocument-hook
%% and defines that AtBeginDocument-sub-hook to deliver <tokens>.
newcommandAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{Introducing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
UD@namenewcommand{@begindocumentsubhook@#1}{}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
UD@nameAtBeginDocument{@begindocumentsubhook@#1}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}{%
@latex@error{Sub-Hook `#1' already definedon@line}{%
Use either stringRemoveAtBeginDocumentSubHookspace for removing the sub-hook,MessageBreak
or stringReplaceContentOfAtBeginDocumentSubHookspace for replacing the content of theMessageBreak
sub-hook,MessageBreak
or stringAddToContentOfAtBeginDocumentSubHookspace for adding tokens to the sub-hook.%
}%
}%
}%
%%----------------------------------------------------------------------
%% Replace all tokens of an AtBeginDocument-sub-hook:
%%......................................................................
%% ReplaceContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to deliver <tokens>.
newcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{To be replaced stringAtBeginDocument-sub-hookMessageBreak`#1' does not exist}%
AtBeginDocumentSubHook{#1}{#2}%
}{%
@latex@info{Replacing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
%%----------------------------------------------------------------------
%% Add tokens to an AtBeginDocument-sub-hook:
%%......................................................................
%% AddToContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<prepend-tokens>}%
%% {<append-tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to additionally deliver <prepend-tokens>
%% in front of the tokens that are already in this hook and to additionally
%% deliver <append-tokens> behind the tokens that are already in this hook.
newcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{stringAtBeginDocument-sub-hook `#1' where tokensMessageBreak shall be added does not exist}%
AtBeginDocumentSubHook{#1}{#2#3}%
}{%
@latex@info{Adding tokens to stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
toks@expandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafter{%
UD@nametheexpandaftertoks@{@begindocumentsubhook@#1}#3%
}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
AtBeginDocument{%
renewcommandRemoveAtBeginDocumentSubHook[1]{%
@bsphack
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
@latex@info{Removal of stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
}%
renewcommandAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Introducing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Replacing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@bsphack
@latex@info{Adding to stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2#3%
}%
}%
makeatother
%expandaftershowcsname @begindocumenthookendcsname
AtBeginDocumentSubHook{SomeSubHook}{Somepar}
AtBeginDocumentSubHook{FirstSubHook}{Firstpar}
AtBeginDocumentSubHook{SecondSubHook}{Secondpar}
AtBeginDocumentSubHook{ThirdSubHook}{Thirdpar}
AtBeginDocumentSubHook{FourthSubHook}{Fourthpar}
% Let's cancel/change some of the above at this point
RemoveAtBeginDocumentSubHook{SomeSubHook}
ReplaceContentOfAtBeginDocumentSubHook{FirstSubHook}{New Firstpar}
ReplaceContentOfAtBeginDocumentSubHook{SecondSubHook}{New Secondpar}
ReplaceContentOfAtBeginDocumentSubHook{ThirdSubHook}{Thi}
AddToContentOfAtBeginDocumentSubHook{ThirdSubHook}{New }{rdpar}
%expandaftershowcsname @begindocumenthookendcsname
begin{document}
end{document}
I can offer a few routines for introducing sub-hooks within the AtBeginDocument
-hook and maintaining them.
1) AtBeginDocumentSubHook
Syntax:
AtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Adds a new AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to the AtBeginDocument
-hook and defines that AtBeginDocument
-sub-hook to deliver ⟨tokens⟩
.
2) AddToContentOfAtBeginDocumentSubHook
Syntax:
AddToContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨prepend-tokens⟩}%
{⟨append-tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to additionally deliver ⟨prepend-tokens⟩
in front of the tokens that are already in this sub-hook and to additionally deliver ⟨append-tokens⟩
behind the tokens that are already in this sub-hook.
3) ReplaceContentOfAtBeginDocumentSubHook
Syntax:
ReplaceContentOfAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
{⟨tokens⟩}%
Redefines the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
to deliver ⟨tokens⟩
.
4) RemoveAtBeginDocumentSubHook
Syntax:
RemoveAtBeginDocumentSubHook{⟨name of AtBeginDocument-sub-hook⟩}%
Removes the AtBeginDocument
-sub-hook whose name is ⟨name of AtBeginDocument-sub-hook⟩
from the AtBeginDocument
-hook.
documentclass{memoir}
makeatletter
%%----------------------------------------------------------------------
%% Paraphernalia
%%----------------------------------------------------------------------
newcommandUD@firstoftwo[2]{#1}%
newcommandUD@secondoftwo[2]{#2}%
newcommandUD@Exchange[2]{#2#1}%
newcommandUD@name{}longdefUD@name#1#{romannumeral0UD@innername{#1}}%
newcommandUD@innername[2]{%
expandafterUD@Exchangeexpandafter{csname#2endcsname}{ #1}%
}%
%%----------------------------------------------------------------------
%% Check whether argument is empty:
%%......................................................................
%% UD@CheckWhetherNull{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is empty>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not empty>}%
%%
%% The gist of this macro comes from Robert R. Schneck's ifempty-macro:
%% <https://groups.google.com/forum/#!original/comp.text.tex/kuOEIQIrElc/lUg37FmhA74J>
newcommandUD@CheckWhetherNull[1]{%
romannumeral0expandafterUD@secondoftwostring{expandafter
UD@secondoftwoexpandafter{expandafter{string#1}expandafter
UD@secondoftwostring}expandafterUD@firstoftwoexpandafter{expandafter
UD@secondoftwostring}expandafterexpandafterUD@firstoftwo{ }{}%
UD@secondoftwo}{expandafterexpandafterUD@firstoftwo{ }{}UD@firstoftwo}%
}%
%%----------------------------------------------------------------------
%% Remove AtBeginDocument-sub-hook from AtBeginDocument-hook:
%%......................................................................
%% RemoveAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}
%% removes the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> from the AtBeginDocument-hook.
newcommand*RemoveAtBeginDocumentSubHook[1]{%
begingroup
UD@namelongdefkeep##1{@begindocumentsubhook@#1}{##1}%
UD@namelongdefremove##1{@begindocumentsubhook@#1}{}%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
UD@CheckWhetherNull
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
expandafter
{UD@nameexpandafterremove@begindocumenthook{@begindocumentsubhook@#1}}%
{%
endgroup
@latex@info{Removal of undefined stringAtBeginDocument-sub-hookMessageBreak`#1' obsolete}%
}{%
@latex@info{Removing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
endgroup
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
toks@
expandafterexpandafterexpandafterexpandafterexpandafterexpandafterexpandafter
{expandafterexpandafterexpandafter@gobbleexpandafterkeepexpandafter.@begindocumenthook}%
xdef@begindocumenthook{thetoks@}%
}%
}%
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
}%
%%----------------------------------------------------------------------
%% Introduce new AtBeginDocument-sub-hook:
%%......................................................................
%% AtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Adds a new AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to the AtBeginDocument-hook
%% and defines that AtBeginDocument-sub-hook to deliver <tokens>.
newcommandAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{Introducing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
UD@namenewcommand{@begindocumentsubhook@#1}{}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
UD@nameAtBeginDocument{@begindocumentsubhook@#1}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}{%
@latex@error{Sub-Hook `#1' already definedon@line}{%
Use either stringRemoveAtBeginDocumentSubHookspace for removing the sub-hook,MessageBreak
or stringReplaceContentOfAtBeginDocumentSubHookspace for replacing the content of theMessageBreak
sub-hook,MessageBreak
or stringAddToContentOfAtBeginDocumentSubHookspace for adding tokens to the sub-hook.%
}%
}%
}%
%%----------------------------------------------------------------------
%% Replace all tokens of an AtBeginDocument-sub-hook:
%%......................................................................
%% ReplaceContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to deliver <tokens>.
newcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{To be replaced stringAtBeginDocument-sub-hookMessageBreak`#1' does not exist}%
AtBeginDocumentSubHook{#1}{#2}%
}{%
@latex@info{Replacing stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
%%----------------------------------------------------------------------
%% Add tokens to an AtBeginDocument-sub-hook:
%%......................................................................
%% AddToContentOfAtBeginDocumentSubHook{<name of AtBeginDocument-sub-hook>}%
%% {<prepend-tokens>}%
%% {<append-tokens>}%
%% Redefines the AtBeginDocument-sub-hook whose name is
%% <name of AtBeginDocument-sub-hook> to additionally deliver <prepend-tokens>
%% in front of the tokens that are already in this hook and to additionally
%% deliver <append-tokens> behind the tokens that are already in this hook.
newcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@ifundefined{@begindocumentsubhook@#1}{%
@latex@info{stringAtBeginDocument-sub-hook `#1' where tokensMessageBreak shall be added does not exist}%
AtBeginDocumentSubHook{#1}{#2#3}%
}{%
@latex@info{Adding tokens to stringAtBeginDocument-sub-hookMessageBreak`#1'}%
expandafterUD@Exchangeexpandafter{%
expandaftertoks@expandafter{thetoks@}%
}{%
toks@{#2}%
toks@expandafterexpandafterexpandafter
expandafterexpandafterexpandafterexpandafter{%
UD@nametheexpandaftertoks@{@begindocumentsubhook@#1}#3%
}%
UD@namexdef{@begindocumentsubhook@#1}{thetoks@}%
}%
}%
}%
AtBeginDocument{%
renewcommandRemoveAtBeginDocumentSubHook[1]{%
@bsphack
UD@namegloballet{@begindocumentsubhook@#1}=UndEFineD
@latex@info{Removal of stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
}%
renewcommandAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Introducing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandReplaceContentOfAtBeginDocumentSubHook[2]{%
@bsphack
@latex@info{Replacing stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2%
}%
renewcommandAddToContentOfAtBeginDocumentSubHook[3]{%
@bsphack
@latex@info{Adding to stringAtBeginDocument-sub-hook `#1'MessageBreak obsolete as not in preamble any more}%
@esphack
#2#3%
}%
}%
makeatother
%expandaftershowcsname @begindocumenthookendcsname
AtBeginDocumentSubHook{SomeSubHook}{Somepar}
AtBeginDocumentSubHook{FirstSubHook}{Firstpar}
AtBeginDocumentSubHook{SecondSubHook}{Secondpar}
AtBeginDocumentSubHook{ThirdSubHook}{Thirdpar}
AtBeginDocumentSubHook{FourthSubHook}{Fourthpar}
% Let's cancel/change some of the above at this point
RemoveAtBeginDocumentSubHook{SomeSubHook}
ReplaceContentOfAtBeginDocumentSubHook{FirstSubHook}{New Firstpar}
ReplaceContentOfAtBeginDocumentSubHook{SecondSubHook}{New Secondpar}
ReplaceContentOfAtBeginDocumentSubHook{ThirdSubHook}{Thi}
AddToContentOfAtBeginDocumentSubHook{ThirdSubHook}{New }{rdpar}
%expandaftershowcsname @begindocumenthookendcsname
begin{document}
end{document}
edited Dec 16 at 10:29
answered Dec 16 at 0:40
Ulrich Diez
4,050615
4,050615
add a comment |
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f464682%2fhow-do-i-reset-the-current-atbegindocument%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown