From 57a91f3b6add303ef70aa29a14a8c67123ec7c0f Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Thu, 15 Jul 2010 19:01:00 -0700 Subject: [PATCH] Added --webtex option for HTML math. + Added --webtex command-line option, with optional parameter. (Defaults to using google charts API.) + Added WebTeX HTMLMathMethod. + Removed MimeTeX HTMLMathMethod. (WebTeX is generic and subsumes it.) + Modified --mimetex option to use WebTeX. + Thanks to lpeterse for the idea and some of the code. --- README | 30 ++++++++++++++++++------- man/man1/pandoc.1.md | 5 +++++ src/Text/Pandoc/Shared.hs | 2 +- src/Text/Pandoc/Writers/HTML.hs | 39 +++++++++++++++++++-------------- src/pandoc.hs | 18 ++++++++++++--- tests/writer.html | 6 +++-- 6 files changed, 70 insertions(+), 30 deletions(-) diff --git a/README b/README index 33af139a4..6c3a61ca5 100644 --- a/README +++ b/README @@ -351,8 +351,8 @@ For further documentation, see the `pandoc(1)` man page. directly; this provides portability at the price of efficiency. If you plan to use math on several pages, it is much better to link to a copy of `LaTeXMathML.js`, which can be cached. (See `--jsmath`, - `--gladtex`, and `--mimetex` for alternative ways of dealing with - math in HTML.) + `--gladtex`, `--webtex`, and `--mimetex` for alternative ways of + dealing with math in HTML.) `--mathml` : causes `pandoc` to convert all TeX math to MathML. @@ -364,21 +364,29 @@ For further documentation, see the `pandoc(1)` man page. TeX math in HTML, Slidy, or S5. The *url* should point to the jsMath load script (e.g. `jsMath/easy/load.js`). If it is provided, a link to it will be included in the header of standalone HTML documents. - (See `--latexmathml`, `--mimetex`, and `--gladtex` for alternative - ways of dealing with math in HTML.) + (See `--latexmathml`, `--mimetex`, `--webtex`, and `--gladtex` for + alternative ways of dealing with math in HTML.) `--gladtex`*[=url]* : causes TeX formulas to be enclosed in `` tags in HTML, Slidy, or S5 output. This output can then be processed by [gladTeX] to produce links to images with the typeset formulas. (See `--latexmathml`, - `--jsmath`, and `--mimetex` for alternative ways of dealing with - math in HTML.) + `--jsmath`, `--webtex`, and `--mimetex` for alternative ways of + dealing with math in HTML.) `--mimetex`*[=url]* : causes TeX formulas to be replaced by `` tags linking to the [mimeTeX] CGI script, which will produce images with the typeset - formulas. (See `--latexmathml`, `--jsmath`, and `--gladtex` for alternative - ways of dealing with math in HTML.) + formulas. (See `--latexmathml`, `--jsmath`, `--webtex`, and + `--gladtex` for alternative ways of dealing with math in HTML.) + +`--webtex`*[=url]* +: causes TeX formulas to be replaced by `` tags linking to an + external service that converts TeX formulas to images. The formula + will be concatenated with the URL provided. If no URL + is specified, the Google Chart API is used. (See `--latexmathml`, + `--jsmath`, `--mimetex`, and `--gladtex` for alternative ways of + dealing with math in HTML.) `-i` or `--incremental` : causes all lists in Slidy or S5 output to be displayed incrementally by @@ -1241,6 +1249,12 @@ command-line options selected: gladtex -d myfile-images myfile.htex # produces myfile.html and images in myfile-images +6. If the `--webtex` option is used, TeX formulas will be converted + to `` tags that link to an external script that converts + formulas to images. The formula will be URL-encoded and concatenated + with the URL provided. If no URL is specified, the Google Chart + API will be used (`http://chart.apis.google.com/chart?cht=tx&chl=`). + Inline TeX ---------- diff --git a/man/man1/pandoc.1.md b/man/man1/pandoc.1.md index c829aacae..e1cf67847 100644 --- a/man/man1/pandoc.1.md +++ b/man/man1/pandoc.1.md @@ -136,6 +136,11 @@ should pipe input and output through `iconv`: : Render TeX math using the mimeTeX CGI script. If *URL* is not specified, it is assumed that the script is at `/cgi-bin/mimetex.cgi`. +\--webtex=*URL* +: Render TeX math using an external script. The formula will be + concatenated with the URL provided. If *URL* is not specified, the + Google Chart API will be used. + -i, \--incremental : Make list items in Slidy or S5 display incrementally (one by one). diff --git a/src/Text/Pandoc/Shared.hs b/src/Text/Pandoc/Shared.hs index ac1cf7373..b8eb14177 100644 --- a/src/Text/Pandoc/Shared.hs +++ b/src/Text/Pandoc/Shared.hs @@ -457,7 +457,7 @@ data HTMLMathMethod = PlainMath | LaTeXMathML (Maybe String) -- url of LaTeXMathML.js | JsMath (Maybe String) -- url of jsMath load script | GladTeX - | MimeTeX String -- url of mimetex.cgi + | WebTeX String -- url of TeX->image script. | MathML (Maybe String) -- url of MathMLinHTML.js deriving (Show, Read, Eq) diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs index 3f9a417d2..20022e182 100644 --- a/src/Text/Pandoc/Writers/HTML.hs +++ b/src/Text/Pandoc/Writers/HTML.hs @@ -36,6 +36,7 @@ import Text.Pandoc.Templates import Text.Pandoc.Readers.TeXMath import Text.Pandoc.Highlighting ( highlightHtml ) import Text.Pandoc.XML (stripTags, escapeStringForXML) +import Network.HTTP ( urlEncode ) import Numeric ( showHex ) import Data.Char ( ord, toLower ) import Data.List ( isPrefixOf, intersperse ) @@ -462,16 +463,20 @@ inlineToHtml opts inline = -- non-math elements on the page from being treated as math by -- the javascript return $ thespan ! [theclass "LaTeX"] $ - if t == InlineMath - then primHtml ("$" ++ str ++ "$") - else primHtml ("$$" ++ str ++ "$$") - JsMath _ -> - return $ if t == InlineMath - then thespan ! [theclass "math"] $ primHtml str - else thediv ! [theclass "math"] $ primHtml str - MimeTeX url -> - return $ image ! [src (url ++ "?" ++ str), - alt str, title str] + case t of + InlineMath -> primHtml ("$" ++ str ++ "$") + DisplayMath -> primHtml ("$$" ++ str ++ "$$") + JsMath _ -> do + let m = primHtml str + return $ case t of + InlineMath -> thespan ! [theclass "math"] $ m + DisplayMath -> thediv ! [theclass "math"] $ m + WebTeX url -> do + let m = image ! [src (url ++ urlEncode str), + alt str, title str] + return $ case t of + InlineMath -> m + DisplayMath -> br +++ m +++ br GladTeX -> return $ primHtml $ "" ++ str ++ "" MathML _ -> do @@ -484,12 +489,14 @@ inlineToHtml opts inline = Right r -> return $ primHtml $ ppcElement conf r Left _ -> inlineListToHtml opts - (readTeXMath str) >>= - return . (thespan ! - [theclass "math"]) - PlainMath -> - inlineListToHtml opts (readTeXMath str) >>= - return . (thespan ! [theclass "math"]) ) + (readTeXMath str) >>= return . + (thespan ! [theclass "math"]) + PlainMath -> do + x <- inlineListToHtml opts (readTeXMath str) + let m = thespan ! [theclass "math"] $ x + return $ case t of + InlineMath -> m + DisplayMath -> br +++ m +++ br ) (TeX str) -> case writerHTMLMathMethod opts of LaTeXMathML _ -> do modify (\st -> st {stMath = True}) return $ primHtml str diff --git a/src/pandoc.hs b/src/pandoc.hs index 38db4c6df..9546d6026 100644 --- a/src/pandoc.hs +++ b/src/pandoc.hs @@ -40,7 +40,6 @@ import System.Environment ( getArgs, getProgName, getEnvironment ) import System.Exit ( exitWith, ExitCode (..) ) import System.FilePath import System.Console.GetOpt -import Data.Maybe ( fromMaybe ) import Data.Char ( toLower, isDigit ) import Data.List ( intercalate, isSuffixOf ) import System.Directory ( getAppUserDataDirectory ) @@ -282,11 +281,24 @@ options = , Option "" ["mimetex"] (OptArg - (\arg opt -> return opt { optHTMLMathMethod = MimeTeX - (fromMaybe "/cgi-bin/mimetex.cgi" arg)}) + (\arg opt -> do + let url = case arg of + Just u -> u ++ "?" + Nothing -> "/cgi-bin/mimetex.cgi?" + return opt { optHTMLMathMethod = WebTeX url }) "URL") "" -- "Use mimetex for HTML math" + , Option "" ["webtex"] + (OptArg + (\arg opt -> do + let url = case arg of + Just u -> u + Nothing -> "http://chart.apis.google.com/chart?cht=tx&chl=" + return opt { optHTMLMathMethod = WebTeX url }) + "URL") + "" -- "Use web service for HTML math" + , Option "" ["jsmath"] (OptArg (\arg opt -> return opt { optHTMLMathMethod = JsMath arg}) diff --git a/tests/writer.html b/tests/writer.html index b8296a536..adf0bb9ca 100644 --- a/tests/writer.html +++ b/tests/writer.html @@ -855,9 +855,11 @@ Blah >-Tree
  • Here’s some display math: Here’s some display math:
    $\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$

  • Here’s one that has a line break in it: α + ω ×