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 35 mins ago
SigurSigur
24.5k355138
24.5k355138
add a comment |
add a comment |
2 Answers
2
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
24 mins ago
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
23 mins ago
@Sigur Your wish is my command. Updated.
– egreg
17 mins ago
Oh, I think I should learn aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
12 mins ago
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
9 mins ago
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
2 Answers
2
active
oldest
votes
2 Answers
2
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
24 mins ago
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
23 mins ago
@Sigur Your wish is my command. Updated.
– egreg
17 mins ago
Oh, I think I should learn aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
12 mins ago
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
24 mins ago
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
23 mins ago
@Sigur Your wish is my command. Updated.
– egreg
17 mins ago
Oh, I think I should learn aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
12 mins ago
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 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 printcounters 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 aboutNewDocumentCommand
as soon as possible. Amazing and powerful.
– Sigur
12 mins ago
add a comment |
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 printcounters 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 aboutNewDocumentCommand
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
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
9 mins ago
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
9 mins ago
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 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
add a comment |
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
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