Make pret-lam support superscripts.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 11 Jun 2009 13:47:55 +0000 (15:47 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Thu, 11 Jun 2009 13:47:55 +0000 (15:47 +0200)
Both explicit superscripts, using _ and implicit by just appending a
number are supported.

pret-lam.lua

index b882196..77fcc5d 100644 (file)
@@ -61,36 +61,55 @@ end
 -- Take a single word from str, if posible. Returns the rest of the string and
 -- the word taken.
 function buffers.visualizers.lam.take_word(str)
-        res, newstr = utf.match(str, "^(%a+)(.*)")
+        res, newstr = utf.match(str, "^(%a[%a%d_]+)(.*)")
         return res, newstr or str
 end
 
+-- Tries to match each of the patterns and returns the captures of the first
+-- matching pattern (up to 5 captures are supported). Returns nil when nothing
+-- matches.
+function buffers.visualizers.lam.match_mul(str, patterns)
+    for i, pat in ipairs(patterns) do
+        a, b, c, d, e = utf.match(str, pat)
+        if a then
+            return a, b, c, d, e
+        end
+    end
+    return nil
+end
+
 function buffers.visualizers.lam.flush_line(str,nested)
     local result, state = { }, 0
     local finish, change = buffers.finish_state, buffers.change_state
     local take_symbol = buffers.visualizers.lam.take_symbol
     local take_word = buffers.visualizers.lam.take_word
+    local match_mul = buffers.visualizers.lam.match_mul
     -- Set the colorscheme, which is used by finish_state and change_state
     buffers.currentcolors = buffers.visualizers.lam.colors
 
     while str ~= "" do
         local found = false
-        local res
+        local word, symbol
         -- See if the next token is a word
-        res, str = take_word(str)
-        if res then
+        word, str = take_word(str)
+        if word then
             if buffers.visualizers.lam.keywords[res] then
-                -- Make all keywors bold
-                res = "{\\bold " .. res ..  "}"
+                -- Make all keywords bold
+                word = "{\\bold " .. word ..  "}"
+            else
+                -- Allow subscripts using _ or just appending a number.
+                base, sub = match_mul(res, {"^(.*)_([%a%d,]+)$", "^(.*[^%d])(%d*)$"})
+                if sub then
+                    word = base .. "\\low{" .. sub .. "}"
+                end
             end
-            -- All other words are unmodified
         else
             -- The next token is not a word, it must be a symbol
-            res, str = take_symbol(str)
+            symbol, str = take_symbol(str)
         end
 
         -- Append the resulting token
-        result[#result+1] = res
+        result[#result+1] = word or symbol
     end
 
     state = finish(state, result)