| % atbeginend.sty |
| % |
| % defines |
| % \BeforeBegin{environment}{code-to-execute} |
| % \BeforeEnd {environment}{code-to-execute} |
| % \AfterBegin {environment}{code-to-execute} |
| % \AfterEnd {environment}{code-to-execute} |
| % |
| % Save \begin and \end to \BeginEnvironment and \EndEnvironment |
| \let\BeginEnvironment=\begin |
| \let\EndEnvironment=\end |
| |
| \def\IfUnDef#1{\expandafter\ifx\csname#1\endcsname\relax} |
| |
| % Null command needed to for \nothing{something}=.nothing. |
| \def\NullCom#1{} |
| |
| \def\begin#1{% |
| % |
| % if defined \BeforeBeg for this environment, execute it |
| \IfUnDef{BeforeBeg#1}\else\csname BeforeBeg#1\endcsname\fi% |
| % |
| % |
| % |
| \IfUnDef{AfterBeg#1}% This is done to skip the command for environments |
| % which can take arguments, like multicols; YOU MUST NOT |
| % USE \AfterBegin{...}{...} for such environments! |
| \let\SaveBegEng=\BeginEnvironment% |
| \else% |
| % Start this environment |
| \BeginEnvironment{#1}% |
| % and execute code after \begin{environment} |
| \csname AfterBeg#1\endcsname% |
| % |
| \let\SaveBegEng=\NullCom% |
| \fi% |
| \SaveBegEng{#1}% |
| } |
| |
| |
| \def\end#1{% |
| % |
| % execute code before \end{environment} |
| \IfUnDef{BeforeEnd#1}\else\csname BeforeEnd#1\endcsname\fi% |
| % |
| % close this environment |
| \EndEnvironment{#1}% |
| % |
| % and execute code after \begin{environment} |
| \IfUnDef{AfterEnd#1}\else\csname AfterEnd#1\endcsname\fi% |
| } |
| |
| |
| %% Now, define commands |
| % \BeforeBegin{environment}{code-to-execute} |
| % \BeforeEnd {environment}{code-to-execute} |
| % \AfterBegin {environment}{code-to-execute} |
| % \AfterEnd {environment}{code-to-execute} |
| |
| \def\BeforeBegin#1#2{\expandafter\gdef\csname BeforeBeg#1\endcsname |
| {#2}} |
| \def\BeforeEnd #1#2{\expandafter\gdef\csname BeforeEnd#1\endcsname |
| {#2}} |
| \def\AfterBegin #1#2{\expandafter\gdef\csname AfterBeg#1\endcsname {#2}} |
| \def\AfterEnd #1#2{\expandafter\gdef\csname AfterEnd#1\endcsname{#2}} |