About the the question of implementation and interface, I just developed my "environment with hooks" I posted here a few years ago, as a LaTeX2e .sty file, developed in an "object oriented" style, with names like \Environment/@error and so on. This works out quite nicely. The user style is like \Environment{LaTeX}{equation} using the name \Environment as a "constructor" for converting an old LaTeX environment "equation" to one of the new type. This definition then calls the name \Environment/@def/LaTeX with the "@" indicating that the name "def" is private to the locality "Environment/". More or less, this is C++ terminology straight on. Some specs: The environments can execute commands both before and after each of the \begingroup and \endgroup environment commands, and all of these four possible commands can take arguments, with definitions of the form \new{Environment}% {foo}par1{before cmds}{begin cmds}par2{end cmds}{after cmds} where the first parameter block par1 (like "#1#2..") is used by both the before and begin commands, and the second parameter block par2 is used by both the end and after commands, so one can send arguments to these commands quite freely. The environments also keep track of environments nested in the definition of another environment. It is also possible to, as a user command, to exclude the name in the endgroup (corresponding to constructs like "\begin{foo} .. \end{}"). If I get time, I might work this up to something more serious -- perhaps introducing the ability of creating environments with optional arguments. Hans Aberg