I’m trying to define a command that will take 3 arguments each one possibly empty. An empty argument will slightly modify the output. Let me give a non-working example :
newcommandfoo[3] textbfbar( ifthenelseisempty#1 #1, #2) ifthenelseisempty#3 cap #3
And this is what I would like to get :
fooabc
=>foob
=>foobc
=>
But obviously it doesn’t work. I’d like, as much as possible, to call this function with only one type of bracket (since I will always write the 3 pairs of bracket even if they are empty). As far as I’m concern, I consider that there’s no optional arguments in it, only mandatory arguments that are possibly empty. I pretty sure I’m not doing things right but I really don’t get the idea of this newcommand
function.
Thanks for any help.
While xparse
is one way to go, here’s another approach:
documentclassarticle newcommandfoo[3]%% textbfbar(%% expandafterifxexpandafterrelaxdetokenize#1relax else #1, fi #2) expandafterifxexpandafterrelaxdetokenize#3relax else cap#3 fi pagestyleempty begindocument $fooabc$ $foob$ $foobc$ enddocument
The expandafterifxexpandafterrelaxdetokenize#1relax
is a nice way of testing for an empty argument to your macro. Essentially if #1
is empty, then the detokenize#1
essentially vanishes and the test becomes
ifxrelaxrelax
which will test to true.
If #1
is not empty, then detokenize
will result in a token that is not going to result in a true value when compared with relax
.
To make your code a little more readable, you could define your own test commnad sequence:
newcommandaeifempty[3]%% expandafterifxexpandafterrelaxdetokenize#1relax #2%% else #3%% fi
and then your foo
could be written as
newcommandfoo[3]%% textbfbar(%% aeifempty#1#1,%% #2) aeifempty#3cap#3
If you use xparse
, you need not define your own test for emptyness:
documentclassarticle usepackageamsmath usepackagexparse ExplSyntaxOn NewDocumentCommandifnotblankmm tl_if_blank:nF #1 #2 ExplSyntaxOff NewDocumentCommandfoommm % operatornamemathbfbar(ifnotblank#1#1,#2)% ifnotblank#3cap #3% begindocument begintabular@ll@ verb|fooabc| & $fooabc$ verb|foob| & $foob$ verb|foobc| & $foobc$ verb|foo b | & $foob$ verb|foo bc| & $foobc$ endtabular enddocument
The function tl_if_blank:nF
returns the second argument if and only if the first argument is not blank (a sequence of zero or more blank spaces).
Of course, for the particular application just two arguments would be needed:
NewDocumentCommandfoomm% operatornamemathbfbar(#1)% notblank#2cap#2%
and fooa,bc
, foobc
or foob
would do.
With xparse
and NewDocumentCommand
it is possible to define a macro with two optional and one mandatory argument, where the latter is the middle one:
documentclassarticle usepackageamsmath usepackagexparse NewDocumentCommandfoo o m o % textbar(% IfValueT#1#1,% #2)% IfValueT#3cap #3% begindocument $foo[a]b[c]$ $foob$ $foo[a]b$ $foob[c]$ enddocument
But this definition can be problematic if the command is followed by a literal [
the is part of the equation. In that case there must be a space between the mandatory argument and the opening bracket:
$foob [x,y,z]$
The OP didn’t say what packages, if any, were used.
The OP’s code works for me with usepackagexifthen
.
It doesn’t work with usepackageifthen
, which doesn’t implement isempty
.
With usepackageifthen
, you can do
newcommandfoo[3] textbfbar( ifthenelseequal#1 #1, #2) ifthenelseequal#3 cap #3
but the xifthen
version is more efficient because isempty
doesn’t expand its argument, but equal
does.
Related
Define newcommand with multiple sorted mandatory arguments that can be empty – tex.stackexchange.com #JHedzWorlD
No comments:
Post a Comment