Environment decorators












8















I'm looking for a way to write a "decorator" (in Python terminology) or a "wrapper" for LaTeX environments: a way to give addition behaviour with save of the notation. For example, before every begin{quote} execute a code that will add a hrule.



I could make it for a single command using let:



letoldCommandcommandIWantToDecorate
defcommandIWantToDecorate#1{<addition code>oldCommand{#1}}


That will execute <addition code> without the need to change the command throughout the document.



Is there a similar way to decorate the whole environment? Maybe LaTeX creates some inner macros I can work with?



UPD the question Can I redefine a command to contain itself? doesn't solve my problem, because I'm interested in redefining environments, not solo macros.



The etoolbox package partly solve the problem, thanks @samcarter!



But in "education" reasons I'm interesting is there a way to do decorate without additional packages, using just (La)TeX pre-build commands?










share|improve this question




















  • 2





    Possible duplicate of Can I redefine a command to contain itself?

    – Timothy Truckle
    Dec 26 '18 at 19:26











  • Welcome to TeX.Stackexchange!

    – user36296
    Dec 26 '18 at 19:31











  • By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

    – user31729
    Dec 26 '18 at 21:10
















8















I'm looking for a way to write a "decorator" (in Python terminology) or a "wrapper" for LaTeX environments: a way to give addition behaviour with save of the notation. For example, before every begin{quote} execute a code that will add a hrule.



I could make it for a single command using let:



letoldCommandcommandIWantToDecorate
defcommandIWantToDecorate#1{<addition code>oldCommand{#1}}


That will execute <addition code> without the need to change the command throughout the document.



Is there a similar way to decorate the whole environment? Maybe LaTeX creates some inner macros I can work with?



UPD the question Can I redefine a command to contain itself? doesn't solve my problem, because I'm interested in redefining environments, not solo macros.



The etoolbox package partly solve the problem, thanks @samcarter!



But in "education" reasons I'm interesting is there a way to do decorate without additional packages, using just (La)TeX pre-build commands?










share|improve this question




















  • 2





    Possible duplicate of Can I redefine a command to contain itself?

    – Timothy Truckle
    Dec 26 '18 at 19:26











  • Welcome to TeX.Stackexchange!

    – user36296
    Dec 26 '18 at 19:31











  • By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

    – user31729
    Dec 26 '18 at 21:10














8












8








8


2






I'm looking for a way to write a "decorator" (in Python terminology) or a "wrapper" for LaTeX environments: a way to give addition behaviour with save of the notation. For example, before every begin{quote} execute a code that will add a hrule.



I could make it for a single command using let:



letoldCommandcommandIWantToDecorate
defcommandIWantToDecorate#1{<addition code>oldCommand{#1}}


That will execute <addition code> without the need to change the command throughout the document.



Is there a similar way to decorate the whole environment? Maybe LaTeX creates some inner macros I can work with?



UPD the question Can I redefine a command to contain itself? doesn't solve my problem, because I'm interested in redefining environments, not solo macros.



The etoolbox package partly solve the problem, thanks @samcarter!



But in "education" reasons I'm interesting is there a way to do decorate without additional packages, using just (La)TeX pre-build commands?










share|improve this question
















I'm looking for a way to write a "decorator" (in Python terminology) or a "wrapper" for LaTeX environments: a way to give addition behaviour with save of the notation. For example, before every begin{quote} execute a code that will add a hrule.



I could make it for a single command using let:



letoldCommandcommandIWantToDecorate
defcommandIWantToDecorate#1{<addition code>oldCommand{#1}}


That will execute <addition code> without the need to change the command throughout the document.



Is there a similar way to decorate the whole environment? Maybe LaTeX creates some inner macros I can work with?



UPD the question Can I redefine a command to contain itself? doesn't solve my problem, because I'm interested in redefining environments, not solo macros.



The etoolbox package partly solve the problem, thanks @samcarter!



But in "education" reasons I'm interesting is there a way to do decorate without additional packages, using just (La)TeX pre-build commands?







macros environments






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Dec 26 '18 at 19:40







Anton Lioznov

















asked Dec 26 '18 at 19:24









Anton LioznovAnton Lioznov

13815




13815








  • 2





    Possible duplicate of Can I redefine a command to contain itself?

    – Timothy Truckle
    Dec 26 '18 at 19:26











  • Welcome to TeX.Stackexchange!

    – user36296
    Dec 26 '18 at 19:31











  • By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

    – user31729
    Dec 26 '18 at 21:10














  • 2





    Possible duplicate of Can I redefine a command to contain itself?

    – Timothy Truckle
    Dec 26 '18 at 19:26











  • Welcome to TeX.Stackexchange!

    – user36296
    Dec 26 '18 at 19:31











  • By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

    – user31729
    Dec 26 '18 at 21:10








2




2





Possible duplicate of Can I redefine a command to contain itself?

– Timothy Truckle
Dec 26 '18 at 19:26





Possible duplicate of Can I redefine a command to contain itself?

– Timothy Truckle
Dec 26 '18 at 19:26













Welcome to TeX.Stackexchange!

– user36296
Dec 26 '18 at 19:31





Welcome to TeX.Stackexchange!

– user36296
Dec 26 '18 at 19:31













By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

– user31729
Dec 26 '18 at 21:10





By the way, your let - version above would work for the environment starter macro as well, unless it has optional arguments -- then problems will appear

– user31729
Dec 26 '18 at 21:10










2 Answers
2






active

oldest

votes


















11














The LaTeX kernel provides g@addto@macro which works for the environment starter command as well, i.e. for the environment quote the start macro is quote, so say g@addto@macroquote{foo} etc.



No extra packages are needed for this, apart from the specific additions that are to be made, but that depends on personal choices of the O.P, but in general 'anything' can be placed in g@addto@macroquote{...}.



letoldquotequote
renewcommand{quote}{fooadditionoldquote}


would work as well, but this may fail for other environments that have optional arguments. In this case, LetLtxMacro from letltxmacro package is needed, which means another package, however.



documentclass{book}

makeatletter
g@addto@macroquote{hrule
medskip

textit{be careful}

medskip

Now the real stuff beginsdots

}
makeatother

begin{document}

begin{quote}
test
end{quote}

end{document}


enter image description here






share|improve this answer

































    10














    Have a look at the etoolbox package, in particular to its AtBeginEnvironment command. This allows you to add aditional code to the begin of environment.



    documentclass{book}

    usepackage{etoolbox}
    AtBeginEnvironment{quote}{hrule}

    begin{document}

    begin{quote}
    test
    end{quote}

    end{document}





    share|improve this answer
























      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
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f467435%2fenvironment-decorators%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      11














      The LaTeX kernel provides g@addto@macro which works for the environment starter command as well, i.e. for the environment quote the start macro is quote, so say g@addto@macroquote{foo} etc.



      No extra packages are needed for this, apart from the specific additions that are to be made, but that depends on personal choices of the O.P, but in general 'anything' can be placed in g@addto@macroquote{...}.



      letoldquotequote
      renewcommand{quote}{fooadditionoldquote}


      would work as well, but this may fail for other environments that have optional arguments. In this case, LetLtxMacro from letltxmacro package is needed, which means another package, however.



      documentclass{book}

      makeatletter
      g@addto@macroquote{hrule
      medskip

      textit{be careful}

      medskip

      Now the real stuff beginsdots

      }
      makeatother

      begin{document}

      begin{quote}
      test
      end{quote}

      end{document}


      enter image description here






      share|improve this answer






























        11














        The LaTeX kernel provides g@addto@macro which works for the environment starter command as well, i.e. for the environment quote the start macro is quote, so say g@addto@macroquote{foo} etc.



        No extra packages are needed for this, apart from the specific additions that are to be made, but that depends on personal choices of the O.P, but in general 'anything' can be placed in g@addto@macroquote{...}.



        letoldquotequote
        renewcommand{quote}{fooadditionoldquote}


        would work as well, but this may fail for other environments that have optional arguments. In this case, LetLtxMacro from letltxmacro package is needed, which means another package, however.



        documentclass{book}

        makeatletter
        g@addto@macroquote{hrule
        medskip

        textit{be careful}

        medskip

        Now the real stuff beginsdots

        }
        makeatother

        begin{document}

        begin{quote}
        test
        end{quote}

        end{document}


        enter image description here






        share|improve this answer




























          11












          11








          11







          The LaTeX kernel provides g@addto@macro which works for the environment starter command as well, i.e. for the environment quote the start macro is quote, so say g@addto@macroquote{foo} etc.



          No extra packages are needed for this, apart from the specific additions that are to be made, but that depends on personal choices of the O.P, but in general 'anything' can be placed in g@addto@macroquote{...}.



          letoldquotequote
          renewcommand{quote}{fooadditionoldquote}


          would work as well, but this may fail for other environments that have optional arguments. In this case, LetLtxMacro from letltxmacro package is needed, which means another package, however.



          documentclass{book}

          makeatletter
          g@addto@macroquote{hrule
          medskip

          textit{be careful}

          medskip

          Now the real stuff beginsdots

          }
          makeatother

          begin{document}

          begin{quote}
          test
          end{quote}

          end{document}


          enter image description here






          share|improve this answer















          The LaTeX kernel provides g@addto@macro which works for the environment starter command as well, i.e. for the environment quote the start macro is quote, so say g@addto@macroquote{foo} etc.



          No extra packages are needed for this, apart from the specific additions that are to be made, but that depends on personal choices of the O.P, but in general 'anything' can be placed in g@addto@macroquote{...}.



          letoldquotequote
          renewcommand{quote}{fooadditionoldquote}


          would work as well, but this may fail for other environments that have optional arguments. In this case, LetLtxMacro from letltxmacro package is needed, which means another package, however.



          documentclass{book}

          makeatletter
          g@addto@macroquote{hrule
          medskip

          textit{be careful}

          medskip

          Now the real stuff beginsdots

          }
          makeatother

          begin{document}

          begin{quote}
          test
          end{quote}

          end{document}


          enter image description here







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Dec 27 '18 at 12:39

























          answered Dec 26 '18 at 20:58







          user31729






























              10














              Have a look at the etoolbox package, in particular to its AtBeginEnvironment command. This allows you to add aditional code to the begin of environment.



              documentclass{book}

              usepackage{etoolbox}
              AtBeginEnvironment{quote}{hrule}

              begin{document}

              begin{quote}
              test
              end{quote}

              end{document}





              share|improve this answer




























                10














                Have a look at the etoolbox package, in particular to its AtBeginEnvironment command. This allows you to add aditional code to the begin of environment.



                documentclass{book}

                usepackage{etoolbox}
                AtBeginEnvironment{quote}{hrule}

                begin{document}

                begin{quote}
                test
                end{quote}

                end{document}





                share|improve this answer


























                  10












                  10








                  10







                  Have a look at the etoolbox package, in particular to its AtBeginEnvironment command. This allows you to add aditional code to the begin of environment.



                  documentclass{book}

                  usepackage{etoolbox}
                  AtBeginEnvironment{quote}{hrule}

                  begin{document}

                  begin{quote}
                  test
                  end{quote}

                  end{document}





                  share|improve this answer













                  Have a look at the etoolbox package, in particular to its AtBeginEnvironment command. This allows you to add aditional code to the begin of environment.



                  documentclass{book}

                  usepackage{etoolbox}
                  AtBeginEnvironment{quote}{hrule}

                  begin{document}

                  begin{quote}
                  test
                  end{quote}

                  end{document}






                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 26 '18 at 19:29









                  user36296user36296

                  1




                  1






























                      draft saved

                      draft discarded




















































                      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.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f467435%2fenvironment-decorators%23new-answer', 'question_page');
                      }
                      );

                      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







                      Popular posts from this blog

                      Le Mesnil-Réaume

                      Ida-Boy-Ed-Garten

                      web3.py web3.isConnected() returns false always