(require latex-pict) package: latex-pict


;;; TeX Formulas



;; This module contains a few functions that can turn a piece of TeX (string)

;; into a pict that renders the formula.


;; The module relies on  pdflatex to render the formula into a pdf file

;; and Poppler which is a C library, that renders pdf formula into Cairo contexts.

;; Cairo being the underlying graphics libray or racket/draw (and picts).

;; Note that introduces a dependecy on racket-popper.


;; Results are cached to speed things up, when rendering the same document

;; multiple times (caching is based on the entire tex document, so changes

;; in options etc. will trigger a rerendering).


;; TeX and LaTeX has three different rendering modes:


;;     text          for the body text

;;     math          for math formulas inline with text        $ or \( \)

;;     displaymath   for larger math formulass, not inline    $$ or \[ \]




;; Extracting a formula in "math" mode gives a tight bounding box around

;; the formula. The mode "displaymath" on the other hand has large

;; left and right margins. Therefore tex-display-math renders its

;; input as  \( \displaystyle <your-formula> \).

;; In case you really need the real display environment, you can

;; use text-real-display-math, which uses \[ <your-formula> \].


;; The main exports of this library is therefore:


(provide tex-math                ; \(                <formula> \)

         tex-display-math        ; \( \displaystyle  <formula> \)

         tex-real-display-math)  ; \[                <formula> \]


;; You will notice, that there is export that renders plain text,

;; but that is currently not supported by the "preview" package.


;; When a snippet of TeX without any context is rendered, it

;; is first put into a  TeX document, then pdflatex is invoked,

;; size information is extracted from the log file, and then

;; the pdf file is used to produce the pict.


;; It would be great if the user of this library didn't need to know

;; any details, about the TeX document, but TeX can be difficult to

;; work with. Especiallu if one doesn't know which document class

;; and packages that are used.


;; Here is the latex document that pdflatex will render to pdf,

;; when the mode tex-math is used:


;;     \documentclass{standalone}

;;     \usepackage[active,tightpage,lyx,pdftex,<modeoption>]{preview}

;;     \usepackage{amsmath}

;;         <your-preamble>

;;     \begin{document}

;;        \( <your-latex-snippet> \)

;;     \end{document}


;; where <modeoption> is one of "textmath" and "displaymath",

;;       <your-preamble> defaults as "", but you can put \usepackage{a_nice_pkg} here

;;       <your-latex-snippet>  is surrounded


;; First of all the document classes "standalone" and the

;; package "preview" is used. The combination renders the

;; document into a pdf with a minimal margin around the context.


;; The options for preview are:

;;    active    - actually use preview (otherwise preview is ignored)

;;    tightpage - no margins, option is needed to use the pdftex option

;;    pdftex    - assume PDFTeX is the output driver

;;    lyx       - makes pdftex write size information in the log file

;;                (we use it to determine size and placement of baseline)


;; The package "preview" by David Kastrup and the AUCTeX Team is available here:



;; The package "amsmath" by the American Mathematical Society contains

;; most math related commands, that you will neeed. The documentation is here:



;; The document class "standalone" is documented here:




;; The Racket functions tex-math, tex-display-math, and, read-display-math passes

;; the appropriate <modeoption> automatically.


;; The keyword argument #:document-class-options can be used to pass along

;; options (in the form of a list of symbols/strings) to the "standalone"

;; documentclass. Among the interesting options are 10pt, 11pt and 12pt.


;; The option #:preamble allows you to pass along a preamble, where you

;; can declare any packages you need. If you need the same preamble multiple

;; times, you can use the parameter  current-premable.

;; The default preamble is

;;    \usepackage{amsmath}

;; If you set the preamble and still need amsmath, remember to include it

;; in your own preamble.


;; The option #:preview allows you to pass along options in the form

;; of a list of symbols or strings to the "preview" TeX package.

;; If you need the same options multiple times, you can use the

;; parameter  current-preview-options


(provide current-document-class-options current-preamble current-preview-options)


;; Note that it is convenient to se the at-notation from Scribble to call,

;; the text functions:


;;   #lang at-exp racket

;;   (require metapict/tex)

;;   @tex-math{ a^2 + b^2 = c^2 }


;; Or perhaps introduce $ and $$ :


;;   #lang at-exp racket

;;   (require metapict/tex)

;;   (define $  tex-math)

;;   (define $$ tex-display-math)

;;   @${ c = \sqrt{ a^2 + b^2 = c^2} }


;; You can of course also use the functions without the at-notation:

;;   ($ "c = \\sqrt{ a^2 + b^2 = c^2}")

;; Just remember that \ needs to be quoted as \\ in Racket strings.




;;; Configuration



; Preamble, used if the option #:preamble isn't passed.

(define current-preamble  (make-parameter ""))


; Document class options

(define current-document-class-options (make-parameter '()))


; Preview options

(define current-preview-options (make-parameter '()))



; Scale factor applied to the pict before it is rendered.

; The parameter value is used, if the option #:scale isn't used.

(define current-scale-factor (make-parameter 2))