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?
Min function accepting varying number of arguments in C++17
AG Cluster db upgrade by vendor
Happy pi day, everyone!
How to terminate ping <dest> &
Who is flying the vertibirds?
What exactly is this small puffer fish doing and how did it manage to accomplish such a feat?
How to create the Curved texte?
Does Mathematica reuse previous computations?
Professor being mistaken for a grad student
What's the difference between /ɪ/ and /i(ː)/?
Are ETF trackers fundamentally better than individual stocks?
How do I hide Chekhov's Gun?
How Could an Airship Be Repaired Mid-Flight
A sequence that has integer values for prime indexes only:
Declaring defaulted assignment operator as constexpr: which compiler is right?
Opacity of an object in 2.8
Could the Saturn V actually have launched astronauts around Venus?
Time travel from stationary position?
Is it normal that my co-workers at a fitness company criticize my food choices?
Hacking a Safe Lock after 3 tries
Are there other languages, besides English, where the indefinite (or definite) article varies based on sound?
Instead of Universal Basic Income, why not Universal Basic NEEDS?
What is the significance behind "40 days" that often appears in the Bible?
What is this large pipe coming out of my roof?
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
8 hours ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
7 hours 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 8 hours ago
Bruno
asked 8 hours ago
BrunoBruno
1,0921822
1,0921822
2
Please, avoid using theminimalclass; it is not meant for minimal examples.
– egreg
8 hours ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
7 hours ago
add a comment |
2
Please, avoid using theminimalclass; it is not meant for minimal examples.
– egreg
8 hours ago
I learned many things with this question, including the fact that theminimalclass is not made for minimal examples!
– Bruno
7 hours ago
2
2
Please, avoid using the
minimal class; it is not meant for minimal examples.– egreg
8 hours ago
Please, avoid using the
minimal class; it is not meant for minimal examples.– egreg
8 hours ago
I learned many things with this question, including the fact that the
minimal class is not made for minimal examples!– Bruno
7 hours ago
I learned many things with this question, including the fact that the
minimal class is not made for minimal examples!– Bruno
7 hours 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
7 hours 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');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
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 7 hours ago
answered 8 hours 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
7 hours 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
7 hours 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 8 hours 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
7 hours 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
7 hours 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
7 hours 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
7 hours 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');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
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');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
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');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
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');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
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
8 hours ago
I learned many things with this question, including the fact that the
minimalclass is not made for minimal examples!– Bruno
7 hours ago