How to properly capture return value of a command?
I have a problem with capturing returned value of my command.
Here is my preamble with command definition:
documentclass[convert={density=300,size=800x600,outext=.png}]{standalone}
usepackage[utf8]{inputenc}
usepackage{tikz}
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
% Function which returns maximum width needed to write any of provided arguments.
makeatletter
newlength{textLength@getMaximumWidthHelper}
newlength{textLength@getMaximumWidth}
newcommand{getMaximumWidthHelper}[2]
{%
settowidth{textLength@getMaximumWidthHelper}{pgfinterruptpicture #2endpgfinterruptpicture}%
pgfmathparse{max(#1,textLength@getMaximumWidthHelper)}%
@ifnextcharbgroup{getMaximumWidthHelper{pgfmathresult pt}}{pgfmathresult pt}%
}%
newcommand{getMaximumWidth}[1]
{%
settowidth{textLength@getMaximumWidth}{pgfinterruptpicture #1endpgfinterruptpicture}%
@ifnextcharbgroup{getMaximumWidthHelper{thetextLength@getMaximumWidth}}{thetextLength@getMaximumWidth}%
}%
makeatother
Working example used to test the above command:
begin{document}
getMaximumWidth{cmdOne}
getMaximumWidth{cmdOne}{cmdTwo}
getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}
end{document}
However, when I try to capture the output of getMaximumWidth
, it doesn't work as expected.
begin{document}
newlength{maximumWidth}
setlength{maximumWidth}{getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}}
themaximumWidth
end{document}
On the second line, the return value of getMaximumWidth
is not captured but instantly printed.
Afterwards I get an error:
! Missing number, treated as
zero.
After that, the third line just prints default value 0.0pt
.
What is the proper way to capture the output of getMaximumWidth
?
P.S. This is my first time writing Latex document, feel free to point out anything i could've done better.
tikz-pgf lengths
New contributor
add a comment |
I have a problem with capturing returned value of my command.
Here is my preamble with command definition:
documentclass[convert={density=300,size=800x600,outext=.png}]{standalone}
usepackage[utf8]{inputenc}
usepackage{tikz}
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
% Function which returns maximum width needed to write any of provided arguments.
makeatletter
newlength{textLength@getMaximumWidthHelper}
newlength{textLength@getMaximumWidth}
newcommand{getMaximumWidthHelper}[2]
{%
settowidth{textLength@getMaximumWidthHelper}{pgfinterruptpicture #2endpgfinterruptpicture}%
pgfmathparse{max(#1,textLength@getMaximumWidthHelper)}%
@ifnextcharbgroup{getMaximumWidthHelper{pgfmathresult pt}}{pgfmathresult pt}%
}%
newcommand{getMaximumWidth}[1]
{%
settowidth{textLength@getMaximumWidth}{pgfinterruptpicture #1endpgfinterruptpicture}%
@ifnextcharbgroup{getMaximumWidthHelper{thetextLength@getMaximumWidth}}{thetextLength@getMaximumWidth}%
}%
makeatother
Working example used to test the above command:
begin{document}
getMaximumWidth{cmdOne}
getMaximumWidth{cmdOne}{cmdTwo}
getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}
end{document}
However, when I try to capture the output of getMaximumWidth
, it doesn't work as expected.
begin{document}
newlength{maximumWidth}
setlength{maximumWidth}{getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}}
themaximumWidth
end{document}
On the second line, the return value of getMaximumWidth
is not captured but instantly printed.
Afterwards I get an error:
! Missing number, treated as
zero.
After that, the third line just prints default value 0.0pt
.
What is the proper way to capture the output of getMaximumWidth
?
P.S. This is my first time writing Latex document, feel free to point out anything i could've done better.
tikz-pgf lengths
New contributor
1
while@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using{}
delimiters and a variable number of optional arguments which usedelimiters. You have defined a command with optional
{}
arguments which is wrong.
– David Carlisle
10 hours ago
macros do not have return values, yourgetMaximumWidth
expands to a series of assignments so is not a length that can be used insetlength
, you need to define it to leave a length in some command, saytempresult
then usegetMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax,getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
That is exactly whypgfmathparse
leaves its answer inpgfmathresult
– David Carlisle
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago
add a comment |
I have a problem with capturing returned value of my command.
Here is my preamble with command definition:
documentclass[convert={density=300,size=800x600,outext=.png}]{standalone}
usepackage[utf8]{inputenc}
usepackage{tikz}
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
% Function which returns maximum width needed to write any of provided arguments.
makeatletter
newlength{textLength@getMaximumWidthHelper}
newlength{textLength@getMaximumWidth}
newcommand{getMaximumWidthHelper}[2]
{%
settowidth{textLength@getMaximumWidthHelper}{pgfinterruptpicture #2endpgfinterruptpicture}%
pgfmathparse{max(#1,textLength@getMaximumWidthHelper)}%
@ifnextcharbgroup{getMaximumWidthHelper{pgfmathresult pt}}{pgfmathresult pt}%
}%
newcommand{getMaximumWidth}[1]
{%
settowidth{textLength@getMaximumWidth}{pgfinterruptpicture #1endpgfinterruptpicture}%
@ifnextcharbgroup{getMaximumWidthHelper{thetextLength@getMaximumWidth}}{thetextLength@getMaximumWidth}%
}%
makeatother
Working example used to test the above command:
begin{document}
getMaximumWidth{cmdOne}
getMaximumWidth{cmdOne}{cmdTwo}
getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}
end{document}
However, when I try to capture the output of getMaximumWidth
, it doesn't work as expected.
begin{document}
newlength{maximumWidth}
setlength{maximumWidth}{getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}}
themaximumWidth
end{document}
On the second line, the return value of getMaximumWidth
is not captured but instantly printed.
Afterwards I get an error:
! Missing number, treated as
zero.
After that, the third line just prints default value 0.0pt
.
What is the proper way to capture the output of getMaximumWidth
?
P.S. This is my first time writing Latex document, feel free to point out anything i could've done better.
tikz-pgf lengths
New contributor
I have a problem with capturing returned value of my command.
Here is my preamble with command definition:
documentclass[convert={density=300,size=800x600,outext=.png}]{standalone}
usepackage[utf8]{inputenc}
usepackage{tikz}
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
% Function which returns maximum width needed to write any of provided arguments.
makeatletter
newlength{textLength@getMaximumWidthHelper}
newlength{textLength@getMaximumWidth}
newcommand{getMaximumWidthHelper}[2]
{%
settowidth{textLength@getMaximumWidthHelper}{pgfinterruptpicture #2endpgfinterruptpicture}%
pgfmathparse{max(#1,textLength@getMaximumWidthHelper)}%
@ifnextcharbgroup{getMaximumWidthHelper{pgfmathresult pt}}{pgfmathresult pt}%
}%
newcommand{getMaximumWidth}[1]
{%
settowidth{textLength@getMaximumWidth}{pgfinterruptpicture #1endpgfinterruptpicture}%
@ifnextcharbgroup{getMaximumWidthHelper{thetextLength@getMaximumWidth}}{thetextLength@getMaximumWidth}%
}%
makeatother
Working example used to test the above command:
begin{document}
getMaximumWidth{cmdOne}
getMaximumWidth{cmdOne}{cmdTwo}
getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}
end{document}
However, when I try to capture the output of getMaximumWidth
, it doesn't work as expected.
begin{document}
newlength{maximumWidth}
setlength{maximumWidth}{getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}}
themaximumWidth
end{document}
On the second line, the return value of getMaximumWidth
is not captured but instantly printed.
Afterwards I get an error:
! Missing number, treated as
zero.
After that, the third line just prints default value 0.0pt
.
What is the proper way to capture the output of getMaximumWidth
?
P.S. This is my first time writing Latex document, feel free to point out anything i could've done better.
tikz-pgf lengths
tikz-pgf lengths
New contributor
New contributor
edited 8 hours ago
David Carlisle
501k4211471897
501k4211471897
New contributor
asked 11 hours ago
IskustvoIskustvo
1133
1133
New contributor
New contributor
1
while@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using{}
delimiters and a variable number of optional arguments which usedelimiters. You have defined a command with optional
{}
arguments which is wrong.
– David Carlisle
10 hours ago
macros do not have return values, yourgetMaximumWidth
expands to a series of assignments so is not a length that can be used insetlength
, you need to define it to leave a length in some command, saytempresult
then usegetMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax,getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
That is exactly whypgfmathparse
leaves its answer inpgfmathresult
– David Carlisle
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago
add a comment |
1
while@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using{}
delimiters and a variable number of optional arguments which usedelimiters. You have defined a command with optional
{}
arguments which is wrong.
– David Carlisle
10 hours ago
macros do not have return values, yourgetMaximumWidth
expands to a series of assignments so is not a length that can be used insetlength
, you need to define it to leave a length in some command, saytempresult
then usegetMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax,getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
That is exactly whypgfmathparse
leaves its answer inpgfmathresult
– David Carlisle
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago
1
1
while
@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using {}
delimiters and a variable number of optional arguments which use
delimiters. You have defined a command with optional {}
arguments which is wrong.– David Carlisle
10 hours ago
while
@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using {}
delimiters and a variable number of optional arguments which use
delimiters. You have defined a command with optional {}
arguments which is wrong.– David Carlisle
10 hours ago
macros do not have return values, your
getMaximumWidth
expands to a series of assignments so is not a length that can be used in setlength
, you need to define it to leave a length in some command, say tempresult
then use getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax, getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
macros do not have return values, your
getMaximumWidth
expands to a series of assignments so is not a length that can be used in setlength
, you need to define it to leave a length in some command, say tempresult
then use getMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax, getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
That is exactly why
pgfmathparse
leaves its answer in pgfmathresult
– David Carlisle
8 hours ago
That is exactly why
pgfmathparse
leaves its answer in pgfmathresult
– David Carlisle
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago
add a comment |
2 Answers
2
active
oldest
votes
I would write this something like
documentclass{article}
newcommandcmdFont{fontsize{10}{12}selectfont}% this is the default anyway
% Commands.
newcommandcmdOne {cmdFont aaa}
newcommandcmdTwo {cmdFont bbbbb}
newcommandcmdThree{cmdFont cccc}
newlength{maximumWidth}
newcommand{getMaximumWidth}[1]{%
settowidthmaximumWidth{begin{tabular}{@{}l@{}}#1end{tabular}}}
begin{document}
getMaximumWidth{cmdOne\ cmdTwo\ cmdThree}
themaximumWidth
end{document}
add a comment |
I'd generalize settowidth
and, by the way, get also height and depth for free.
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settowidth { #1 } { #2 }
}
NewDocumentCommand{settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settoheight { #1 } { #2 }
}
NewDocumentCommand{settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settodepth { #1 } { #2 }
}
dim_new:N l__iskustvo_tempa_dim
dim_new:N l__iskustvo_tempb_dim
tl_new:N l__iskustvo_temp_tl
cs_new_protected:Nn iskustvo_settomaxdim:Nnn
{
dim_zero:N l__iskustvo_tempa_dim
clist_map_variable:nNn { #3 } l__iskustvo_temp_tl
{ __iskustvo_measure:N #1 }
dim_set_eq:NN #2 l__iskustvo_tempa_dim
}
cs_new_protected:Nn __iskustvo_measure:N
{
#1{l__iskustvo_tempb_dim}{l__iskustvo_temp_tl}
dim_set:Nn l__iskustvo_tempa_dim
{
dim_max:nn { l__iskustvo_tempa_dim } { l__iskustvo_tempb_dim }
}
}
ExplSyntaxOff
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
begin{document}
newlength{test}
settomaximumwidth{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumheight{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumdepth{test}{cmdOne,cmdTwo,cmdThree}
thetest
end{document}
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
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
});
}
});
Iskustvo is a new contributor. Be nice, and check out our Code of Conduct.
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%2f487375%2fhow-to-properly-capture-return-value-of-a-command%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
I would write this something like
documentclass{article}
newcommandcmdFont{fontsize{10}{12}selectfont}% this is the default anyway
% Commands.
newcommandcmdOne {cmdFont aaa}
newcommandcmdTwo {cmdFont bbbbb}
newcommandcmdThree{cmdFont cccc}
newlength{maximumWidth}
newcommand{getMaximumWidth}[1]{%
settowidthmaximumWidth{begin{tabular}{@{}l@{}}#1end{tabular}}}
begin{document}
getMaximumWidth{cmdOne\ cmdTwo\ cmdThree}
themaximumWidth
end{document}
add a comment |
I would write this something like
documentclass{article}
newcommandcmdFont{fontsize{10}{12}selectfont}% this is the default anyway
% Commands.
newcommandcmdOne {cmdFont aaa}
newcommandcmdTwo {cmdFont bbbbb}
newcommandcmdThree{cmdFont cccc}
newlength{maximumWidth}
newcommand{getMaximumWidth}[1]{%
settowidthmaximumWidth{begin{tabular}{@{}l@{}}#1end{tabular}}}
begin{document}
getMaximumWidth{cmdOne\ cmdTwo\ cmdThree}
themaximumWidth
end{document}
add a comment |
I would write this something like
documentclass{article}
newcommandcmdFont{fontsize{10}{12}selectfont}% this is the default anyway
% Commands.
newcommandcmdOne {cmdFont aaa}
newcommandcmdTwo {cmdFont bbbbb}
newcommandcmdThree{cmdFont cccc}
newlength{maximumWidth}
newcommand{getMaximumWidth}[1]{%
settowidthmaximumWidth{begin{tabular}{@{}l@{}}#1end{tabular}}}
begin{document}
getMaximumWidth{cmdOne\ cmdTwo\ cmdThree}
themaximumWidth
end{document}
I would write this something like
documentclass{article}
newcommandcmdFont{fontsize{10}{12}selectfont}% this is the default anyway
% Commands.
newcommandcmdOne {cmdFont aaa}
newcommandcmdTwo {cmdFont bbbbb}
newcommandcmdThree{cmdFont cccc}
newlength{maximumWidth}
newcommand{getMaximumWidth}[1]{%
settowidthmaximumWidth{begin{tabular}{@{}l@{}}#1end{tabular}}}
begin{document}
getMaximumWidth{cmdOne\ cmdTwo\ cmdThree}
themaximumWidth
end{document}
answered 8 hours ago
David CarlisleDavid Carlisle
501k4211471897
501k4211471897
add a comment |
add a comment |
I'd generalize settowidth
and, by the way, get also height and depth for free.
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settowidth { #1 } { #2 }
}
NewDocumentCommand{settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settoheight { #1 } { #2 }
}
NewDocumentCommand{settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settodepth { #1 } { #2 }
}
dim_new:N l__iskustvo_tempa_dim
dim_new:N l__iskustvo_tempb_dim
tl_new:N l__iskustvo_temp_tl
cs_new_protected:Nn iskustvo_settomaxdim:Nnn
{
dim_zero:N l__iskustvo_tempa_dim
clist_map_variable:nNn { #3 } l__iskustvo_temp_tl
{ __iskustvo_measure:N #1 }
dim_set_eq:NN #2 l__iskustvo_tempa_dim
}
cs_new_protected:Nn __iskustvo_measure:N
{
#1{l__iskustvo_tempb_dim}{l__iskustvo_temp_tl}
dim_set:Nn l__iskustvo_tempa_dim
{
dim_max:nn { l__iskustvo_tempa_dim } { l__iskustvo_tempb_dim }
}
}
ExplSyntaxOff
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
begin{document}
newlength{test}
settomaximumwidth{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumheight{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumdepth{test}{cmdOne,cmdTwo,cmdThree}
thetest
end{document}
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
add a comment |
I'd generalize settowidth
and, by the way, get also height and depth for free.
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settowidth { #1 } { #2 }
}
NewDocumentCommand{settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settoheight { #1 } { #2 }
}
NewDocumentCommand{settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settodepth { #1 } { #2 }
}
dim_new:N l__iskustvo_tempa_dim
dim_new:N l__iskustvo_tempb_dim
tl_new:N l__iskustvo_temp_tl
cs_new_protected:Nn iskustvo_settomaxdim:Nnn
{
dim_zero:N l__iskustvo_tempa_dim
clist_map_variable:nNn { #3 } l__iskustvo_temp_tl
{ __iskustvo_measure:N #1 }
dim_set_eq:NN #2 l__iskustvo_tempa_dim
}
cs_new_protected:Nn __iskustvo_measure:N
{
#1{l__iskustvo_tempb_dim}{l__iskustvo_temp_tl}
dim_set:Nn l__iskustvo_tempa_dim
{
dim_max:nn { l__iskustvo_tempa_dim } { l__iskustvo_tempb_dim }
}
}
ExplSyntaxOff
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
begin{document}
newlength{test}
settomaximumwidth{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumheight{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumdepth{test}{cmdOne,cmdTwo,cmdThree}
thetest
end{document}
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
add a comment |
I'd generalize settowidth
and, by the way, get also height and depth for free.
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settowidth { #1 } { #2 }
}
NewDocumentCommand{settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settoheight { #1 } { #2 }
}
NewDocumentCommand{settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settodepth { #1 } { #2 }
}
dim_new:N l__iskustvo_tempa_dim
dim_new:N l__iskustvo_tempb_dim
tl_new:N l__iskustvo_temp_tl
cs_new_protected:Nn iskustvo_settomaxdim:Nnn
{
dim_zero:N l__iskustvo_tempa_dim
clist_map_variable:nNn { #3 } l__iskustvo_temp_tl
{ __iskustvo_measure:N #1 }
dim_set_eq:NN #2 l__iskustvo_tempa_dim
}
cs_new_protected:Nn __iskustvo_measure:N
{
#1{l__iskustvo_tempb_dim}{l__iskustvo_temp_tl}
dim_set:Nn l__iskustvo_tempa_dim
{
dim_max:nn { l__iskustvo_tempa_dim } { l__iskustvo_tempb_dim }
}
}
ExplSyntaxOff
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
begin{document}
newlength{test}
settomaximumwidth{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumheight{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumdepth{test}{cmdOne,cmdTwo,cmdThree}
thetest
end{document}
I'd generalize settowidth
and, by the way, get also height and depth for free.
documentclass{article}
usepackage{xparse}
ExplSyntaxOn
NewDocumentCommand{settomaximumwidth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settowidth { #1 } { #2 }
}
NewDocumentCommand{settomaximumheight}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settoheight { #1 } { #2 }
}
NewDocumentCommand{settomaximumdepth}{mm}
{% #1 = length, #2 = comma separated list of objects
iskustvo_settomaxdim:Nnn settodepth { #1 } { #2 }
}
dim_new:N l__iskustvo_tempa_dim
dim_new:N l__iskustvo_tempb_dim
tl_new:N l__iskustvo_temp_tl
cs_new_protected:Nn iskustvo_settomaxdim:Nnn
{
dim_zero:N l__iskustvo_tempa_dim
clist_map_variable:nNn { #3 } l__iskustvo_temp_tl
{ __iskustvo_measure:N #1 }
dim_set_eq:NN #2 l__iskustvo_tempa_dim
}
cs_new_protected:Nn __iskustvo_measure:N
{
#1{l__iskustvo_tempb_dim}{l__iskustvo_temp_tl}
dim_set:Nn l__iskustvo_tempa_dim
{
dim_max:nn { l__iskustvo_tempa_dim } { l__iskustvo_tempb_dim }
}
}
ExplSyntaxOff
% Font used for writing commands.
defcmdFont{fontsize{10}{12}selectfont}
% Commands.
defcmdOne {cmdFont aaa}
defcmdTwo {cmdFont bbbbb}
defcmdThree{cmdFont cccc}
begin{document}
newlength{test}
settomaximumwidth{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumheight{test}{cmdOne,cmdTwo,cmdThree}
thetest
settomaximumdepth{test}{cmdOne,cmdTwo,cmdThree}
thetest
end{document}
answered 7 hours ago
egregegreg
736k8919353261
736k8919353261
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
add a comment |
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
1
1
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
Thank you! I won't lie, I have absolutely no idea what you did, but the usage at the end is pretty neat.
– Iskustvo
7 hours ago
add a comment |
Iskustvo is a new contributor. Be nice, and check out our Code of Conduct.
Iskustvo is a new contributor. Be nice, and check out our Code of Conduct.
Iskustvo is a new contributor. Be nice, and check out our Code of Conduct.
Iskustvo is a new contributor. Be nice, and check out our Code of Conduct.
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%2f487375%2fhow-to-properly-capture-return-value-of-a-command%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
1
while
@ifnextcharbgroup
works you should almost never do it as it results in commands that fail to obey latex syntax conventions. All latex commands have a fixed number of arguments using{}
delimiters and a variable number of optional arguments which usedelimiters. You have defined a command with optional
{}
arguments which is wrong.– David Carlisle
10 hours ago
macros do not have return values, your
getMaximumWidth
expands to a series of assignments so is not a length that can be used insetlength
, you need to define it to leave a length in some command, saytempresult
then usegetMaximumWidth{cmdOne}{cmdTwo}{cmdThree}setlength{maximumWidth}{tempresult}
or using a latex-conforming syntax,getMaximumWidth{cmdOne,cmdTwo,cmdThree}setlength{maximumWidth}{tempresult}
– David Carlisle
9 hours ago
That is exactly why
pgfmathparse
leaves its answer inpgfmathresult
– David Carlisle
8 hours ago
Thanks a lot! I am not able to test everything at the moment, but your solution seems a lot easier and can be used as I intended.
– Iskustvo
8 hours ago