newcommand: Combine (optional) star and optional parameterUse column-separator & (ampersand) inside newenvironmentPass key option inside a macro to a TikZ drawing commandTwo independent optional arguments for new commandsXparse macro with optional parameter breaks value for PGF foreachMoving the optional argumentamsmath, vec and if not working togetherDefining a LaTeX macro with optional arguments as keywords inside square bracketsOptional parameter in newcommandOptional Parameters in xparse: IfBooleanTF vs IfNoValueTFOptional arguments in “families”… When and how?
Can other pieces capture a threatening piece and prevent a checkmate?
Are dual Irish/British citizens bound by the 90/180 day rule when travelling in the EU after Brexit?
Recruiter wants very extensive technical details about all of my previous work
Why is indicated airspeed rather than ground speed used during the takeoff roll?
In Aliens, how many people were on LV-426 before the Marines arrived?
How could an airship be repaired midflight?
What does "^L" mean in C?
Worshiping one God at a time?
Calculate the frequency of characters in a string
Maths symbols and unicode-math input inside siunitx commands
I got the following comment from a reputed math journal. What does it mean?
Differential and Linear trail propagation in Noekeon
What should I install to correct "ld: cannot find -lgbm and -linput" so that I can compile a Rust program?
Generic TVP tradeoffs?
Bash - pair each line of file
gerund and noun applications
Brake pads destroying wheels
Should I use acronyms in dialogues before telling the readers what it stands for in fiction?
How to get the n-th line after a grepped one?
What does Deadpool mean by "left the house in that shirt"?
Turning a hard to access nut?
Could Sinn Fein swing any Brexit vote in Parliament?
Print a physical multiplication table
Wrapping homogeneous Python objects
newcommand: Combine (optional) star and optional parameter
Use column-separator & (ampersand) inside newenvironmentPass key option inside a macro to a TikZ drawing commandTwo independent optional arguments for new commandsXparse macro with optional parameter breaks value for PGF foreachMoving the optional argumentamsmath, vec and if not working togetherDefining a LaTeX macro with optional arguments as keywords inside square bracketsOptional parameter in newcommandOptional Parameters in xparse: IfBooleanTF vs IfNoValueTFOptional arguments in “families”… When and how?
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:
documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument
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:
documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument
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 theminimalclass; it is not meant for minimal examples.
– egreg
2 days ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
2 days ago
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:
documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument
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:
documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument
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 2 days ago
Bruno
asked 2 days ago
BrunoBruno
1,0921822
1,0921822
2
Please, avoid using theminimalclass; it is not meant for minimal examples.
– egreg
2 days ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
2 days ago
add a comment |
2
Please, avoid using theminimalclass; it is not meant for minimal examples.
– egreg
2 days ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
2 days ago
2
2
Please, avoid using the
minimal class; it is not meant for minimal examples.– egreg
2 days ago
Please, avoid using the
minimal class; it is not meant for minimal examples.– egreg
2 days ago
I learned many things with this question, including the fact that the
minimal class is not made for minimal examples!– Bruno
2 days ago
I learned many things with this question, including the fact that the
minimal class is not made for minimal examples!– Bruno
2 days ago
add a comment |
2 Answers
2
active
oldest
votes
With xparse it's very easy to play around with optional arguments and starred variants:
documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand
s % optional *
O1 % first optional argument (default = 1)
%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
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
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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.
documentclassminimal
makeatletter
newcommandMyCommand%
@ifstarmycommandstarmycommandnostar
newcommandmycommandstar[1][1]The starred variant with parameter: #1
newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument

2
I'd add a%at the end of the definition ofMyCommand. It works without that because the definition of@ifstarignores space tokens by design, but... :)
– Phelype Oleinik
2 days 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%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:
documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand
s % optional *
O1 % first optional argument (default = 1)
%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
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
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand
s % optional *
O1 % first optional argument (default = 1)
%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
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
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand
s % optional *
O1 % first optional argument (default = 1)
%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
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
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand
s % optional *
O1 % first optional argument (default = 1)
%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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:
documentclassarticle
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
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument
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 2 days ago
answered 2 days ago
Phelype OleinikPhelype Oleinik
24.2k54688
24.2k54688
add a comment |
add a comment |
Make MyCommand take no parameters, but just figure out the star. Then fork from there.
documentclassminimal
makeatletter
newcommandMyCommand%
@ifstarmycommandstarmycommandnostar
newcommandmycommandstar[1][1]The starred variant with parameter: #1
newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument

2
I'd add a%at the end of the definition ofMyCommand. It works without that because the definition of@ifstarignores space tokens by design, but... :)
– Phelype Oleinik
2 days ago
add a comment |
Make MyCommand take no parameters, but just figure out the star. Then fork from there.
documentclassminimal
makeatletter
newcommandMyCommand%
@ifstarmycommandstarmycommandnostar
newcommandmycommandstar[1][1]The starred variant with parameter: #1
newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument

2
I'd add a%at the end of the definition ofMyCommand. It works without that because the definition of@ifstarignores space tokens by design, but... :)
– Phelype Oleinik
2 days ago
add a comment |
Make MyCommand take no parameters, but just figure out the star. Then fork from there.
documentclassminimal
makeatletter
newcommandMyCommand%
@ifstarmycommandstarmycommandnostar
newcommandmycommandstar[1][1]The starred variant with parameter: #1
newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument

Make MyCommand take no parameters, but just figure out the star. Then fork from there.
documentclassminimal
makeatletter
newcommandMyCommand%
@ifstarmycommandstarmycommandnostar
newcommandmycommandstar[1][1]The starred variant with parameter: #1
newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument

answered 2 days ago
Steven B. SegletesSteven B. Segletes
158k9204411
158k9204411
2
I'd add a%at the end of the definition ofMyCommand. It works without that because the definition of@ifstarignores space tokens by design, but... :)
– Phelype Oleinik
2 days ago
add a comment |
2
I'd add a%at the end of the definition ofMyCommand. It works without that because the definition of@ifstarignores space tokens by design, but... :)
– Phelype Oleinik
2 days ago
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
2 days ago
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
2 days 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%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
minimalclass; it is not meant for minimal examples.– egreg
2 days ago
I learned many things with this question, including the fact that the
minimalclass is not made for minimal examples!– Bruno
2 days ago