summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/luatruthtable/luatruthtable.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/luatruthtable/luatruthtable.sty')
-rw-r--r--macros/luatex/latex/luatruthtable/luatruthtable.sty286
1 files changed, 286 insertions, 0 deletions
diff --git a/macros/luatex/latex/luatruthtable/luatruthtable.sty b/macros/luatex/latex/luatruthtable/luatruthtable.sty
new file mode 100644
index 0000000000..1b940c48c9
--- /dev/null
+++ b/macros/luatex/latex/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