Loop over an optional argument












7















I'd like to use the command foo with an optional argument to step and print the counter value iterated according to the number passed.



So, for example, foo[5] should step the counter 5 times, one by one.



(!) Note that it is not the same as stepcounter{}{5}.



MWE



documentclass{report}

newcounter{mycount}
setcounter{mycount}{0}
newcommand{foo}{stepcounter{mycount}counter is textbf{themycount}}

begin{document}
first use: foo

second use: foo

now using with option to iterate: foo[2]

medskip

textit{desired output from line above should be:}

medskip

now using with option to iterate: counter is textbf{3,4}

end{document}


enter image description here










share|improve this question



























    7















    I'd like to use the command foo with an optional argument to step and print the counter value iterated according to the number passed.



    So, for example, foo[5] should step the counter 5 times, one by one.



    (!) Note that it is not the same as stepcounter{}{5}.



    MWE



    documentclass{report}

    newcounter{mycount}
    setcounter{mycount}{0}
    newcommand{foo}{stepcounter{mycount}counter is textbf{themycount}}

    begin{document}
    first use: foo

    second use: foo

    now using with option to iterate: foo[2]

    medskip

    textit{desired output from line above should be:}

    medskip

    now using with option to iterate: counter is textbf{3,4}

    end{document}


    enter image description here










    share|improve this question

























      7












      7








      7


      2






      I'd like to use the command foo with an optional argument to step and print the counter value iterated according to the number passed.



      So, for example, foo[5] should step the counter 5 times, one by one.



      (!) Note that it is not the same as stepcounter{}{5}.



      MWE



      documentclass{report}

      newcounter{mycount}
      setcounter{mycount}{0}
      newcommand{foo}{stepcounter{mycount}counter is textbf{themycount}}

      begin{document}
      first use: foo

      second use: foo

      now using with option to iterate: foo[2]

      medskip

      textit{desired output from line above should be:}

      medskip

      now using with option to iterate: counter is textbf{3,4}

      end{document}


      enter image description here










      share|improve this question














      I'd like to use the command foo with an optional argument to step and print the counter value iterated according to the number passed.



      So, for example, foo[5] should step the counter 5 times, one by one.



      (!) Note that it is not the same as stepcounter{}{5}.



      MWE



      documentclass{report}

      newcounter{mycount}
      setcounter{mycount}{0}
      newcommand{foo}{stepcounter{mycount}counter is textbf{themycount}}

      begin{document}
      first use: foo

      second use: foo

      now using with option to iterate: foo[2]

      medskip

      textit{desired output from line above should be:}

      medskip

      now using with option to iterate: counter is textbf{3,4}

      end{document}


      enter image description here







      macros counters loops






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 18 at 23:45









      SigurSigur

      25.6k456139




      25.6k456139






















          5 Answers
          5






          active

          oldest

          votes


















          8














          With expl3 it's just a few lines.



          documentclass{report}
          usepackage{xparse}

          newcounter{mycount}
          setcounter{mycount}{0}

          ExplSyntaxOn
          NewDocumentCommand{foo}{O{1}}
          {
          int_compare:nT { #1 > 0 }
          {
          int_compare:nTF { #1 = 1 } {counter~is} {counters~are}~
          stepcounter{mycount}
          textbf{themycount}
          prg_replicate:nn { #1 - 1 } {,stepcounter{mycount}textbf{themycount}}
          }
          }
          ExplSyntaxOff

          begin{document}
          first use: foo

          second use: foo

          now using with option to iterate: foo[2]

          now using with option to iterate: counters are textbf{3,4}

          foo[5]

          end{document}


          The trick is to do the first iteration and then proceed again adding first a comma.



          If the number passed is zero or less nothing happens.



          enter image description here






          share|improve this answer


























          • Exactly what I need.

            – Sigur
            Jan 18 at 23:56











          • Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

            – Sigur
            Jan 18 at 23:57






          • 2





            @Sigur Your wish is my command. Updated.

            – egreg
            Jan 19 at 0:03











          • Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

            – Sigur
            Jan 19 at 0:08



















          4














          Here is short code with multido, xparse and etoolbox:



          documentclass{report}
          usepackage{multido}
          usepackage{xparse, etoolbox}
          newcounter{mycount}
          setcounter{mycount}{0}
          NewDocumentCommand{foo}{O{1}}{counter is multido{i=1+1}{#1}{stepcounter{mycount}textbf{themycount}ifnumless{multidocount}{#1}{,,}{.}}}

          begin{document}

          first use: foo

          second use: foo

          now using with option to iterate: foo[5]

          end{document}


          enter image description here






          share|improve this answer































            3














            Here is an approach using multido for looping and a delayed delimiter definition:



            enter image description here



            documentclass{article}

            usepackage{multido}

            newcounter{mycount}

            newcommand{foo}[1][1]{%
            counter%
            ifnum#1>1relax s areelse space isfi
            space
            % https://tex.stackexchange.com/a/89187/5764
            defitemdelim{unskipspacedefitemdelim{,space}}% Item delimiter delayed by one cycle
            {bfseriesmultido{i=1+1}{#1}{itemdelim stepcounter{mycount}themycount}}%
            }

            begin{document}

            first use: foo

            second use: foo

            now using with option to iterate: foo[2]

            medskip

            textit{desired output from line above should be:}

            medskip

            now using with option to iterate: counters are textbf{3, 4}

            end{document}





            share|improve this answer
























            • This solution is more understandable to me... but I had never done it by myself. Very nice.

              – Sigur
              Jan 19 at 0:11



















            3














            With pgffor it is even less lines.



            documentclass{report}
            usepackage{pgffor}
            newcounter{mycount}
            setcounter{mycount}{0}
            newcommand{foo}[1][1]{counter is foreach X [count=Y] in
            {1,...,#1}{stepcounter{mycount}%
            textbf{themycount}ifnumY=#1%
            else%
            ,fi}}

            begin{document}
            first use: foo

            second use: foo

            now using with option to iterate: foo[2]

            end{document}


            enter image description here






            share|improve this answer

































              1














              A bit more code but without additional packages:



              documentclass{report}

              newcounter{mycount}
              setcounter{mycount}{0}

              newcommandExchange[2]{#2#1}%
              newcommand{foo}[1][1]{fooloop{#1}{}{counter value is}}
              makeatletter
              newcommand{fooloop}[3]{%
              ifnum#1>0 stepcounter{mycount}fi
              ifnum#1>1 expandafter@firstoftwoelseexpandafter@secondoftwofi
              {%
              begingroup
              protected@edef@tempa{themycount}%
              c@mycount=#1relax
              advancec@mycount by -1relax
              expandafterendgroup
              expandafterfooloopexpandafter
              {numberexpandafterc@mycountexpandafter}expandafter
              {romannumeral0expandafterExchangeexpandafter{@tempa}{ #2}, }%
              {counter values are}%
              }{%
              #3 textbf{#2themycount}%
              }%
              }%
              makeatother

              begin{document}
              first use: foo

              second use: foo

              now using with option to iterate: foo[4]

              medskip

              textit{desired output from line above should be:}

              medskip

              now using with option to iterate: counter values are textbf{3, 4, 5, 6}

              medskip

              now using with option to iterate 0 times---counter is unchanged and displayed: foo[0]

              medskip

              now using with option to iterate -1 times---counter is unchanged and displayed: foo[-1]

              end{document}


              enter image description here






              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%2f470788%2floop-over-an-optional-argument%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                5 Answers
                5






                active

                oldest

                votes








                5 Answers
                5






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                8














                With expl3 it's just a few lines.



                documentclass{report}
                usepackage{xparse}

                newcounter{mycount}
                setcounter{mycount}{0}

                ExplSyntaxOn
                NewDocumentCommand{foo}{O{1}}
                {
                int_compare:nT { #1 > 0 }
                {
                int_compare:nTF { #1 = 1 } {counter~is} {counters~are}~
                stepcounter{mycount}
                textbf{themycount}
                prg_replicate:nn { #1 - 1 } {,stepcounter{mycount}textbf{themycount}}
                }
                }
                ExplSyntaxOff

                begin{document}
                first use: foo

                second use: foo

                now using with option to iterate: foo[2]

                now using with option to iterate: counters are textbf{3,4}

                foo[5]

                end{document}


                The trick is to do the first iteration and then proceed again adding first a comma.



                If the number passed is zero or less nothing happens.



                enter image description here






                share|improve this answer


























                • Exactly what I need.

                  – Sigur
                  Jan 18 at 23:56











                • Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                  – Sigur
                  Jan 18 at 23:57






                • 2





                  @Sigur Your wish is my command. Updated.

                  – egreg
                  Jan 19 at 0:03











                • Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                  – Sigur
                  Jan 19 at 0:08
















                8














                With expl3 it's just a few lines.



                documentclass{report}
                usepackage{xparse}

                newcounter{mycount}
                setcounter{mycount}{0}

                ExplSyntaxOn
                NewDocumentCommand{foo}{O{1}}
                {
                int_compare:nT { #1 > 0 }
                {
                int_compare:nTF { #1 = 1 } {counter~is} {counters~are}~
                stepcounter{mycount}
                textbf{themycount}
                prg_replicate:nn { #1 - 1 } {,stepcounter{mycount}textbf{themycount}}
                }
                }
                ExplSyntaxOff

                begin{document}
                first use: foo

                second use: foo

                now using with option to iterate: foo[2]

                now using with option to iterate: counters are textbf{3,4}

                foo[5]

                end{document}


                The trick is to do the first iteration and then proceed again adding first a comma.



                If the number passed is zero or less nothing happens.



                enter image description here






                share|improve this answer


























                • Exactly what I need.

                  – Sigur
                  Jan 18 at 23:56











                • Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                  – Sigur
                  Jan 18 at 23:57






                • 2





                  @Sigur Your wish is my command. Updated.

                  – egreg
                  Jan 19 at 0:03











                • Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                  – Sigur
                  Jan 19 at 0:08














                8












                8








                8







                With expl3 it's just a few lines.



                documentclass{report}
                usepackage{xparse}

                newcounter{mycount}
                setcounter{mycount}{0}

                ExplSyntaxOn
                NewDocumentCommand{foo}{O{1}}
                {
                int_compare:nT { #1 > 0 }
                {
                int_compare:nTF { #1 = 1 } {counter~is} {counters~are}~
                stepcounter{mycount}
                textbf{themycount}
                prg_replicate:nn { #1 - 1 } {,stepcounter{mycount}textbf{themycount}}
                }
                }
                ExplSyntaxOff

                begin{document}
                first use: foo

                second use: foo

                now using with option to iterate: foo[2]

                now using with option to iterate: counters are textbf{3,4}

                foo[5]

                end{document}


                The trick is to do the first iteration and then proceed again adding first a comma.



                If the number passed is zero or less nothing happens.



                enter image description here






                share|improve this answer















                With expl3 it's just a few lines.



                documentclass{report}
                usepackage{xparse}

                newcounter{mycount}
                setcounter{mycount}{0}

                ExplSyntaxOn
                NewDocumentCommand{foo}{O{1}}
                {
                int_compare:nT { #1 > 0 }
                {
                int_compare:nTF { #1 = 1 } {counter~is} {counters~are}~
                stepcounter{mycount}
                textbf{themycount}
                prg_replicate:nn { #1 - 1 } {,stepcounter{mycount}textbf{themycount}}
                }
                }
                ExplSyntaxOff

                begin{document}
                first use: foo

                second use: foo

                now using with option to iterate: foo[2]

                now using with option to iterate: counters are textbf{3,4}

                foo[5]

                end{document}


                The trick is to do the first iteration and then proceed again adding first a comma.



                If the number passed is zero or less nothing happens.



                enter image description here







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Jan 19 at 0:03

























                answered Jan 18 at 23:54









                egregegreg

                723k8819163219




                723k8819163219













                • Exactly what I need.

                  – Sigur
                  Jan 18 at 23:56











                • Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                  – Sigur
                  Jan 18 at 23:57






                • 2





                  @Sigur Your wish is my command. Updated.

                  – egreg
                  Jan 19 at 0:03











                • Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                  – Sigur
                  Jan 19 at 0:08



















                • Exactly what I need.

                  – Sigur
                  Jan 18 at 23:56











                • Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                  – Sigur
                  Jan 18 at 23:57






                • 2





                  @Sigur Your wish is my command. Updated.

                  – egreg
                  Jan 19 at 0:03











                • Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                  – Sigur
                  Jan 19 at 0:08

















                Exactly what I need.

                – Sigur
                Jan 18 at 23:56





                Exactly what I need.

                – Sigur
                Jan 18 at 23:56













                Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                – Sigur
                Jan 18 at 23:57





                Do you think is it possible to change the text also if there is argument? I mean, to print counters are 5,6,7,8 for example.

                – Sigur
                Jan 18 at 23:57




                2




                2





                @Sigur Your wish is my command. Updated.

                – egreg
                Jan 19 at 0:03





                @Sigur Your wish is my command. Updated.

                – egreg
                Jan 19 at 0:03













                Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                – Sigur
                Jan 19 at 0:08





                Oh, I think I should learn about NewDocumentCommand as soon as possible. Amazing and powerful.

                – Sigur
                Jan 19 at 0:08











                4














                Here is short code with multido, xparse and etoolbox:



                documentclass{report}
                usepackage{multido}
                usepackage{xparse, etoolbox}
                newcounter{mycount}
                setcounter{mycount}{0}
                NewDocumentCommand{foo}{O{1}}{counter is multido{i=1+1}{#1}{stepcounter{mycount}textbf{themycount}ifnumless{multidocount}{#1}{,,}{.}}}

                begin{document}

                first use: foo

                second use: foo

                now using with option to iterate: foo[5]

                end{document}


                enter image description here






                share|improve this answer




























                  4














                  Here is short code with multido, xparse and etoolbox:



                  documentclass{report}
                  usepackage{multido}
                  usepackage{xparse, etoolbox}
                  newcounter{mycount}
                  setcounter{mycount}{0}
                  NewDocumentCommand{foo}{O{1}}{counter is multido{i=1+1}{#1}{stepcounter{mycount}textbf{themycount}ifnumless{multidocount}{#1}{,,}{.}}}

                  begin{document}

                  first use: foo

                  second use: foo

                  now using with option to iterate: foo[5]

                  end{document}


                  enter image description here






                  share|improve this answer


























                    4












                    4








                    4







                    Here is short code with multido, xparse and etoolbox:



                    documentclass{report}
                    usepackage{multido}
                    usepackage{xparse, etoolbox}
                    newcounter{mycount}
                    setcounter{mycount}{0}
                    NewDocumentCommand{foo}{O{1}}{counter is multido{i=1+1}{#1}{stepcounter{mycount}textbf{themycount}ifnumless{multidocount}{#1}{,,}{.}}}

                    begin{document}

                    first use: foo

                    second use: foo

                    now using with option to iterate: foo[5]

                    end{document}


                    enter image description here






                    share|improve this answer













                    Here is short code with multido, xparse and etoolbox:



                    documentclass{report}
                    usepackage{multido}
                    usepackage{xparse, etoolbox}
                    newcounter{mycount}
                    setcounter{mycount}{0}
                    NewDocumentCommand{foo}{O{1}}{counter is multido{i=1+1}{#1}{stepcounter{mycount}textbf{themycount}ifnumless{multidocount}{#1}{,,}{.}}}

                    begin{document}

                    first use: foo

                    second use: foo

                    now using with option to iterate: foo[5]

                    end{document}


                    enter image description here







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Jan 19 at 0:32









                    BernardBernard

                    171k775203




                    171k775203























                        3














                        Here is an approach using multido for looping and a delayed delimiter definition:



                        enter image description here



                        documentclass{article}

                        usepackage{multido}

                        newcounter{mycount}

                        newcommand{foo}[1][1]{%
                        counter%
                        ifnum#1>1relax s areelse space isfi
                        space
                        % https://tex.stackexchange.com/a/89187/5764
                        defitemdelim{unskipspacedefitemdelim{,space}}% Item delimiter delayed by one cycle
                        {bfseriesmultido{i=1+1}{#1}{itemdelim stepcounter{mycount}themycount}}%
                        }

                        begin{document}

                        first use: foo

                        second use: foo

                        now using with option to iterate: foo[2]

                        medskip

                        textit{desired output from line above should be:}

                        medskip

                        now using with option to iterate: counters are textbf{3, 4}

                        end{document}





                        share|improve this answer
























                        • This solution is more understandable to me... but I had never done it by myself. Very nice.

                          – Sigur
                          Jan 19 at 0:11
















                        3














                        Here is an approach using multido for looping and a delayed delimiter definition:



                        enter image description here



                        documentclass{article}

                        usepackage{multido}

                        newcounter{mycount}

                        newcommand{foo}[1][1]{%
                        counter%
                        ifnum#1>1relax s areelse space isfi
                        space
                        % https://tex.stackexchange.com/a/89187/5764
                        defitemdelim{unskipspacedefitemdelim{,space}}% Item delimiter delayed by one cycle
                        {bfseriesmultido{i=1+1}{#1}{itemdelim stepcounter{mycount}themycount}}%
                        }

                        begin{document}

                        first use: foo

                        second use: foo

                        now using with option to iterate: foo[2]

                        medskip

                        textit{desired output from line above should be:}

                        medskip

                        now using with option to iterate: counters are textbf{3, 4}

                        end{document}





                        share|improve this answer
























                        • This solution is more understandable to me... but I had never done it by myself. Very nice.

                          – Sigur
                          Jan 19 at 0:11














                        3












                        3








                        3







                        Here is an approach using multido for looping and a delayed delimiter definition:



                        enter image description here



                        documentclass{article}

                        usepackage{multido}

                        newcounter{mycount}

                        newcommand{foo}[1][1]{%
                        counter%
                        ifnum#1>1relax s areelse space isfi
                        space
                        % https://tex.stackexchange.com/a/89187/5764
                        defitemdelim{unskipspacedefitemdelim{,space}}% Item delimiter delayed by one cycle
                        {bfseriesmultido{i=1+1}{#1}{itemdelim stepcounter{mycount}themycount}}%
                        }

                        begin{document}

                        first use: foo

                        second use: foo

                        now using with option to iterate: foo[2]

                        medskip

                        textit{desired output from line above should be:}

                        medskip

                        now using with option to iterate: counters are textbf{3, 4}

                        end{document}





                        share|improve this answer













                        Here is an approach using multido for looping and a delayed delimiter definition:



                        enter image description here



                        documentclass{article}

                        usepackage{multido}

                        newcounter{mycount}

                        newcommand{foo}[1][1]{%
                        counter%
                        ifnum#1>1relax s areelse space isfi
                        space
                        % https://tex.stackexchange.com/a/89187/5764
                        defitemdelim{unskipspacedefitemdelim{,space}}% Item delimiter delayed by one cycle
                        {bfseriesmultido{i=1+1}{#1}{itemdelim stepcounter{mycount}themycount}}%
                        }

                        begin{document}

                        first use: foo

                        second use: foo

                        now using with option to iterate: foo[2]

                        medskip

                        textit{desired output from line above should be:}

                        medskip

                        now using with option to iterate: counters are textbf{3, 4}

                        end{document}






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Jan 19 at 0:04









                        WernerWerner

                        446k699831689




                        446k699831689













                        • This solution is more understandable to me... but I had never done it by myself. Very nice.

                          – Sigur
                          Jan 19 at 0:11



















                        • This solution is more understandable to me... but I had never done it by myself. Very nice.

                          – Sigur
                          Jan 19 at 0:11

















                        This solution is more understandable to me... but I had never done it by myself. Very nice.

                        – Sigur
                        Jan 19 at 0:11





                        This solution is more understandable to me... but I had never done it by myself. Very nice.

                        – Sigur
                        Jan 19 at 0:11











                        3














                        With pgffor it is even less lines.



                        documentclass{report}
                        usepackage{pgffor}
                        newcounter{mycount}
                        setcounter{mycount}{0}
                        newcommand{foo}[1][1]{counter is foreach X [count=Y] in
                        {1,...,#1}{stepcounter{mycount}%
                        textbf{themycount}ifnumY=#1%
                        else%
                        ,fi}}

                        begin{document}
                        first use: foo

                        second use: foo

                        now using with option to iterate: foo[2]

                        end{document}


                        enter image description here






                        share|improve this answer






























                          3














                          With pgffor it is even less lines.



                          documentclass{report}
                          usepackage{pgffor}
                          newcounter{mycount}
                          setcounter{mycount}{0}
                          newcommand{foo}[1][1]{counter is foreach X [count=Y] in
                          {1,...,#1}{stepcounter{mycount}%
                          textbf{themycount}ifnumY=#1%
                          else%
                          ,fi}}

                          begin{document}
                          first use: foo

                          second use: foo

                          now using with option to iterate: foo[2]

                          end{document}


                          enter image description here






                          share|improve this answer




























                            3












                            3








                            3







                            With pgffor it is even less lines.



                            documentclass{report}
                            usepackage{pgffor}
                            newcounter{mycount}
                            setcounter{mycount}{0}
                            newcommand{foo}[1][1]{counter is foreach X [count=Y] in
                            {1,...,#1}{stepcounter{mycount}%
                            textbf{themycount}ifnumY=#1%
                            else%
                            ,fi}}

                            begin{document}
                            first use: foo

                            second use: foo

                            now using with option to iterate: foo[2]

                            end{document}


                            enter image description here






                            share|improve this answer















                            With pgffor it is even less lines.



                            documentclass{report}
                            usepackage{pgffor}
                            newcounter{mycount}
                            setcounter{mycount}{0}
                            newcommand{foo}[1][1]{counter is foreach X [count=Y] in
                            {1,...,#1}{stepcounter{mycount}%
                            textbf{themycount}ifnumY=#1%
                            else%
                            ,fi}}

                            begin{document}
                            first use: foo

                            second use: foo

                            now using with option to iterate: foo[2]

                            end{document}


                            enter image description here







                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Jan 19 at 0:31

























                            answered Jan 19 at 0:26









                            marmotmarmot

                            104k4124236




                            104k4124236























                                1














                                A bit more code but without additional packages:



                                documentclass{report}

                                newcounter{mycount}
                                setcounter{mycount}{0}

                                newcommandExchange[2]{#2#1}%
                                newcommand{foo}[1][1]{fooloop{#1}{}{counter value is}}
                                makeatletter
                                newcommand{fooloop}[3]{%
                                ifnum#1>0 stepcounter{mycount}fi
                                ifnum#1>1 expandafter@firstoftwoelseexpandafter@secondoftwofi
                                {%
                                begingroup
                                protected@edef@tempa{themycount}%
                                c@mycount=#1relax
                                advancec@mycount by -1relax
                                expandafterendgroup
                                expandafterfooloopexpandafter
                                {numberexpandafterc@mycountexpandafter}expandafter
                                {romannumeral0expandafterExchangeexpandafter{@tempa}{ #2}, }%
                                {counter values are}%
                                }{%
                                #3 textbf{#2themycount}%
                                }%
                                }%
                                makeatother

                                begin{document}
                                first use: foo

                                second use: foo

                                now using with option to iterate: foo[4]

                                medskip

                                textit{desired output from line above should be:}

                                medskip

                                now using with option to iterate: counter values are textbf{3, 4, 5, 6}

                                medskip

                                now using with option to iterate 0 times---counter is unchanged and displayed: foo[0]

                                medskip

                                now using with option to iterate -1 times---counter is unchanged and displayed: foo[-1]

                                end{document}


                                enter image description here






                                share|improve this answer






























                                  1














                                  A bit more code but without additional packages:



                                  documentclass{report}

                                  newcounter{mycount}
                                  setcounter{mycount}{0}

                                  newcommandExchange[2]{#2#1}%
                                  newcommand{foo}[1][1]{fooloop{#1}{}{counter value is}}
                                  makeatletter
                                  newcommand{fooloop}[3]{%
                                  ifnum#1>0 stepcounter{mycount}fi
                                  ifnum#1>1 expandafter@firstoftwoelseexpandafter@secondoftwofi
                                  {%
                                  begingroup
                                  protected@edef@tempa{themycount}%
                                  c@mycount=#1relax
                                  advancec@mycount by -1relax
                                  expandafterendgroup
                                  expandafterfooloopexpandafter
                                  {numberexpandafterc@mycountexpandafter}expandafter
                                  {romannumeral0expandafterExchangeexpandafter{@tempa}{ #2}, }%
                                  {counter values are}%
                                  }{%
                                  #3 textbf{#2themycount}%
                                  }%
                                  }%
                                  makeatother

                                  begin{document}
                                  first use: foo

                                  second use: foo

                                  now using with option to iterate: foo[4]

                                  medskip

                                  textit{desired output from line above should be:}

                                  medskip

                                  now using with option to iterate: counter values are textbf{3, 4, 5, 6}

                                  medskip

                                  now using with option to iterate 0 times---counter is unchanged and displayed: foo[0]

                                  medskip

                                  now using with option to iterate -1 times---counter is unchanged and displayed: foo[-1]

                                  end{document}


                                  enter image description here






                                  share|improve this answer




























                                    1












                                    1








                                    1







                                    A bit more code but without additional packages:



                                    documentclass{report}

                                    newcounter{mycount}
                                    setcounter{mycount}{0}

                                    newcommandExchange[2]{#2#1}%
                                    newcommand{foo}[1][1]{fooloop{#1}{}{counter value is}}
                                    makeatletter
                                    newcommand{fooloop}[3]{%
                                    ifnum#1>0 stepcounter{mycount}fi
                                    ifnum#1>1 expandafter@firstoftwoelseexpandafter@secondoftwofi
                                    {%
                                    begingroup
                                    protected@edef@tempa{themycount}%
                                    c@mycount=#1relax
                                    advancec@mycount by -1relax
                                    expandafterendgroup
                                    expandafterfooloopexpandafter
                                    {numberexpandafterc@mycountexpandafter}expandafter
                                    {romannumeral0expandafterExchangeexpandafter{@tempa}{ #2}, }%
                                    {counter values are}%
                                    }{%
                                    #3 textbf{#2themycount}%
                                    }%
                                    }%
                                    makeatother

                                    begin{document}
                                    first use: foo

                                    second use: foo

                                    now using with option to iterate: foo[4]

                                    medskip

                                    textit{desired output from line above should be:}

                                    medskip

                                    now using with option to iterate: counter values are textbf{3, 4, 5, 6}

                                    medskip

                                    now using with option to iterate 0 times---counter is unchanged and displayed: foo[0]

                                    medskip

                                    now using with option to iterate -1 times---counter is unchanged and displayed: foo[-1]

                                    end{document}


                                    enter image description here






                                    share|improve this answer















                                    A bit more code but without additional packages:



                                    documentclass{report}

                                    newcounter{mycount}
                                    setcounter{mycount}{0}

                                    newcommandExchange[2]{#2#1}%
                                    newcommand{foo}[1][1]{fooloop{#1}{}{counter value is}}
                                    makeatletter
                                    newcommand{fooloop}[3]{%
                                    ifnum#1>0 stepcounter{mycount}fi
                                    ifnum#1>1 expandafter@firstoftwoelseexpandafter@secondoftwofi
                                    {%
                                    begingroup
                                    protected@edef@tempa{themycount}%
                                    c@mycount=#1relax
                                    advancec@mycount by -1relax
                                    expandafterendgroup
                                    expandafterfooloopexpandafter
                                    {numberexpandafterc@mycountexpandafter}expandafter
                                    {romannumeral0expandafterExchangeexpandafter{@tempa}{ #2}, }%
                                    {counter values are}%
                                    }{%
                                    #3 textbf{#2themycount}%
                                    }%
                                    }%
                                    makeatother

                                    begin{document}
                                    first use: foo

                                    second use: foo

                                    now using with option to iterate: foo[4]

                                    medskip

                                    textit{desired output from line above should be:}

                                    medskip

                                    now using with option to iterate: counter values are textbf{3, 4, 5, 6}

                                    medskip

                                    now using with option to iterate 0 times---counter is unchanged and displayed: foo[0]

                                    medskip

                                    now using with option to iterate -1 times---counter is unchanged and displayed: foo[-1]

                                    end{document}


                                    enter image description here







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited Jan 27 at 5:21

























                                    answered Jan 27 at 5:10









                                    Ulrich DiezUlrich Diez

                                    4,985618




                                    4,985618






























                                        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%2f470788%2floop-over-an-optional-argument%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

                                        Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

                                        ts Property 'filter' does not exist on type '{}'

                                        mat-slide-toggle shouldn't change it's state when I click cancel in confirmation window