local symbols = {
-- Note, the space we replace with is a Unicode non-breaking space
-- (U+00A0).
- [' '] = {repr = ' '},
- ['_'] = {repr = '\\_'},
- ['->'] = {repr = '→'},
- ['=>'] = {repr = '⇒'},
+ {symbol = ' ', repr = ' '},
+ {symbol = '_', repr = '\\_'},
+ {symbol = '->>', repr = '\\twoheadrightarrow'},
+ {symbol = '->', repr = '→'},
+ {symbol = '=>', repr = '⇒'},
-- The default * sits very high above the baseline, \ast (u+2217) looks
-- better.
- ['*'] = {repr = '\\ast'},
- ['~'] = {repr = '\\HDLine[width=.20 * \\the\\textwidth]'},
- ['|'] = {repr = '\\char' .. utf.byte('|')},
- -- Use ▶ from our roman font, since Iwona doesn't have the glyph
- ['▶'] = {repr = '{\\rm{}▶}'},
+ {symbol = '*', repr = '\\ast'},
+ {symbol = '~', repr = '\\HDLine[width=.20 * \\the\\textwidth]'},
+ {symbol = '|', repr = '\\char' .. utf.byte('|')},
+ -- Use ▶ and ∧ from our roman font, since Iwona doesn't have the glyph
+ {symbol = '▶', repr = '{\\rm{}▶}'},
+ --{symbol = '∧', repr = '{$∧$}'},
+ {symbol = '∧', repr = '{\\rm{}∧}'},
}
-- Keywords that should be bold
-- character. We can do a lookup directly, since symbols can be different in
-- length, so we just loop over all symbols, trying them in turn.
local function take_symbol(str)
- for symbol,props in pairs(symbols) do
+ for i,props in ipairs(symbols) do
-- Try to remove symbol from the start of str
- symbol, newstr = utf.match(str, "^(" .. symbol .. ")(.*)")
+ symbol, newstr = utf.match(str, "^(" .. props.symbol .. ")(.*)")
if symbol then
-- Return this tokens repr, or just the token if it has no
-- repr.
-- the word taken.
local function take_word(str)
-- A word must always start with a-z (in particular, λ is not a valid
- -- start of a word).
- res, newstr = utf.match(str, "^([a-zA-Z][%a%d%+%-%,_]+)(.*)")
+ -- start of a word). A word must always end with a letter or a digit
+ res, newstr = utf.match(str, "^([a-zA-Z][%a%d%+%-%,_]*[%a%d]+)(.*)")
+ if not res then
+ -- The above does not catch single letter words
+ res, newstr = utf.match(str, "^([a-zA-Z])(.*)")
+ end
return res, newstr or str
end
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
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[%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.