local commands = {}
-- A command to create a horizontal rule.
commands.rule = "\\HLine[width=.40 * \\the\\textwidth]"
--- Pretty printer to use for the stuff before and after the line
-commands.before_pret = "lam"
-commands.after_pret = "lam"
+-- Typing environment to use for the stuff before and after the line. Will be
+-- prefixed with \start and \stop automatically.
+commands.beforeenv = "unboxedlambda"
+commands.afterenv = "unboxedlambda"
-- Frame commands to use for the left (before + line + after) and right
-- (conditions) parts. Should include an opening {, which will be closed
-- automatically.
-commands.leftframe = "\\framed[offset=0mm,location=middle,strut=no,align=right,frame=off,width=.48\\textwidth]{\\sans"
+commands.leftframe = "\\framed[offset=0mm,location=middle,strut=no,align=right,frame=off,width=.48\\textwidth]{"
commands.rightframe = "\\framed[offset=0mm,location=middle,strut=no,align=right,frame=off,width=.48\\textwidth]{"
-- A table to keep the lines in this buffer, so we can process them all at
-- once at the end.
local lines
--- A counter to keep track of the mininum amount of indentation found in each
--- display.
-local min_indent
-- Some helper functions
local function ltrim(s)
-- Capture all lines, without generating any output
function vis.begin_of_display()
lines = {}
- -- Let all the lambda pretty printing in this buffer use shared subscript
- -- detection
- buffers.visualizers.handlers.lam.begin_of_block()
- min_indent = nil
end
function vis.begin_of_line(n)
-- Don't generate output here
end
function vis.flush_line(str, nested)
- -- Keep track of the minimum indent level of all lines. Note that we don't
- -- look at empty lines, of course.
- indent = utf.len(utf.match(str, "^%s*"))
- -- Find the lowest indent (but don't count empty lines)
- if (not min_indent or indent < min_indent) then
- min_indent = indent
- end
-
table.insert(lines, str)
-- Don't generate output here
end
-- We do the actual work here. Process all the lines in the buffer and
-- generate output for them.
function vis.end_of_display()
- -- Strip indent that is present on every line
- min_indent = min_indent or 0
- for i = 1,#lines do
- lines[i] = utf.sub(lines[i], min_indent + 1)
- end
-
-- Find the horizontal rule, and see how long it is.
len = nil
for i = 1,#lines do
-- Real output starts here
--
+ -- Let all the lambda pretty printing in this buffer use shared subscript
+ -- detection
+ tex.sprint("\\directlua{buffers.visualizers.handlers.lam.begin_of_block()}")
+
-- Ensure the left and right frames end up next to each other.
tex.sprint("\\dontleavehmode")
-- Open and fill the left frame
tex.sprint(commands.leftframe)
- prettyprint('lam', before)
+ tex.sprint("\\start" .. commands.beforeenv)
+
+ tex.sprint(table.concat(before, "\n"))
+
+ tex.sprint("\\stop" .. commands.beforeenv)
tex.sprint(commands.rule)
- prettyprint('lam', after)
+ tex.sprint("\\start" .. commands.afterenv)
+
+ tex.sprint(table.concat(after, "\n"))
+
+ tex.sprint("\\stop" .. commands.afterenv)
-- Close the left frame
tex.sprint("}")
-- Close the right frame
tex.sprint("}")
+
+ tex.sprint("\\directlua{buffers.visualizers.handlers.lam.end_of_block()}")
-- Clean up
lines = {}
- buffers.visualizers.handlers.lam.end_of_block()
end
-- vim: set sw=4 sts=4 expandtab ai: