X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fmaster-project%2Freport.git;a=blobdiff_plain;f=pret-lam.lua;h=0eb13240c59e8394150669fcb6f957508c3d4f05;hp=12fa94ec89c5f2cc6d1b8e5afe6b9358aca29f7a;hb=a3230eaf8e01ef71d3d53673f215e5b27ba9255f;hpb=bf2b6c6c3729b49e008e8afffdd379f03d603b37 diff --git a/pret-lam.lua b/pret-lam.lua index 12fa94e..0eb1324 100644 --- a/pret-lam.lua +++ b/pret-lam.lua @@ -28,7 +28,8 @@ local symbols = { ['*'] = {repr = '\\ast'}, ['~'] = {repr = '\\HDLine[width=.20 * \\the\\textwidth]'}, ['|'] = {repr = '\\char' .. utf.byte('|')}, - ['$'] = {repr = '\\char' .. utf.byte('$')}, + -- Use ▶ from our roman font, since Iwona doesn't have the glyph + ['▶'] = {repr = '{\\rm{}▶}'}, } -- Keywords that should be bold @@ -48,6 +49,15 @@ local bases = {} -- Store the last line for each indent level local indentlines = {} +function array_concat(a1, a2) + local res = a1 + for k,v in ipairs(a2) do + table.insert(res, v) + end + return res +end + + -- See if str starts with a symbol, and return the remaining string and that -- symbol. If no symbol from the table is matched, just returns the first -- character. We can do a lookup directly, since symbols can be different in @@ -165,6 +175,7 @@ local function do_indent(line) copyind = utf.sub(indentlines[prev], 1, #newind) setwidth = "\\setwidthof{" .. copyind .. "}\\to\\pretlamalignwidth" hskip = "\\hskip\\pretlamalignwidth" + print("{" .. setwidth .. hskip .. "}" .. rest) return "{" .. setwidth .. hskip .. "}" .. rest end -- No previous line? Just return the unmodified line then @@ -196,7 +207,7 @@ function vis.begin_of_display() if in_block == 0 then -- Initially allow subscripts using _ or just appending a number (later, -- we will add extra patterns here. - submatches = {"^(%a*)_([%a%d,]+)$", "^(%a+)([%d,]+)$"} + submatches = {"^(%a*)_([%a%d,]+)$", "^(%a+)(%d[%d,]+)$"} -- This stores all the bases we've encountered so far (to prevent -- duplicates). For each of them there will be a pattern in submatches -- above. @@ -211,38 +222,58 @@ vis.begin_of_inline = vis.begin_of_display vis.end_of_inline = vis.end_of_display function vis.flush_line(str,nested) - local result, state = { }, 0 - local finish, change = buffers.finish_state, buffers.change_state - str = do_indent(str) - -- Set the colorscheme, which is used by finish_state and change_state - buffers.currentcolors = colors + buffers.flush_result(vis.do_line(str, false), nested) +end + +function vis.do_line(str, no_indent) + local result = {} + if not no_indent then + -- Allow ignore of the indentation stuff when we're calling ourselves + -- for a partial line. + str = do_indent(str) + end while str ~= "" do local found = false local word, symbol - -- See if the next token is a word - word, str = take_word(str) - if word then - if keywords[res] then - -- Make all keywords bold - word = "{\\bold " .. word .. "}" - if keywords[res].small then - word = "\\small" .. word -- Curlies were added above + local text, rest = utf.match(str, "^%-%-(.-)%-%-(.*)") + if text then + table.insert(result, '\\strikethrough{') + -- Recursively call ourselves to handle spaces gracefully. + result = array_concat(result, vis.do_line(text, true)) + table.insert(result, '}') + -- Eat the processed characters + str = rest + elseif utf.match(str, "^%-%-") then + table.insert(result, '{\\italic{--') + -- Recursively call ourselves to handle spaces gracefully. + result = array_concat(result, vis.do_line(utf.sub(str, 3), true)) + table.insert(result, '}}') + -- Done with this line + str = '' + else + -- See if the next token is a word + word, str = take_word(str) + if word then + if keywords[res] then + -- Make all keywords bold + word = "{\\bold " .. word .. "}" + if keywords[res].small then + word = "\\small" .. word -- Curlies were added above + end + else + -- Process any subscripts in the word + word = do_subscripts(word) end + table.insert(result, word) else - -- Process any subscripts in the word - word = do_subscripts(word) + -- The next token is not a word, it must be a symbol + symbol, str = take_symbol(str) + table.insert(result, symbol) end - else - -- The next token is not a word, it must be a symbol - symbol, str = take_symbol(str) end - - -- Append the resulting token - result[#result+1] = word or symbol end - - state = finish(state, result) - buffers.flush_result(result,nested) + + return result end -- vim: set sw=4 sts=4 expandtab ai: