diff options
author | Karl Berry <karl@freefriends.org> | 2022-09-14 20:05:16 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-09-14 20:05:16 +0000 |
commit | 78a6ee41fa408e6132e77a658b396bf8d5998a99 (patch) | |
tree | 79bc177d2709940b5c1adb43293235d38a686e07 /Master/texmf-dist/tex/lualatex/luatruthtable | |
parent | 022c91c5cb0eae60b3bb03b6deb733e9c011c6f2 (diff) |
luatruthtable (14sep22)
git-svn-id: svn://tug.org/texlive/trunk@64392 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/luatruthtable')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/luatruthtable/luatruthtable.sty | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/luatruthtable/luatruthtable.sty b/Master/texmf-dist/tex/lualatex/luatruthtable/luatruthtable.sty new file mode 100644 index 00000000000..1b940c48c91 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/luatruthtable/luatruthtable.sty @@ -0,0 +1,286 @@ +% luaset package +% version 1.0 +% Licensed under LaTeX Project Public License v1.3c or later. The complete license text is available at http://www.latex-project.org/lppl.txt. +%Authors: Chetan Shirore and Dr. Ajit Kumar + +\ProvidesPackage{luatruthtable}[1.0] +\RequirePackage{xkeyval} +\RequirePackage{amsmath} +\RequirePackage{luacode} +\begin{luacode*} +local function toBinary(x,y) + y = y or math.max(1, select(2, math.frexp(x))) + local res = {} + for i = y, 1, -1 do + res[i] = math.fmod(x, 2) + x = math.floor((x - res[i]) / 2) + end + return res +end + +local function _not(a) + if a ==0 then return 1 + else return 0 end +end + +local lognot = {} + +local not_mt= { + __mul = function(a,b) + return _not(b) + + end +} + +setmetatable(lognot, not_mt) +_G.lognot = lognot + +local function _and(a, b) + if a == 1 and b == 1 then return 1 + else return 0 end +end + +local tmp1 = {} +local logand = {} + +local and_mt= { + __mul = function(a,b) + if b==logand then + tmp1[1]=a + return tmp1 + elseif a == tmp1 then + return _and(tmp1[1], b) + end + end +} + +setmetatable(tmp1, and_mt) +setmetatable(logand, and_mt) +_G.logand = logand + +local function _or(a, b) + if a == 0 and b == 0 then return 0 + else return 1 end +end + +local tmp2 = {} +local logor = {} + +local or_mt= { + __mul = function(a,b) + if b==logor then + tmp2[1]=a + return tmp2 + elseif a == tmp2 then + return _or(tmp2[1], b) + end + end +} + +setmetatable(tmp2, or_mt) +setmetatable(logor, or_mt) +_G.logor = logor + +local function _imp(a, b) + if a == 1 and b == 0 then return 0 + else return 1 end +end + +local tmp3 = {} +local imp = {} + +local imp_mt= { + __mul = function(a,b) + if b==imp then + tmp3[1]=a + return tmp3 + elseif a == tmp3 then + return _imp(tmp3[1], b) + end + end +} + +setmetatable(tmp3, imp_mt) +setmetatable(imp, imp_mt) +_G.imp = imp + +local function _iff(a, b) + if a == b then return 1 + else return 0 end +end + +local tmp4 = {} +local iff = {} + +local iff_mt= { + __mul = function(a,b) + if b==iff then + tmp4[1]=a + return tmp4 + elseif a == tmp4 then + return _iff(tmp4[1], b) + end + end +} + +setmetatable(tmp4, iff_mt) +setmetatable(iff, iff_mt) +_G.iff = iff + +local function _xor(a, b) + if a ~= b then return 1 + else return 0 end +end + +local tmp5 = {} +local logxor = {} + +local xor_mt= { + __mul = function(a,b) + if b==logxor then + tmp5[1]=a + return tmp5 + elseif a == tmp5 then + return _xor(tmp5[1], b) + end + end +} + +setmetatable(tmp5, xor_mt) +setmetatable(logxor, xor_mt) +_G.logxor = logxor + +local function _nand(a, b) + if a ==1 and b == 1 then return 0 + else return 1 end +end + +local tmp6 = {} +local lognand = {} + +local nand_mt= { + __mul = function(a,b) + if b==lognand then + tmp6[1]=a + return tmp6 + elseif a == tmp6 then + return _nand(tmp6[1], b) + end + end +} + +setmetatable(tmp6, nand_mt) +setmetatable(lognand, nand_mt) +_G.lognand = lognand + +local function _nor(a, b) + if a ==0 and b == 0 then return 1 + else return 0 end +end + +local tmp7 = {} +local lognor = {} + +local nor_mt= { + __mul = function(a,b) + if b==lognor then + tmp7[1]=a + return tmp7 + elseif a == tmp7 then + return _nor(tmp7[1], b) + end + end +} + +setmetatable(tmp7, nor_mt) +setmetatable(lognor, nor_mt) +_G.lognor = lognor + +local function _xnor(a, b) + if a == b then return 1 + else return 0 end +end + +local tmp8 = {} +local logxnor = {} + +local xnor_mt= { + __mul = function(a,b) + if b==logxnor then + tmp8[1]=a + return tmp8 + elseif a == tmp8 then + return _xnor(tmp8[1], b) + end + end +} + +setmetatable(tmp8, xnor_mt) +setmetatable(logxnor, xnor_mt) +_G.logxnor = logxnor + +function truthTable(str0,str,trtext,fltext) +local eval="" +local names={lognot=lognot,logand=logand,logor=logor, imp=imp, + iff=iff, logxor=logxor,lognand=lognand,lognor=lognor, logxnor=logxnor} +local vars={} +local expr={} +local countexp = 1 +local countvars =1 +local res="" +local sep=" & " +trtext = trtext or "$T$" +fltext = fltext or "$F$" +for variables in string.gmatch(str0, '([^,]+)') do + vars[countvars] = variables + countvars = countvars + 1 +end + +for subexp in string.gmatch(str, '([^,]+)') do + expr[countexp] = subexp + countexp = countexp + 1 +end + +local n =#vars +for i =1,2^n do + itr = toBinary(i,n) + + for j=1, #itr do + names[vars[j]] = itr[j] +end + + for k = 1, #expr do + res= res ..sep.. load("return " .. expr[k],nil,"t",names)() + end +if i~=2^n then +eval = eval .. table.concat(toBinary(i,n)," & ") .. res .."\\\\" +else +eval = eval .. table.concat(toBinary(i,n)," & ") .. res +end + res="" +end + +if trtext:gsub("%s+", "") =="0" or trtext:gsub("%s+", "") == "$0$" +or fltext:gsub("%s+", "") =="1" or fltext:gsub("%s+", "") == "$1$" +then +eval=eval +else +eval=eval:gsub(0,fltext):gsub(1,trtext) +end +return eval +end + +\end{luacode*} + +% ========= KEY DEFINITIONS ========= +\define@key{luatruthtable}{trtext}{\def\luatrtbl@trtext{#1}} +\define@key{luatruthtable}{fltext}{\def\luatrtbl@fltext{#1}} + +% ========= KEY DEFAULTS ========= +\setkeys{luatruthtable}{trtext=$T$,fltext=$F$}% +% ========= Defining Command ========= +\newcommand{\luaTruthTable}[3][]{% + \setkeys{luatruthtable}{#1} + \directlua{tex.sprint(truthTable(\luastringN{#2},\luastringN{#3},'\luatrtbl@trtext','\luatrtbl@fltext'))}} % + +\endinput |