diff options
author | Karl Berry <karl@freefriends.org> | 2016-04-02 21:43:35 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-04-02 21:43:35 +0000 |
commit | dddb3ce03f2d2bde094879b3ed56d17d0c7b871d (patch) | |
tree | 82a59cde8a1735eff6a73e62bbd47d0d990b9629 /Master/texmf-dist/tex/latex/bxenclose | |
parent | 0add57ee639971ed36026142db8ace9bb613d7af (diff) |
bxenclose (2apr16)
git-svn-id: svn://tug.org/texlive/trunk@40213 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/bxenclose')
-rw-r--r-- | Master/texmf-dist/tex/latex/bxenclose/bxenclose.sty | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/bxenclose/bxenclose.sty b/Master/texmf-dist/tex/latex/bxenclose/bxenclose.sty new file mode 100644 index 00000000000..75acfa0ce68 --- /dev/null +++ b/Master/texmf-dist/tex/latex/bxenclose/bxenclose.sty @@ -0,0 +1,126 @@ +% bxenclose.sty + +%% package declaration +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{bxenclose}[2016/04/01 v0.2] +\def\bxew@pkgame{bxenclose} + +%--------------------------------------- main + +%% \bxew@begin@body@hook +% Things to be prepended to the document body. +\let\bxew@begin@body@hook\@empty +%% \bxew@end@body@hook +% Things to be appended to the document body. +\let\bxew@end@body@hook\@empty + +% The insertion of \bxew@begin@body@hook is realized by appending +% the token to \document macro. But of course there are dozens of +% packages that do the same thing, and in order to "win the race" +% and put \bxew@begin@body@hook immediately before the actual body +% content, I need to postpone the patching to \document as late as +% possible. Hence comes my tactics, where the patching will be done +% in invocation of "\begin{document}", just before expanding the +% \document macro. + +%%<*> \enclosebodywith{<begin>}{<end>} +\@onlypreamble\enclosebodywith +\newcommand\enclosebodywith[2]{% + \begingroup + \ifx\bxew@patch@begin\@undefined\else + \bxew@patch@begin + \fi + \toks@\expandafter{\bxew@begin@body@hook}% + \toks\tw@{#1}% + \xdef\bxew@begin@body@hook{% + \the\toks@\the\toks\tw@}% + \toks@\expandafter{\bxew@end@body@hook}% + \toks\tw@{#2}% + \xdef\bxew@end@body@hook{% + \the\toks\tw@\the\toks@}% + \endgroup +} + +%% \bxew@patch@begin +% Patches to \begin macro. Specifically, it prepends +% "\bxew@begin@hook{#1}" to \begin. +\def\bxew@patch@begin{% + \global\let\bxew@patch@begin\@undefined % one-shot + \begingroup + \toks@\expandafter{\begin{##1}}% + \edef\bxew@tempa{\gdef\noexpand\begin####1{% + \noexpand\bxew@begin@hook{####1}\the\toks@}}% + \bxew@tempa + \endgroup +} + +%% \bxew@unpatch@begin +% Revokes the patch of \bxew@patch@begin. That is, it removes +% "\bxew@begin@hook{#1}" from \begin macro. +\def\bxew@unpatch@begin{% + \global\let\bxew@unpatch@begin\@undefined % one-shot + \begingroup + % check the target + \long\def\bxew@tempa##1\bxew@begin@hook##2##3\bxew@end{% + \def\bxew@tempa{##2}}% + \expandafter\bxew@tempa\begin{}\bxew@begin@hook!\bxew@end + \ifx\bxew@tempa\@empty % if target is there + \long\def\bxew@tempa##1\bxew@begin@hook##2{##1}% + \toks@\expandafter\expandafter\expandafter + {\expandafter\bxew@tempa\begin{##1}}% + \edef\bxew@tempa{\gdef\noexpand\begin####1{\the\toks@}}% + \bxew@tempa + \fi % if not there, then do nothing + \endgroup +} + +%% \bxew@begin@hook{<envname>} +% The patch attached to \begin. When "\begin{document}" +% is called, this macro patches to \document, before +% \document is expanded. +\def\bxew@begin@hook#1{% + \begingroup + \def\bxew@tempa{#1}\def\bxew@tempb{document}% + \ifx\bxew@tempa\bxew@tempb % if it is \begin{document} + % just in case unpatching failed + \global\let\bxew@begin@hook\@gobble % neutralize + \bxew@unpatch@begin + \bxew@patch@document + \fi + \endgroup +} + +%% \bxew@patch@document +% Appends something and \bxew@begin@body@hook to \document macro. +\def\bxew@patch@document{% + \begingroup + \global\let\bxew@patch@document\@undefined % one-shot + \g@addto@macro\document{% + \bxew@patch@enddocument + % and \bxew@begin@body@hook will come last + \let\reserved@a\bxew@begin@body@hook + \global\let\bxew@begin@body@hook\@undefined + \reserved@a}% + \endgroup +} + +% Just like \bxew@begin@body@hook, prepending \bxew@end@body@hook +% to \enddocument need to be deferred as much as possible. So I +% decided to patch \enddocument just before executing the +% \bxew@begin@body@hook macro. + +%% \bxew@patch@enddocument +% Prepends \bxew@end@body@hook to \enddocument. +\def\bxew@patch@enddocument{% + \global\let\bxew@patch@enddocument\@undefined % one-shot + \begingroup + \toks@\expandafter{\enddocument}% + \toks\tw@{\bxew@end@body@hook + \global\let\bxew@end@body@hook\@undefined}% + \xdef\enddocument{\the\toks\tw@\the\toks@}% + \endgroup +} + +%--------------------------------------- done +\endinput +%% EOF |