Loop over an optional argument
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}
macros counters loops
add a comment |
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}
macros counters loops
add a comment |
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}
macros counters loops
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}
macros counters loops
macros counters loops
asked Jan 18 at 23:45
SigurSigur
25.6k456139
25.6k456139
add a comment |
add a comment |
5 Answers
5
active
oldest
votes
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.
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 printcounters 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 aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
Jan 19 at 0:08
add a comment |
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}
add a comment |
Here is an approach using multido
for looping and a delayed delimiter definition:
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}
This solution is more understandable to me... but I had never done it by myself. Very nice.
– Sigur
Jan 19 at 0:11
add a comment |
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}
add a comment |
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}
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
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 printcounters 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 aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
Jan 19 at 0:08
add a comment |
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.
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 printcounters 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 aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
Jan 19 at 0:08
add a comment |
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.
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.
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 printcounters 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 aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
Jan 19 at 0:08
add a comment |
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 printcounters 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 aboutNewDocumentCommand
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
add a comment |
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}
add a comment |
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}
add a comment |
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}
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}
answered Jan 19 at 0:32
BernardBernard
171k775203
171k775203
add a comment |
add a comment |
Here is an approach using multido
for looping and a delayed delimiter definition:
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}
This solution is more understandable to me... but I had never done it by myself. Very nice.
– Sigur
Jan 19 at 0:11
add a comment |
Here is an approach using multido
for looping and a delayed delimiter definition:
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}
This solution is more understandable to me... but I had never done it by myself. Very nice.
– Sigur
Jan 19 at 0:11
add a comment |
Here is an approach using multido
for looping and a delayed delimiter definition:
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}
Here is an approach using multido
for looping and a delayed delimiter definition:
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}
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
add a comment |
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
add a comment |
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}
add a comment |
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}
add a comment |
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}
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}
edited Jan 19 at 0:31
answered Jan 19 at 0:26
marmotmarmot
104k4124236
104k4124236
add a comment |
add a comment |
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}
add a comment |
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}
add a comment |
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}
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}
edited Jan 27 at 5:21
answered Jan 27 at 5:10
Ulrich DiezUlrich Diez
4,985618
4,985618
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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