newcommand: Combine (optional) star and optional parameter
How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?
I tried the following:
documentclass{minimal}
makeatletter
newcommandMyCommand[1][1]{%
@ifstar{%
The starred variant with parameter: #1%
}{%
The non-starred variant with parameter: #1%
}
}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
But this gives:
The non-starred variant with parameter: 1
The starred variant with parameter: 1
The non-starred variant with parameter: 2
The starred variant with parameter: 1[2]
Yet, one can write MyCommand[2]*
to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.
macros
add a comment |
How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?
I tried the following:
documentclass{minimal}
makeatletter
newcommandMyCommand[1][1]{%
@ifstar{%
The starred variant with parameter: #1%
}{%
The non-starred variant with parameter: #1%
}
}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
But this gives:
The non-starred variant with parameter: 1
The starred variant with parameter: 1
The non-starred variant with parameter: 2
The starred variant with parameter: 1[2]
Yet, one can write MyCommand[2]*
to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.
macros
2
Please, avoid using theminimal
class; it is not meant for minimal examples.
– egreg
Mar 15 at 13:52
I learned many things with this question, including the fact that theminimal
class is not made for minimal examples!
– Bruno
Mar 15 at 14:27
add a comment |
How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?
I tried the following:
documentclass{minimal}
makeatletter
newcommandMyCommand[1][1]{%
@ifstar{%
The starred variant with parameter: #1%
}{%
The non-starred variant with parameter: #1%
}
}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
But this gives:
The non-starred variant with parameter: 1
The starred variant with parameter: 1
The non-starred variant with parameter: 2
The starred variant with parameter: 1[2]
Yet, one can write MyCommand[2]*
to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.
macros
How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?
I tried the following:
documentclass{minimal}
makeatletter
newcommandMyCommand[1][1]{%
@ifstar{%
The starred variant with parameter: #1%
}{%
The non-starred variant with parameter: #1%
}
}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
But this gives:
The non-starred variant with parameter: 1
The starred variant with parameter: 1
The non-starred variant with parameter: 2
The starred variant with parameter: 1[2]
Yet, one can write MyCommand[2]*
to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.
macros
macros
edited Mar 15 at 13:45
Bruno
asked Mar 15 at 13:40
BrunoBruno
1,0921822
1,0921822
2
Please, avoid using theminimal
class; it is not meant for minimal examples.
– egreg
Mar 15 at 13:52
I learned many things with this question, including the fact that theminimal
class is not made for minimal examples!
– Bruno
Mar 15 at 14:27
add a comment |
2
Please, avoid using theminimal
class; it is not meant for minimal examples.
– egreg
Mar 15 at 13:52
I learned many things with this question, including the fact that theminimal
class is not made for minimal examples!
– Bruno
Mar 15 at 14:27
2
2
Please, avoid using the
minimal
class; it is not meant for minimal examples.– egreg
Mar 15 at 13:52
Please, avoid using the
minimal
class; it is not meant for minimal examples.– egreg
Mar 15 at 13:52
I learned many things with this question, including the fact that the
minimal
class is not made for minimal examples!– Bruno
Mar 15 at 14:27
I learned many things with this question, including the fact that the
minimal
class is not made for minimal examples!– Bruno
Mar 15 at 14:27
add a comment |
2 Answers
2
active
oldest
votes
With xparse
it's very easy to play around with optional arguments and starred variants:
documentclass{article}
usepackage{xparse}
NewDocumentCommandMyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
With LaTeX's newcommand
it a little trickier. The @ifstar
macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the *
and only then look for the optional argument:
documentclass{article}
makeatletter
newcommandMyCommand
{%
@ifstar
{MyCommand@star}
{MyCommand@nostar}%
}
newcommandMyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
newcommandMyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
makeatother
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
Both versions print:
Your code works, but not as you expect it to. The MyCommand[1][1]
looks for an optional argument “while expanding” MyCommand
, which then gives you:
@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
and only after that the @ifstar
test will be expanded to look for the optional *
and choose the text accordingly, so the actual syntax for the command you defined is:
MyCommand[optional argument]<optional star>
add a comment |
Make MyCommand
take no parameters, but just figure out the star. Then fork from there.
documentclass{minimal}
makeatletter
newcommandMyCommand{%
@ifstar{mycommandstar}{mycommandnostar}
}
newcommandmycommandstar[1][1]{The starred variant with parameter: #1}
newcommandmycommandnostar[1][1]{The non-starred variant with parameter: #1}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
2
I'd add a%
at the end of the definition ofMyCommand
. It works without that because the definition of@ifstar
ignores space tokens by design, but... :)
– Phelype Oleinik
Mar 15 at 14:20
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%2f479632%2fnewcommand-combine-optional-star-and-optional-parameter%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 xparse
it's very easy to play around with optional arguments and starred variants:
documentclass{article}
usepackage{xparse}
NewDocumentCommandMyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
With LaTeX's newcommand
it a little trickier. The @ifstar
macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the *
and only then look for the optional argument:
documentclass{article}
makeatletter
newcommandMyCommand
{%
@ifstar
{MyCommand@star}
{MyCommand@nostar}%
}
newcommandMyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
newcommandMyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
makeatother
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
Both versions print:
Your code works, but not as you expect it to. The MyCommand[1][1]
looks for an optional argument “while expanding” MyCommand
, which then gives you:
@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
and only after that the @ifstar
test will be expanded to look for the optional *
and choose the text accordingly, so the actual syntax for the command you defined is:
MyCommand[optional argument]<optional star>
add a comment |
With xparse
it's very easy to play around with optional arguments and starred variants:
documentclass{article}
usepackage{xparse}
NewDocumentCommandMyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
With LaTeX's newcommand
it a little trickier. The @ifstar
macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the *
and only then look for the optional argument:
documentclass{article}
makeatletter
newcommandMyCommand
{%
@ifstar
{MyCommand@star}
{MyCommand@nostar}%
}
newcommandMyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
newcommandMyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
makeatother
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
Both versions print:
Your code works, but not as you expect it to. The MyCommand[1][1]
looks for an optional argument “while expanding” MyCommand
, which then gives you:
@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
and only after that the @ifstar
test will be expanded to look for the optional *
and choose the text accordingly, so the actual syntax for the command you defined is:
MyCommand[optional argument]<optional star>
add a comment |
With xparse
it's very easy to play around with optional arguments and starred variants:
documentclass{article}
usepackage{xparse}
NewDocumentCommandMyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
With LaTeX's newcommand
it a little trickier. The @ifstar
macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the *
and only then look for the optional argument:
documentclass{article}
makeatletter
newcommandMyCommand
{%
@ifstar
{MyCommand@star}
{MyCommand@nostar}%
}
newcommandMyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
newcommandMyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
makeatother
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
Both versions print:
Your code works, but not as you expect it to. The MyCommand[1][1]
looks for an optional argument “while expanding” MyCommand
, which then gives you:
@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
and only after that the @ifstar
test will be expanded to look for the optional *
and choose the text accordingly, so the actual syntax for the command you defined is:
MyCommand[optional argument]<optional star>
With xparse
it's very easy to play around with optional arguments and starred variants:
documentclass{article}
usepackage{xparse}
NewDocumentCommandMyCommand
{
s % optional *
O{1} % first optional argument (default = 1)
}
{%
IfBooleanTF{#1}
{The starred variant with parameter: #2}
{The non-starred variant with parameter: #2}
}
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
With LaTeX's newcommand
it a little trickier. The @ifstar
macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the *
and only then look for the optional argument:
documentclass{article}
makeatletter
newcommandMyCommand
{%
@ifstar
{MyCommand@star}
{MyCommand@nostar}%
}
newcommandMyCommand@star[1][1]{%
The starred variant with parameter: #1%
}
newcommandMyCommand@nostar[1][1]{%
The non-starred variant with parameter: #1%
}
makeatother
begin{document}
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
end{document}
Both versions print:
Your code works, but not as you expect it to. The MyCommand[1][1]
looks for an optional argument “while expanding” MyCommand
, which then gives you:
@ifstar{%
The starred variant with parameter: <optional argument or default>%
}{%
The non-starred variant with parameter: <optional argument or default>%
}
and only after that the @ifstar
test will be expanded to look for the optional *
and choose the text accordingly, so the actual syntax for the command you defined is:
MyCommand[optional argument]<optional star>
edited Mar 15 at 13:58
answered Mar 15 at 13:49
Phelype OleinikPhelype Oleinik
24.6k54688
24.6k54688
add a comment |
add a comment |
Make MyCommand
take no parameters, but just figure out the star. Then fork from there.
documentclass{minimal}
makeatletter
newcommandMyCommand{%
@ifstar{mycommandstar}{mycommandnostar}
}
newcommandmycommandstar[1][1]{The starred variant with parameter: #1}
newcommandmycommandnostar[1][1]{The non-starred variant with parameter: #1}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
2
I'd add a%
at the end of the definition ofMyCommand
. It works without that because the definition of@ifstar
ignores space tokens by design, but... :)
– Phelype Oleinik
Mar 15 at 14:20
add a comment |
Make MyCommand
take no parameters, but just figure out the star. Then fork from there.
documentclass{minimal}
makeatletter
newcommandMyCommand{%
@ifstar{mycommandstar}{mycommandnostar}
}
newcommandmycommandstar[1][1]{The starred variant with parameter: #1}
newcommandmycommandnostar[1][1]{The non-starred variant with parameter: #1}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
2
I'd add a%
at the end of the definition ofMyCommand
. It works without that because the definition of@ifstar
ignores space tokens by design, but... :)
– Phelype Oleinik
Mar 15 at 14:20
add a comment |
Make MyCommand
take no parameters, but just figure out the star. Then fork from there.
documentclass{minimal}
makeatletter
newcommandMyCommand{%
@ifstar{mycommandstar}{mycommandnostar}
}
newcommandmycommandstar[1][1]{The starred variant with parameter: #1}
newcommandmycommandnostar[1][1]{The non-starred variant with parameter: #1}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
Make MyCommand
take no parameters, but just figure out the star. Then fork from there.
documentclass{minimal}
makeatletter
newcommandMyCommand{%
@ifstar{mycommandstar}{mycommandnostar}
}
newcommandmycommandstar[1][1]{The starred variant with parameter: #1}
newcommandmycommandnostar[1][1]{The non-starred variant with parameter: #1}
makeatother
begin{document}
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
end{document}
answered Mar 15 at 13:48
Steven B. SegletesSteven B. Segletes
159k9204412
159k9204412
2
I'd add a%
at the end of the definition ofMyCommand
. It works without that because the definition of@ifstar
ignores space tokens by design, but... :)
– Phelype Oleinik
Mar 15 at 14:20
add a comment |
2
I'd add a%
at the end of the definition ofMyCommand
. It works without that because the definition of@ifstar
ignores space tokens by design, but... :)
– Phelype Oleinik
Mar 15 at 14:20
2
2
I'd add a
%
at the end of the definition of MyCommand
. It works without that because the definition of @ifstar
ignores space tokens by design, but... :)– Phelype Oleinik
Mar 15 at 14:20
I'd add a
%
at the end of the definition of MyCommand
. It works without that because the definition of @ifstar
ignores space tokens by design, but... :)– Phelype Oleinik
Mar 15 at 14:20
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%2f479632%2fnewcommand-combine-optional-star-and-optional-parameter%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
2
Please, avoid using the
minimal
class; it is not meant for minimal examples.– egreg
Mar 15 at 13:52
I learned many things with this question, including the fact that the
minimal
class is not made for minimal examples!– Bruno
Mar 15 at 14:27