Hi Nasser,

---------------------------
> \documentclass[12pt]{book}
> \usepackage{amsmath}
> \begin{document}
>
> where here $p=-2$ and $q=2$ and $n=\frac{1}{2}$. Starting by dividing by
> $y^{\frac{1}{2}}$ gives%
> \[
> y^{\prime}y^{-\frac{1}{2}}-2y^{\frac{1}{2}}=2
> \]
> \end{document}
> -------------------------------
>

There was a bug in the build file, so the pattern matched "dividing" and
everything that followed. It should be fixed now.

Best,
Michal
local filter = require "make4ht-filter"
local domfilter = require "make4ht-domfilter"

local function process_options(options)
  -- convert [number={foo}] to \tag{foo}
  local number = options:match("number%s*=%s*{?(%w+)")
  if number then
    return "\\tag{" .. number .. "}"
  end
  return ""
end


local function escape_equal(str)
  -- there can be multiple equal characters in the string. we should put the & character
  -- just before the one which is not inside any group
  -- escape nested equal signs
  str = str:gsub("({[^{^}]+)=([^{^}]+})", "%1:EQUAL:%2")
  -- replace remaining =
  str = str:gsub("([^\n]+)", function(line)
    line = line:gsub("=", "&=", 1)
    return line .. "\n"
  end)
  -- str = str:gsub("=", "&=")
  -- return escaped =
  str = str:gsub(":EQUAL:", "=")
  return str
end

local function make_align(dgroup, new_env)
  -- change breqn environment contents to align*
  -- change = to &=
  -- local dgroup = escape_equal(dgroup) -- <- we don't do this anymore, it leads only to problems
  local new_env = new_env or  "\\begin{align*}\n%s\n\\end{align*}"
  -- return the fixed text in align* environment
  -- return "\\begin{".. new_env .."}" ..  dgroup .. "\\end{" .. new_env .. "}"
  return string.format(new_env, dgroup)
end

-- process remaining dmath environments
local function process_dmath(s, env_name, new_env)
  return s:gsub("\\begin%s*{" .. env_name .. "}(.-)\\end%s*{" .. env_name .. "}",
  function(dmath)
    -- options can be still here
    local dmath = dmath:gsub("^%s*(%b[])", process_options)
    return make_align(dmath, new_env)
  end)
end

local function process_dgroup(s, env_name)
  return s:gsub("\\begin%s*{" .. env_name .. "}(.-)\\end%s*{" .. env_name .. "}",
  function(dgroup)
    -- remove environemnts
    dgroup = process_dmath(dgroup, "dmath%*", "\n%s\\\\\n")
    dgroup = process_dmath(dgroup, "dmath", "\n%s\\\\\n")
    local dgroup = escape_equal(dgroup) -- <- we don't do this anymore, it leads only to problems
    return make_align(dgroup)
  end)
end


local function escape_tags(tagname, s)
  local pattern = "(<" .. tagname .. "[^>]+mathjax[^>]+>)(.-)(</" .. tagname .. ">)"
  return s:gsub(pattern, function(tag, text, endtag)
    local text = text:gsub("<", "&lt;"):gsub(">", "&gt;")
    return tag .. text .. endtag
  end)
end


local function escape_mathjax(s)
  local s = escape_tags("span", s)
  return escape_tags("div", s)
end


local process = filter {
  -- find all dgroup* environments and convert them to align*
  function(s)
    local s = process_dgroup(s,"dgroup%*")
    s = process_dgroup(s, "dgroup")
    -- process remaining dmath environments in the document
    s = process_dmath(s, "dmath%*", "\\[\n%s\n\\]")
    s = process_dmath(s, "dmath", "\\begin{equation}\n%s\n \\end{equation}")
    return s
  end,
  escape_mathjax

}
-- install filter to match HTML files
Make:match("html?$", process)

Reply via email to