Loop over an optional argument












3















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



























    3















    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

























      3












      3








      3








      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 35 mins ago









      SigurSigur

      24.5k355138




      24.5k355138






















          2 Answers
          2






          active

          oldest

          votes


















          3














          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
            24 mins ago











          • 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
            23 mins ago











          • @Sigur Your wish is my command. Updated.

            – egreg
            17 mins ago











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

            – Sigur
            12 mins ago



















          1














          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
            9 mins ago











          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

























          2 Answers
          2






          active

          oldest

          votes








          2 Answers
          2






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          3














          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
            24 mins ago











          • 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
            23 mins ago











          • @Sigur Your wish is my command. Updated.

            – egreg
            17 mins ago











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

            – Sigur
            12 mins ago
















          3














          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
            24 mins ago











          • 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
            23 mins ago











          • @Sigur Your wish is my command. Updated.

            – egreg
            17 mins ago











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

            – Sigur
            12 mins ago














          3












          3








          3







          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 17 mins ago

























          answered 26 mins ago









          egregegreg

          713k8618943182




          713k8618943182













          • Exactly what I need.

            – Sigur
            24 mins ago











          • 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
            23 mins ago











          • @Sigur Your wish is my command. Updated.

            – egreg
            17 mins ago











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

            – Sigur
            12 mins ago



















          • Exactly what I need.

            – Sigur
            24 mins ago











          • 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
            23 mins ago











          • @Sigur Your wish is my command. Updated.

            – egreg
            17 mins ago











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

            – Sigur
            12 mins ago

















          Exactly what I need.

          – Sigur
          24 mins ago





          Exactly what I need.

          – Sigur
          24 mins ago













          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
          23 mins ago





          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
          23 mins ago













          @Sigur Your wish is my command. Updated.

          – egreg
          17 mins ago





          @Sigur Your wish is my command. Updated.

          – egreg
          17 mins ago













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

          – Sigur
          12 mins ago





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

          – Sigur
          12 mins ago











          1














          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
            9 mins ago
















          1














          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
            9 mins ago














          1












          1








          1







          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 17 mins ago









          WernerWerner

          440k669681662




          440k669681662













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

            – Sigur
            9 mins ago



















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

            – Sigur
            9 mins ago

















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

          – Sigur
          9 mins ago





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

          – Sigur
          9 mins ago


















          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

          Knooppunt Holsloot

          Altaar (religie)

          Gregoriusmis