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









New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 2




    Possible duplicate of Can I redefine a command to contain itself?
    – Timothy Truckle
    yesterday










  • Welcome to TeX.Stackexchange!
    – samcarter
    yesterday










  • 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
    – Christian Hupfer
    yesterday
















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









New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 2




    Possible duplicate of Can I redefine a command to contain itself?
    – Timothy Truckle
    yesterday










  • Welcome to TeX.Stackexchange!
    – samcarter
    yesterday










  • 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
    – Christian Hupfer
    yesterday














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









New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











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









New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited yesterday





















New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked yesterday









Anton Lioznov

434




434




New contributor




Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Anton Lioznov is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 2




    Possible duplicate of Can I redefine a command to contain itself?
    – Timothy Truckle
    yesterday










  • Welcome to TeX.Stackexchange!
    – samcarter
    yesterday










  • 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
    – Christian Hupfer
    yesterday














  • 2




    Possible duplicate of Can I redefine a command to contain itself?
    – Timothy Truckle
    yesterday










  • Welcome to TeX.Stackexchange!
    – samcarter
    yesterday










  • 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
    – Christian Hupfer
    yesterday








2




2




Possible duplicate of Can I redefine a command to contain itself?
– Timothy Truckle
yesterday




Possible duplicate of Can I redefine a command to contain itself?
– Timothy Truckle
yesterday












Welcome to TeX.Stackexchange!
– samcarter
yesterday




Welcome to TeX.Stackexchange!
– samcarter
yesterday












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
– Christian Hupfer
yesterday




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
– Christian Hupfer
yesterday










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


      }
      });






      Anton Lioznov is a new contributor. Be nice, and check out our Code of Conduct.










      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 15 hours ago

























          answered yesterday









          Christian Hupfer

          147k14192384




          147k14192384























              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 yesterday









                  samcarter

                  85.6k794274




                  85.6k794274






















                      Anton Lioznov is a new contributor. Be nice, and check out our Code of Conduct.










                      draft saved

                      draft discarded


















                      Anton Lioznov is a new contributor. Be nice, and check out our Code of Conduct.













                      Anton Lioznov is a new contributor. Be nice, and check out our Code of Conduct.












                      Anton Lioznov is a new contributor. Be nice, and check out our Code of Conduct.
















                      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.




                      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

                      Monofisismo

                      Angular Downloading a file using contenturl with Basic Authentication

                      Olmecas