diff --git a/doerg/src/net/deertopia/doerg/tex.clj b/doerg/src/net/deertopia/doerg/tex.clj index b062d72..4d1952d 100644 --- a/doerg/src/net/deertopia/doerg/tex.clj +++ b/doerg/src/net/deertopia/doerg/tex.clj @@ -4,7 +4,8 @@ [clj-cbor.core :as cbor] [clojure.java.io :as io] [clojure.string :as str] - [clojure.tools.logging :as l]) + [clojure.tools.logging :as l] + [babashka.fs :as fs]) (:import (java.io ByteArrayOutputStream))) ;;; XeLaTeX @@ -74,16 +75,46 @@ "--bbox=preview" "-o" "%9p.svg" file)] r)) +(defn- snippet-file-names + "Return a map of TeX snippets (as strings, including the math + delimiters) to file names as would be output by + `invoke-dvisvgm`. The returned file names are relative to dvisvgm's + output directory." + [snippets] + (let [svgs (for [i (range)] + (format "%09d.svg" i))] + (zipmap (reverse snippets) svgs))) + (defn- instantiate-preview-template [snippets] (let [contents (->> (for [s snippets] - (format "\\begin{preview}\n%s\\end{preview}" s)) + (format "\\begin{preview}\n%s\n\\end{preview}" s)) (str/join "\n"))] (-> (io/resource "net/deertopia/doerg/preview-template.tex") slurp (str/replace-first "% {{contents}}" contents)))) -(defn render-xelatex [& snippets] - ) +(defn render-xelatex [output-dir & snippets] + (fs/with-temp-dir [dir {:prefix "doerg-xelatex"}] + (let [preview-tex (fs/file dir "preview.tex") + preview-xdv (fs/file dir "preview.xdv") + snippet->file (-> (snippet-file-names snippets) + (update-keys #(fs/file dir %)))] + (fs/create-dirs output-dir) + (->> (instantiate-preview-template snippets) + (spit preview-tex)) + (invoke-xelatex :output-dir dir :file preview-tex) + (invoke-dvisvgm :output-dir output-dir :file preview-xdv) + snippet->file + #_ + (do (when (fs/exists? "/tmp/doerg-tex-test") ; For debugging + (fs/delete-tree "/tmp/doerg-tex-test")) + (fs/copy-tree dir "/tmp/doerg-tex-test"))))) + +(comment + (render-xelatex "/tmp/doerg-tex-svgs" + "\\(c = \\sqrt{x^2 + y^2}\\)" + "x" "y" "x" + "\\undefinedcommandlol")) ;;; Temml