Own command definition breaks with interaction: Use of \do_my_command doesn't match its definition
Hi, I want to make a proper definition of a new command to be able to process it in Lua. I found something on StackOverflow [1] but that breaks in enumeration _and_ when interaction is enabled and I do not understand why? Can you give me some help here? I want to make commands like \foo{bla} and \foo[b]{bla} possible at the same time. Here is a minimal example (also attached): ``` \startluacode function userdata.my_command(keywords, text) commands.writestatus("test", string.format("text: %s, config: %s", text, keywords)) local cfg = utilities.parsers.settings_to_hash(keywords) if cfg['emph'] ~= nil then context("\\emph{" .. text .. "}") elseif cfg['bold'] ~= nil then context("\\bold{" .. text .. "}") else context(text) end end \stopluacode % without that line there is no problem \setupinteraction[state=start] \defineenumeration[enu][text=Enu] \unprotect \def\mc{\dosingleempty\do_my_command} \def\do_my_command[#1]#2{% \iffirstargument{% \ctxlua{userdata.my_command('#1', [==[#2]==])}% }\else {% \ctxlua{userdata.my_command('', [==[#2]==])}% }\fi } \protect \starttext % all the following works \mc{foo} \mc[bold]{foo} \mc[emph]{foo} \startenu[title=Some] \stopenu % this breaks \startenu[title=Some \mc{foo}] \stopenu \stoptext ``` The compilation fails with: ``` tex error > tex error on line 41 in file ./test.tex: Use of \do_my_command doesn't match its definition ``` Best, Gerion [1] https://tex.stackexchange.com/a/55778
Hi, You can try:
\unexpanded\def\do_my_command[#1]#2{%
But there is probably a cleaner way to implement optional arguments with lua? Best wishes, Taco
On 25 Jan 2024, at 09:18, Gerion Entrup
wrote: Hi,
I want to make a proper definition of a new command to be able to process it in Lua. I found something on StackOverflow [1] but that breaks in enumeration _and_ when interaction is enabled and I do not understand why? Can you give me some help here?
I want to make commands like \foo{bla} and \foo[b]{bla} possible at the same time. Here is a minimal example (also attached):
``` \startluacode function userdata.my_command(keywords, text) commands.writestatus("test", string.format("text: %s, config: %s", text, keywords)) local cfg = utilities.parsers.settings_to_hash(keywords)
if cfg['emph'] ~= nil then context("\\emph{" .. text .. "}") elseif cfg['bold'] ~= nil then context("\\bold{" .. text .. "}") else context(text) end end \stopluacode
% without that line there is no problem \setupinteraction[state=start]
\defineenumeration[enu][text=Enu]
\unprotect \def\mc{\dosingleempty\do_my_command} \def\do_my_command[#1]#2{% \iffirstargument{% \ctxlua{userdata.my_command('#1', [==[#2]==])}% }\else {% \ctxlua{userdata.my_command('', [==[#2]==])}% }\fi } \protect
\starttext
% all the following works \mc{foo} \mc[bold]{foo} \mc[emph]{foo}
\startenu[title=Some] \stopenu
% this breaks \startenu[title=Some \mc{foo}] \stopenu
\stoptext ```
The compilation fails with: ``` tex error > tex error on line 41 in file ./test.tex: Use of \do_my_command doesn't match its definition ```
Best, Gerion
[1] https://tex.stackexchange.com/a/55778
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / https://mailman.ntg.nl/mailman3/lists/ntg-context.ntg.nl webpage : https://www.pragma-ade.nl / https://context.aanhet.net (mirror) archive : https://github.com/contextgarden/context wiki : https://wiki.contextgarden.net ___________________________________________________________________________________
— Taco Hoekwater E: taco@bittext.nl genderfluid (all pronouns)
Gerion Entrup schrieb am 25.01.2024 um 09:18:
Hi,
I want to make a proper definition of a new command to be able to process it in Lua. I found something on StackOverflow [1] but that breaks in enumeration _and_ when interaction is enabled and I do not understand why? Can you give me some help here?
I want to make commands like \foo{bla} and \foo[b]{bla} possible at the same time. Here is a minimal example (also attached):
``` \startluacode function userdata.my_command(keywords, text) commands.writestatus("test", string.format("text: %s, config: %s", text, keywords)) local cfg = utilities.parsers.settings_to_hash(keywords)
if cfg['emph'] ~= nil then context("\\emph{" .. text .. "}") elseif cfg['bold'] ~= nil then context("\\bold{" .. text .. "}") else context(text) end end \stopluacode
\startluacode function userdata.my_command(keywords, text) local keywords = utilities.parsers.settings_to_hash(keywords) if keywords['emph'] then context.emph(text) elseif keywords['bold'] then context.bold(text) else context(text) end end \stopluacode
% without that line there is no problem \setupinteraction[state=start]
\defineenumeration[enu][text=Enu]
\defineenumeration[enu][text=Enu,title=yes]
\unprotect \def\mc{\dosingleempty\do_my_command} \def\do_my_command[#1]#2{% \iffirstargument{% \ctxlua{userdata.my_command('#1', [==[#2]==])}% }\else {% \ctxlua{userdata.my_command('', [==[#2]==])}% }\fi } \protect
\tolerant\protected\def\mc[#1]#2% {\ctxlua{userdata.my_command("#1","#2")}} Wolfgang
participants (3)
-
Gerion Entrup
-
Taco Hoekwater
-
Wolfgang Schuster