summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua')
-rw-r--r--Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua162
1 files changed, 162 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua
new file mode 100644
index 00000000000..d8dd9621410
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua
@@ -0,0 +1,162 @@
+-- Functions for making brackets strict:
+
+stricttexAddBracesToBrackets = function(str)
+ p = str:find('[%[%]]')
+ if p then
+ while true do
+ if str:sub(p-1,p-1) == '\\' then
+ q = str:sub(p+1,-1):find('[%[%]]')
+ if q then
+ p = p + q
+ else
+ break
+ end
+ elseif str:sub(p-1,p+1) == '<[>' or str:sub(p-1,p+1) == '<]>' then
+ str = str:sub(1,p-2) .. str:sub(p,p) .. str:sub(p+2,-1)
+ q = str:sub(p,-1):find('[%[%]]')
+ if q then
+ p = p + q - 1
+ else
+ break
+ end
+ elseif str:sub(p,p) == '[' then
+ str = str:sub(1,p) .. '{' .. str:sub(p+1,-1)
+ q = str:sub(p+2,-1):find('[%[%]]')
+ if q then
+ p = p + q + 1
+ else
+ break
+ end
+ else -- i.e. if str:sub(p,p) == ']'
+ str = str:sub(1,p-1) .. '}' .. str:sub(p,-1)
+ q = str:sub(p+2,-1):find('[%[%]]')
+ if q then
+ p = p + q + 1
+ else
+ break
+ end
+ end
+ end
+ end
+ return str
+end
+
+stricttexStrictBracketsOn = function()
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexAddBracesToBrackets , "stricttexStrictBrackets"
+ )
+ ifStricttexStrictBracketsOn = true
+end
+
+stricttexStrictBracketsOff = function()
+ if ifStricttexStrictBracketsOn then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexStrictBrackets"
+ )
+ ifStricttexStrictBracketsOn = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\StrictBracketsOn } { \\StrictBracketsOff }\\endgroup')
+ end
+end
+
+-- Functions for numbers (and possibly primes) in command names
+
+stricttexReplaceNumbersByLetters = function(str)
+ str = str:gsub('0','numberZERO')
+ str = str:gsub('1','numberONE')
+ str = str:gsub('2','numberTWO')
+ str = str:gsub('3','numberTHREE')
+ str = str:gsub('4','numberFOUR')
+ str = str:gsub('5','numberFIVE')
+ str = str:gsub('6','numberSIX')
+ str = str:gsub('7','numberSEVEN')
+ str = str:gsub('8','numberEIGHT')
+ str = str:gsub('9','numberNINE')
+ return str
+end
+
+stricttexFormatNumbers = function(str)
+ local p, q = str:find('\\%a+%d')
+ if p then
+ while true do
+ local r,s = str:sub(q,-1):find('%w+') -- ^ in the beginning did not work
+ local newstring = stricttexReplaceNumbersByLetters( str:sub(q,q+s-1) )
+ local l = string.len(newstring)
+ str = str:sub(1, q-1) .. newstring .. str:sub(q+s,-1)
+ local t = str:sub(q+l,-1):find('\\%a+%d')
+ if t then
+ q = q + l + t - 1
+ else
+ break
+ end
+ end
+ end
+ return str
+end
+
+stricttexReplacePrimes = function(str)
+ str = str:gsub("'",'symbolPRIME')
+ return str
+end
+
+stricttexFormatNumbersAndPrimes = function(str)
+ local p, q = str:find("\\%a+[%d']")
+ if p then
+ while true do
+ local r,s = str:sub(q,-1):find("[%w']+") -- ^ in the beginning did not work
+ local newstring = stricttexReplaceNumbersByLetters( str:sub(q,q+s-1) )
+ mewstring = stricttexReplacePrimes( newstring )
+ local l = string.len(newstring)
+ str = str:sub(1, q-1) .. newstring .. str:sub(q+s,-1)
+ local t = str:sub(q+l,-1):find("\\%a+[%d']")
+ if t then
+ q = q + l + t - 1
+ else
+ break
+ end
+ end
+ end
+ return str
+end
+
+stricttexNumbersInCommandsOn = function()
+ if ifStricttexNumbersAndPrimesInCommands then
+ stricttexNumbersAndPrimesInCommandsOff()
+ end
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexFormatNumbers , "stricttexNumbersInCommands"
+ )
+ ifStricttexNumbersInCommands = true
+end
+
+stricttexNumbersInCommandsOff = function()
+ if ifStricttexNumbersInCommands then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexNumbersInCommands"
+ )
+ ifStricttexNumbersInCommands = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\NumbersInCommandsOn } { \\NumbersInCommandsOff }\\endgroup')
+ end
+end
+
+stricttexNumbersAndPrimesInCommandsOn = function()
+ if ifStricttexNumbersInCommands then
+ stricttexNumbersInCommandsOff()
+ end
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexFormatNumbersAndPrimes , "stricttexNumbersAndPrimesInCommands"
+ )
+ ifStricttexNumbersAndPrimesInCommandsOn = true
+end
+
+stricttexNumbersAndPrimesInCommandsOff = function()
+ if ifStricttexNumbersAndPrimesInCommandsOn then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexNumbersAndPrimesInCommands"
+ )
+ ifStricttexNumbersAndPrimesInCommandsOn = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\NumbersAndPrimesInCommandsOn } { \\NumbersAndPrimesInCommandsOff }\\endgroup')
+ end
+end \ No newline at end of file