-- support magic comments used by TeXShop and TeXWorks to detect used engine and format -- local M = {} local log = logging.new("detect engine") local htlatex = require "make4ht-htlatex" -- we must change build sequence when Plain TeX is requested local change_table = { tex = { htlatex = "etex", command = htlatex.httex }, pdftex = { htlatex = "etex", command = htlatex.httex }, etex = { htlatex = "etex", command = htlatex.httex }, luatex = { htlatex = "dviluatex", command = htlatex.httex }, xetex = { htlatex = "xetex -no-pdf", command = htlatex.httex }, xelatex = { htlatex = "xelatex -no-pdf", }, lualatex = { htlatex = "dvilualatex", }, pdflatex = { htlatex = "latex" }, harflatex = { htlatex = "lualatex-dev --output-format=dvi" }, harftex= { htlatex = "harftex --output-format=dvi", command = htlatex.httex } } local function find_magic_program(filename) -- find the magic line containing program name local get_comment = function(line) return line:match("%s*%%%s*(.+)") end local empty_line = function(line) return line:match("^%s*$") end for line in io.lines(filename) do local comment = get_comment(line) -- read line after line from the file, break the processing after first non comment or non empty line if not comment and not empty_line(line) then return nil, "Cannot find program name" end comment = comment or "" -- comment is nil for empty lines local program = comment:match("!%s*[Tt][Ee][Xx].-program%s*=%s*([^%s]+)") if program then return program:lower() end end end -- update htlatex entries with detected program local function update_build_sequence(program, build_seq) -- handle Plain TeX local replaces = change_table[program] or {} local is_xetex = program:match("xe") -- we must handle xetex in tex4ht for pos, entry in ipairs(build_seq) do if entry.name == "htlatex" then -- handle httex entry.command = replaces.command or entry.command local params = entry.params or {} params.htlatex = replaces.htlatex or params.htlatex entry.params = params elseif is_xetex and entry.name == "tex4ht" then -- tex4ht must process .xdv file if the TeX file was compiled by XeTeX entry.params.tex4ht_par = entry.params.tex4ht_par .. " -.xdv" end end end function M.modify_build(make) -- find magic comments in the TeX file local build_seq = make.build_seq local tex_file = make.params.tex_file local program, msg = find_magic_program(tex_file) if program then log:info("Found program name", program) update_build_sequence(program, build_seq) else log:warning("Cannot find magic line with the program name") end return make end return M