Including default parameter into def
I'm using the classic thesis style with the graffito command (example here). How can I modify the command below to add some vertical spacing before the text which is set to a standard value by default but can be changed by including a parameter?
% Graffiti as in GKP's book "Concrete Mathematics"
% thanks to Lorenzo Pantieri and Enrico Gregorio
defgraffito@setup{%
vspace{0.7em}
% slshapefootnotesize% this was due to slhape in above book
itshapefootnotesizeleavevmodecolor{Black}%
parindent=0pt lineskip=0pt lineskiplimit=0pt %
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300%
doublehyphendemerits=100000%
finalhyphendemerits=doublehyphendemerits}
My first approach would be to add a vspace{#1} into the beginning, but I'm not aware how to include (i) this parameter #1 into the definition; (ii) include a default value for the parameter. I also didn't managed to translate the code snippet below into a newcommand definition which, as I am aware, supports default parameters.
vertical-alignment parameters definition
|
show 2 more comments
I'm using the classic thesis style with the graffito command (example here). How can I modify the command below to add some vertical spacing before the text which is set to a standard value by default but can be changed by including a parameter?
% Graffiti as in GKP's book "Concrete Mathematics"
% thanks to Lorenzo Pantieri and Enrico Gregorio
defgraffito@setup{%
vspace{0.7em}
% slshapefootnotesize% this was due to slhape in above book
itshapefootnotesizeleavevmodecolor{Black}%
parindent=0pt lineskip=0pt lineskiplimit=0pt %
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300%
doublehyphendemerits=100000%
finalhyphendemerits=doublehyphendemerits}
My first approach would be to add a vspace{#1} into the beginning, but I'm not aware how to include (i) this parameter #1 into the definition; (ii) include a default value for the parameter. I also didn't managed to translate the code snippet below into a newcommand definition which, as I am aware, supports default parameters.
vertical-alignment parameters definition
2
Why not usenewcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can callgraffito@setup[1em]
to use something else than the default.
– Skillmon
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
I need more information, can you create a complete MWE? I don't know whatgraffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length:newlengthmylengthsetlengthmylength{.7em}
and thenvspace{mylength}
instead ofvspace{0.7em}
. To change it, just change the length. No argument hacking needed.
– Skillmon
2 days ago
1
The%
after300
and10000
are definitely not mine.;-)
– egreg
2 days ago
|
show 2 more comments
I'm using the classic thesis style with the graffito command (example here). How can I modify the command below to add some vertical spacing before the text which is set to a standard value by default but can be changed by including a parameter?
% Graffiti as in GKP's book "Concrete Mathematics"
% thanks to Lorenzo Pantieri and Enrico Gregorio
defgraffito@setup{%
vspace{0.7em}
% slshapefootnotesize% this was due to slhape in above book
itshapefootnotesizeleavevmodecolor{Black}%
parindent=0pt lineskip=0pt lineskiplimit=0pt %
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300%
doublehyphendemerits=100000%
finalhyphendemerits=doublehyphendemerits}
My first approach would be to add a vspace{#1} into the beginning, but I'm not aware how to include (i) this parameter #1 into the definition; (ii) include a default value for the parameter. I also didn't managed to translate the code snippet below into a newcommand definition which, as I am aware, supports default parameters.
vertical-alignment parameters definition
I'm using the classic thesis style with the graffito command (example here). How can I modify the command below to add some vertical spacing before the text which is set to a standard value by default but can be changed by including a parameter?
% Graffiti as in GKP's book "Concrete Mathematics"
% thanks to Lorenzo Pantieri and Enrico Gregorio
defgraffito@setup{%
vspace{0.7em}
% slshapefootnotesize% this was due to slhape in above book
itshapefootnotesizeleavevmodecolor{Black}%
parindent=0pt lineskip=0pt lineskiplimit=0pt %
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300%
doublehyphendemerits=100000%
finalhyphendemerits=doublehyphendemerits}
My first approach would be to add a vspace{#1} into the beginning, but I'm not aware how to include (i) this parameter #1 into the definition; (ii) include a default value for the parameter. I also didn't managed to translate the code snippet below into a newcommand definition which, as I am aware, supports default parameters.
vertical-alignment parameters definition
vertical-alignment parameters definition
asked 2 days ago
ChrisChris
245210
245210
2
Why not usenewcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can callgraffito@setup[1em]
to use something else than the default.
– Skillmon
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
I need more information, can you create a complete MWE? I don't know whatgraffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length:newlengthmylengthsetlengthmylength{.7em}
and thenvspace{mylength}
instead ofvspace{0.7em}
. To change it, just change the length. No argument hacking needed.
– Skillmon
2 days ago
1
The%
after300
and10000
are definitely not mine.;-)
– egreg
2 days ago
|
show 2 more comments
2
Why not usenewcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can callgraffito@setup[1em]
to use something else than the default.
– Skillmon
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
I need more information, can you create a complete MWE? I don't know whatgraffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length:newlengthmylengthsetlengthmylength{.7em}
and thenvspace{mylength}
instead ofvspace{0.7em}
. To change it, just change the length. No argument hacking needed.
– Skillmon
2 days ago
1
The%
after300
and10000
are definitely not mine.;-)
– egreg
2 days ago
2
2
Why not use
newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can call graffito@setup[1em]
to use something else than the default.– Skillmon
2 days ago
Why not use
newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can call graffito@setup[1em]
to use something else than the default.– Skillmon
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
I need more information, can you create a complete MWE? I don't know what
graffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length: newlengthmylengthsetlengthmylength{.7em}
and then vspace{mylength}
instead of vspace{0.7em}
. To change it, just change the length. No argument hacking needed.– Skillmon
2 days ago
I need more information, can you create a complete MWE? I don't know what
graffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length: newlengthmylengthsetlengthmylength{.7em}
and then vspace{mylength}
instead of vspace{0.7em}
. To change it, just change the length. No argument hacking needed.– Skillmon
2 days ago
1
1
The
%
after 300
and 10000
are definitely not mine. ;-)
– egreg
2 days ago
The
%
after 300
and 10000
are definitely not mine. ;-)
– egreg
2 days ago
|
show 2 more comments
2 Answers
2
active
oldest
votes
Just define graffito
with an optional argument:
documentclass{article}
usepackage{lipsum}
makeatletter
newcommand{graffito}[2][0.7em]{%
marginpar
[graffito@setup{#1}raggedlefthspace{0pt}#2]
{graffito@setup{#1}raggedrighthspace{0pt}#2}%
}
newcommandgraffito@setup[1]{%
vspace{#1}%
parindent=0pt lineskip=0pt lineskiplimit=0pt
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300
doublehyphendemerits=100000
finalhyphendemerits=doublehyphendemerits
itshapefootnotesize
leavevmodecolor{Black}%
}
makeatother
begin{document}
This has a graffitograffito{This is a standard graffito}
lipsum[1][1-5]
This has a graffitograffito[-0.7em]{This is a moved up graffito}
lipsum[1][1-5]
This has a graffitograffito[1cm]{This is a moved down graffito}
lipsum[1][1-5]
end{document}
Side note: the original code has %
after 300
and 100000
: they are wrong.
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
add a comment |
Since you're using LaTeX syntax anyway, you can use the LaTeX command newcommand
to set a default argument with: newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
. If you want to not use LaTeX syntax for educational purposes, you can do the following:
We need a first macro which checks whether the optional argument follows. For this we use futurelet
(definition made protected
because we need an assignment here):
protecteddefmycmd{futureletnextmycmd@a}
We need to check whether the next token is a bracket, if it is the next macro reads its argument, else we give it its default.
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
Here I use the macros afterelsefi
and afterfi
for some logic branching. They eat their argument and put it after fi
.
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
Finally the last macro needed for this, this one is the one generating the output:
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
Complete MWE:
documentclass{article}
makeatletter
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
protecteddefmycmd{futureletnextmycmd@a}
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
makeatother
begin{document}
mycmd
mycmd[1em]
end{document}
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
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%2f470220%2fincluding-default-parameter-into-def%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
Just define graffito
with an optional argument:
documentclass{article}
usepackage{lipsum}
makeatletter
newcommand{graffito}[2][0.7em]{%
marginpar
[graffito@setup{#1}raggedlefthspace{0pt}#2]
{graffito@setup{#1}raggedrighthspace{0pt}#2}%
}
newcommandgraffito@setup[1]{%
vspace{#1}%
parindent=0pt lineskip=0pt lineskiplimit=0pt
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300
doublehyphendemerits=100000
finalhyphendemerits=doublehyphendemerits
itshapefootnotesize
leavevmodecolor{Black}%
}
makeatother
begin{document}
This has a graffitograffito{This is a standard graffito}
lipsum[1][1-5]
This has a graffitograffito[-0.7em]{This is a moved up graffito}
lipsum[1][1-5]
This has a graffitograffito[1cm]{This is a moved down graffito}
lipsum[1][1-5]
end{document}
Side note: the original code has %
after 300
and 100000
: they are wrong.
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
add a comment |
Just define graffito
with an optional argument:
documentclass{article}
usepackage{lipsum}
makeatletter
newcommand{graffito}[2][0.7em]{%
marginpar
[graffito@setup{#1}raggedlefthspace{0pt}#2]
{graffito@setup{#1}raggedrighthspace{0pt}#2}%
}
newcommandgraffito@setup[1]{%
vspace{#1}%
parindent=0pt lineskip=0pt lineskiplimit=0pt
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300
doublehyphendemerits=100000
finalhyphendemerits=doublehyphendemerits
itshapefootnotesize
leavevmodecolor{Black}%
}
makeatother
begin{document}
This has a graffitograffito{This is a standard graffito}
lipsum[1][1-5]
This has a graffitograffito[-0.7em]{This is a moved up graffito}
lipsum[1][1-5]
This has a graffitograffito[1cm]{This is a moved down graffito}
lipsum[1][1-5]
end{document}
Side note: the original code has %
after 300
and 100000
: they are wrong.
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
add a comment |
Just define graffito
with an optional argument:
documentclass{article}
usepackage{lipsum}
makeatletter
newcommand{graffito}[2][0.7em]{%
marginpar
[graffito@setup{#1}raggedlefthspace{0pt}#2]
{graffito@setup{#1}raggedrighthspace{0pt}#2}%
}
newcommandgraffito@setup[1]{%
vspace{#1}%
parindent=0pt lineskip=0pt lineskiplimit=0pt
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300
doublehyphendemerits=100000
finalhyphendemerits=doublehyphendemerits
itshapefootnotesize
leavevmodecolor{Black}%
}
makeatother
begin{document}
This has a graffitograffito{This is a standard graffito}
lipsum[1][1-5]
This has a graffitograffito[-0.7em]{This is a moved up graffito}
lipsum[1][1-5]
This has a graffitograffito[1cm]{This is a moved down graffito}
lipsum[1][1-5]
end{document}
Side note: the original code has %
after 300
and 100000
: they are wrong.
Just define graffito
with an optional argument:
documentclass{article}
usepackage{lipsum}
makeatletter
newcommand{graffito}[2][0.7em]{%
marginpar
[graffito@setup{#1}raggedlefthspace{0pt}#2]
{graffito@setup{#1}raggedrighthspace{0pt}#2}%
}
newcommandgraffito@setup[1]{%
vspace{#1}%
parindent=0pt lineskip=0pt lineskiplimit=0pt
tolerance=2000 hyphenpenalty=300 exhyphenpenalty=300
doublehyphendemerits=100000
finalhyphendemerits=doublehyphendemerits
itshapefootnotesize
leavevmodecolor{Black}%
}
makeatother
begin{document}
This has a graffitograffito{This is a standard graffito}
lipsum[1][1-5]
This has a graffitograffito[-0.7em]{This is a moved up graffito}
lipsum[1][1-5]
This has a graffitograffito[1cm]{This is a moved down graffito}
lipsum[1][1-5]
end{document}
Side note: the original code has %
after 300
and 100000
: they are wrong.
answered 2 days ago
egregegreg
713k8618933182
713k8618933182
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
add a comment |
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Great answer and mwe example appreciated for others who are not familiar with the command / style.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
Btw this only works for me (TexLive2018 on OSX) if I change 'Black' to 'black' and add usepackage{xcolor} before.
– Chris
2 days ago
1
1
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
@Chris That might depend on the release of LaTeX you're using. Use black if that works for you.
– egreg
2 days ago
add a comment |
Since you're using LaTeX syntax anyway, you can use the LaTeX command newcommand
to set a default argument with: newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
. If you want to not use LaTeX syntax for educational purposes, you can do the following:
We need a first macro which checks whether the optional argument follows. For this we use futurelet
(definition made protected
because we need an assignment here):
protecteddefmycmd{futureletnextmycmd@a}
We need to check whether the next token is a bracket, if it is the next macro reads its argument, else we give it its default.
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
Here I use the macros afterelsefi
and afterfi
for some logic branching. They eat their argument and put it after fi
.
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
Finally the last macro needed for this, this one is the one generating the output:
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
Complete MWE:
documentclass{article}
makeatletter
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
protecteddefmycmd{futureletnextmycmd@a}
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
makeatother
begin{document}
mycmd
mycmd[1em]
end{document}
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
2 days ago
add a comment |
Since you're using LaTeX syntax anyway, you can use the LaTeX command newcommand
to set a default argument with: newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
. If you want to not use LaTeX syntax for educational purposes, you can do the following:
We need a first macro which checks whether the optional argument follows. For this we use futurelet
(definition made protected
because we need an assignment here):
protecteddefmycmd{futureletnextmycmd@a}
We need to check whether the next token is a bracket, if it is the next macro reads its argument, else we give it its default.
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
Here I use the macros afterelsefi
and afterfi
for some logic branching. They eat their argument and put it after fi
.
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
Finally the last macro needed for this, this one is the one generating the output:
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
Complete MWE:
documentclass{article}
makeatletter
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
protecteddefmycmd{futureletnextmycmd@a}
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
makeatother
begin{document}
mycmd
mycmd[1em]
end{document}
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
2 days ago
add a comment |
Since you're using LaTeX syntax anyway, you can use the LaTeX command newcommand
to set a default argument with: newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
. If you want to not use LaTeX syntax for educational purposes, you can do the following:
We need a first macro which checks whether the optional argument follows. For this we use futurelet
(definition made protected
because we need an assignment here):
protecteddefmycmd{futureletnextmycmd@a}
We need to check whether the next token is a bracket, if it is the next macro reads its argument, else we give it its default.
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
Here I use the macros afterelsefi
and afterfi
for some logic branching. They eat their argument and put it after fi
.
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
Finally the last macro needed for this, this one is the one generating the output:
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
Complete MWE:
documentclass{article}
makeatletter
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
protecteddefmycmd{futureletnextmycmd@a}
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
makeatother
begin{document}
mycmd
mycmd[1em]
end{document}
Since you're using LaTeX syntax anyway, you can use the LaTeX command newcommand
to set a default argument with: newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
. If you want to not use LaTeX syntax for educational purposes, you can do the following:
We need a first macro which checks whether the optional argument follows. For this we use futurelet
(definition made protected
because we need an assignment here):
protecteddefmycmd{futureletnextmycmd@a}
We need to check whether the next token is a bracket, if it is the next macro reads its argument, else we give it its default.
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
Here I use the macros afterelsefi
and afterfi
for some logic branching. They eat their argument and put it after fi
.
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
Finally the last macro needed for this, this one is the one generating the output:
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
Complete MWE:
documentclass{article}
makeatletter
longdefafterelsefi#1else#2fi{fi#1}
longdefafterfi#1fi{fi#1}
protecteddefmycmd{futureletnextmycmd@a}
defmycmd@a
{%
ifx[next
afterelsefi{mycmd@b}%
else
afterfi{mycmd@b[0.7em]}%
fi
}
longdefmycmd@b[#1]%
{%
Argument was: texttt{detokenize{#1}}%
}
makeatother
begin{document}
mycmd
mycmd[1em]
end{document}
answered 2 days ago
SkillmonSkillmon
21.4k11941
21.4k11941
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
2 days ago
add a comment |
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
2 days ago
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
Great elaborate response @skillmon, thanks very much. Would love to accept both answers but since this isn't possible, I go for the quickest one.
– Chris
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
@Chris quicker was mine, but egregs is the one solving your problem, so accepting his is fine. If an answer helps you and you want to say thank you, you might consider upvoting it, if you deem it worth it.
– Skillmon
2 days ago
Done that, thanks!
– Chris
2 days ago
Done that, thanks!
– Chris
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%2f470220%2fincluding-default-parameter-into-def%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
Why not use
newcommandgraffito@setup[1][0.7em]{vspace{#1}...}
instead (since you use LaTeX syntax anyway)? Then you can callgraffito@setup[1em]
to use something else than the default.– Skillmon
2 days ago
@Skillmon Good idea, but I might have to switch frequently between the default and a custom offset. So rather than re-specifying the offset explicitly, I'd prefer to have a default setup that the command falls back to if no parameter is given.
– Chris
2 days ago
Also, I do not understand the @setup notation: how come that we define a graffito@setup command which is later used as graffito{text}? I'd appreciate some intuitions here, too.
– Chris
2 days ago
I need more information, can you create a complete MWE? I don't know what
graffito
should do and how it is defined, what you want to do with it, and where your optional parameter should be. The easiest way to patch above's definition to include a changeable offset, is to define a length and change the definition to use that length:newlengthmylengthsetlengthmylength{.7em}
and thenvspace{mylength}
instead ofvspace{0.7em}
. To change it, just change the length. No argument hacking needed.– Skillmon
2 days ago
1
The
%
after300
and10000
are definitely not mine.;-)
– egreg
2 days ago