Values from Lua back to ConTeXt
Hello, what do I have to do so that the values (d1, m1, y1) from the Lua block are returned with Return and the commented out line \date[d=d1,m=m1,y=y1][weekday,{,~},day,{.~},month,{~},year] works in ConTeXt. In other words: how do I do it right? Thank you in advance Greetings Thomas PS. Sorry, I'm a totally novice in Lua. \starttext \startluacode function ddate(s) i = 1 j = 4 y1 = string.sub(s,i,j) i = 5 j = 6 m1 = string.sub(s,i,j) i = 7 j = 8 d1 = string.sub(s,i,j) context("Geht das: %s.%s.%s", d1, m1, y1) -- that works! --return d1, m1, y1 -- that works not! Why? end \stopluacode \def\DDate#1{\ctxlua{ddate("#1")}} \DDate{20241005} %\date[d=d1,m=m1,y=y1][weekday,{,~},day,{.~},month,{~},year] \blank \date[dd,mm,yyyy][weekday,{,~},day,{.~},month,{~},year] \blank \date[d=11,m=7,y=2024][weekday,{,~},day,{.~},month,{~},year] \stoptext
Thomas Meyer schrieb am 02.10.2024 um 15:44:
Hello, what do I have to do so that the values (d1, m1, y1) from the Lua block are returned with Return and the commented out line \date[d=d1,m=m1,y=y1][weekday,{,~},day,{.~},month,{~},year] works in ConTeXt. In other words: how do I do it right?
To call function or pass information from the TeX side to Lua you use the \directlua command (although ConTeXt provides many helpers and you won't use \directlua itself, e.g. the luacode environment is a wrapper for \directlua with a few special features). To get output back from the Lua side to TeX you use the tex.sprint (or tex.print) function. %%%% begin example \startluacode function Date(str) local year = string.sub(str,1,4) local month = string.sub(str,5,6) local day = string.sub(str,7,8) tex.sprint(day,".",month,".",year) -- tex.sprint(day .. "." .. month .. "." .. year) end \stopluacode \def\Date#1{\directlua{Date("#1")}} \starttext \Date{20241005} \stoptext %%%% end example To pass information from Lua to the value of the \date command you need a separate function call for each of them but ConTeXt makes it easier because it provides the possibility to call a TeX command from Lua itself where you now can pass Lua data to the command. %%%% begin example \startluacode function userdata.ddate(str) local year = string.sub(str,1,4) local month = string.sub(str,5,6) local day = string.sub(str,7,8) context.date({d=day,y=year,m=month},{"weekday,space,day,space,month,space,year"}) end \stopluacode \def\DDate#1{\ctxlua{userdata.ddate("#1")}} \starttext \DDate{20241005} \stoptext %%%% end example Wolfgang
Thank you very much, Wolfgang, that helps me a lot. But how can I change the formatting {“weekday,space,day,space,month,space,year”} so that I get a comma after weekday and a period after day? Where can I find something about this? Thanks again and have a nice day Thomas Am 02.10.24 um 19:44 schrieb Wolfgang Schuster:
Thomas Meyer schrieb am 02.10.2024 um 15:44:
Hello, what do I have to do so that the values (d1, m1, y1) from the Lua block are returned with Return and the commented out line \date[d=d1,m=m1,y=y1][weekday,{,~},day,{.~},month,{~},year] works in ConTeXt. In other words: how do I do it right?
To call function or pass information from the TeX side to Lua you use the \directlua command (although ConTeXt provides many helpers and you won't use \directlua itself, e.g. the luacode environment is a wrapper for \directlua with a few special features).
To get output back from the Lua side to TeX you use the tex.sprint (or tex.print) function.
%%%% begin example \startluacode
function Date(str) local year = string.sub(str,1,4) local month = string.sub(str,5,6) local day = string.sub(str,7,8) tex.sprint(day,".",month,".",year) -- tex.sprint(day .. "." .. month .. "." .. year) end
\stopluacode
\def\Date#1{\directlua{Date("#1")}}
\starttext
\Date{20241005}
\stoptext %%%% end example
To pass information from Lua to the value of the \date command you need a separate function call for each of them but ConTeXt makes it easier because it provides the possibility to call a TeX command from Lua itself where you now can pass Lua data to the command.
%%%% begin example \startluacode
function userdata.ddate(str) local year = string.sub(str,1,4) local month = string.sub(str,5,6) local day = string.sub(str,7,8)
context.date({d=day,y=year,m=month},{"weekday,space,day,space,month,space,year"})
end
\stopluacode
\def\DDate#1{\ctxlua{userdata.ddate("#1")}}
\starttext
\DDate{20241005}
\stoptext %%%% end example
Wolfgang ___________________________________________________________________________________
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 ___________________________________________________________________________________
Thomas Meyer schrieb am 03.10.2024 um 10:59:
Thank you very much, Wolfgang,
that helps me a lot. But how can I change the formatting {“weekday,space,day,space,month,space,year”} so that I get a comma after weekday and a period after day? Where can I find something about this?
Aside from keywords like day, weekday etc. the \date (and \currentdate) commands allows free input which used as separator between these keywords. To set a period as separator just put . as entry in the list but ensure to use braces around , because it will otherwise be interpreted as list separator. When you use TeX command within Lua use double backslashes (\\) because a backslash has special meaning here and with \\ you tell Lua to put a single \ in the output. %%%% begin example \starttext \currentdate[weekday,{, },day,. ,month,space,year] %\currentdate[weekday,{, },day,.\ ,month,space,year] \currentdate[weekday,\textcomma\ ,day,\textperiod\ ,month,space,year] \startluacode context.currentdate{ "weekday,{, },day,. ,month,space,year" } \stopluacode \startluacode context.currentdate{ "weekday,\\textcomma\\ ,day,\\textperiod\\ ,month,space,year" } \stopluacode \stoptext %%%% end example Wolfgang
Ah, thank you, Wolfgang, I tried {, } and not {, },. The result is that the rest vanishes. Thomas Am 03.10.24 um 11:27 schrieb Wolfgang Schuster:
Thomas Meyer schrieb am 03.10.2024 um 10:59:
Thank you very much, Wolfgang,
that helps me a lot. But how can I change the formatting {“weekday,space,day,space,month,space,year”} so that I get a comma after weekday and a period after day? Where can I find something about this?
Aside from keywords like day, weekday etc. the \date (and \currentdate) commands allows free input which used as separator between these keywords. To set a period as separator just put . as entry in the list but ensure to use braces around , because it will otherwise be interpreted as list separator.
When you use TeX command within Lua use double backslashes (\\) because a backslash has special meaning here and with \\ you tell Lua to put a single \ in the output.
%%%% begin example \starttext
\currentdate[weekday,{, },day,. ,month,space,year] %\currentdate[weekday,{, },day,.\ ,month,space,year]
\currentdate[weekday,\textcomma\ ,day,\textperiod\ ,month,space,year]
\startluacode context.currentdate{ "weekday,{, },day,. ,month,space,year" } \stopluacode
\startluacode context.currentdate{ "weekday,\\textcomma\\ ,day,\\textperiod\\ ,month,space,year" } \stopluacode
\stoptext %%%% end example
Wolfgang
participants (2)
-
Thomas Meyer
-
Wolfgang Schuster