% Kale Ewasiuk (kalekje@gmail.com) % 2023-08-27 % Copyright (C) 2021-2023 Kale Ewasiuk % % Permission is hereby granted, free of charge, to any person obtaining a copy % of this software and associated documentation files (the "Software"), to deal % in the Software without restriction, including without limitation the rights % to use, copy, modify, merge, publish, distribute, sublicense, and/or sell % copies of the Software, and to permit persons to whom the Software is % furnished to do so, subject to the following conditions: % % The above copyright notice and this permission notice shall be included in % all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF % ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED % TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A % PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT % SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR % ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN % ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, % OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE % OR OTHER DEALINGS IN THE SOFTWARE. \ProvidesPackage{penlightplus}[2023-08-27] \RequirePackage{luacode} \RequirePackage{luakeys} \RequirePackage[import]{penlight} \RequirePackage{etoolbox} \DeclareOption{globals}{\luadirect{__PL_GLOBALS__ = true}} \DeclareOption{pl}{\directlua{pl = penlight}} \ProcessOptions*\relax \luadirect{require'penlightplus'} \global\newcommand{\writePDFmetadata}{\luadirect{penlight.tex.writePDFmetadata()}} \NewDocumentCommand{\writePDFmetadatakv}{ s m }{ \IfBooleanTF{#1}{% if *, overwrite everything \luadirect{ __PDFmetadata__ = penlight.luakeys.parse(\luastring{#2}) penlight.tex.writePDFmetadata() }}{ \luadirect{ __PDFmetadata__ = __PDFmetadata__ or {} penlight.tablex.update(__PDFmetadata__, penlight.luakeys.parse(\luastring{#2})) penlight.tex.writePDFmetadata() }} } \gdef\luastringT#1{\luastring{\unexpanded\expandafter\expandafter\expandafter{#1}}} % expand luastring twice \global\let\luastringF\luastring % fully expanded luastring % allow control over expansion of arguments to a latex function \NewDocumentCommand{\MakeluastringCommands}{O{} m }{% #1 the desired commands #2 defaults \luadirect{penlight.tex.aliasluastring(\luastring{#2},\luastring{#1})}% } \NewDocumentCommand{\splitToComma}{ O{nn} m m }{% \MakeluastringCommands[nn]{#1}% \luadirect{penlight.tex.split2comma(\plluastringA{#2},\plluastringB{#3})}% } \NewDocumentCommand{\splitToItems}{ O{NN} m m }{% \MakeluastringCommands[nn]{#1}% \luadirect{penlight.tex.split2items(\plluastringA{#2},\plluastringB{#3})}% } %%%% \newtoggle{luaexpr}\togglefalse{luaexpr} \begin{luacode*} function toggle_luaexpr(expr) if expr then tex.sprint('\\toggletrue{luaexpr}') else tex.sprint('\\togglefalse{luaexpr}') end end \end{luacode*} \NewDocumentCommand{\ifluax}{m m O{}}{% \luadirect{toggle_luaexpr(#1)}% \iftoggle{luaexpr}{#2}{#3}% \togglefalse{luaexpr}% safety set to false } \NewDocumentCommand{\ifluaxv}{m m O{}}{\ifluax{penlight.hasval(#1)}{#2}[#3]} % testing ifluax % {-->\ifluax{1 == 2}{\LARGE TRUE}[\tiny FALSE]<--test\\ % -->\ifluax{abc == nil}{\LARGE TRUE}[\tiny FALSE]<--test} %%% \NewDocumentCommand{\newtbl}{m}{\luadirect{ penlight.tbls[\luastring{#1}] = {} penlight.tbls._recent = penlight.tbls[\luastring{#1}] }} \NewDocumentCommand{\tblfrkv}{m m O{}}{ \luadirect{ penlight.tbls[\luastring{#1}] = penlight.luakeys.parse(\luastring{#2}, penlight.luakeys.parse(\luastring{#3})) penlight.tbls._recent = penlight.tbls[\luastring{#1}] }} \NewDocumentCommand{\chgtbl}{ m }{ \luadirect{ penlight.tbls._recent = penlight.tbls[\luastring{#1}] }} \NewDocumentCommand{\gettbl}{m}{\luadirect{ penlight.get_tbl_item(\luastring{#1}, true) }} \NewDocumentCommand{\settbl}{m m}{\luadirect{ penlight.set_tbl_item(\luastring{#1}, \luastring{#2}) }} \NewDocumentCommand{\deftbl}{ m m }{\luadirect{% define a table, use * to make definition token.set_macro(\luastring{#2}, tostring(penlight.get_tbl_item(\luastring{#1}))) }} \NewDocumentCommand{\gdeftbl}{ m m }{\luadirect{% define a table, use * to make global definition token.set_macro(\luastring{#2}, tostring(penlight.get_tbl_item(\luastring{#1})), 'global') }} \NewDocumentCommand{\iftbl}{m m O{}}{\ifluax{penlight.get_tbl_item(\luastring{#1})}{#2}[#3]} \NewDocumentCommand{\iftblv}{m m O{}}{\ifluaxv{penlight.get_tbl_item(\luastring{#1})}{#2}[#3]} %\NewDocumentCommand{\tblupd}{ m m}{\luadirect{ % penlight.tablex.update(penlight.tbls[\luastring{#1}], penlight.tbls[\luastring{#2}]) %}} % %\NewDocumentCommand{\tblupdkv}{ m m }{\luadirect{ % penlight.tablex.update(penlight.tbls[\luastring{#1}], penlight.luakeys.parse(\luastring{#2})) %}} % %% todo need a get table function. If blank is passed, the last table referenced is used. %\NewDocumentCommand{\tblfrkvII}{ m m m }{\luadirect{ % _G[\luastring{#1}] = penlight.tablex.update(penlight.luakeys.parse(\luastring{#2}), luakeys.parse(\luastring{#3})) %}} %\NewDocumentCommand{\tbldo}{m m O{} }{\luadirect{ % % tex.sprint(tostring(_G[\luastring{#1}][#2])) % % todo allow one to use pl tablex function here, % % {tbl}{update}[arg1][arg2] % penlight.tablex[\luastring[#1]](_G[\luastring{}], _G[\luastring{}]) %}} %%%%%%%%5 %\begin{luacode*} % function set_dim(name, len) % tex.sprint('\\global\\let\\'..name..'\\relax') -- reset length % tex.sprint('\\global\\newlength{\\'..name..'}') -- make new len % tex.setglue(name, tex.sp(len)) % end %\end{luacode*}