Quindi, ecco qualcosa che mi è venuto in mente, ma non è ancora perfetto. Esistono due problemi principali:
catdvinon può essere fatto per usare sottoscrizioni e superscript Unicode, invece posiziona caratteri di dimensioni normali sulla riga sotto e sopra, il che rende i bit LaTeX in linea cattivi. Ci sono anche problemi connessi, come il rendering di \frac{}{}, \binom{}{}e in linea simile, dove appaiono sulla stessa linea e completamente disintegrarsi in testo circostante.
Il codice LaTeX multilinea è notevolmente migliore, ma a volte catdviaggiunge ulteriori righe vuote (è difficile sapere se rimuoverle, ma potrei post-elaborare l'output per rimuovere le righe vuote).
Di seguito è riportato il codice che ho usato e alcuni esempi generati:
(defmacro by-backend (&rest body)
`(cl-case (when (boundp 'backend)
(org-export-backend-name backend))
,@body))
(defun my/org-latex-headers ()
(mapcar
(lambda (record) (plist-get (cl-second record) :value))
(cl-remove-if-not
(lambda (record)
(let* ((data (cl-second record))
(key (plist-get data :key)))
(or (string-equal key "LATEX_HEADER")
(string-equal key "LATEX_HEADER_EXTRA"))))
(org-element-map (org-element-parse-buffer) 'keyword 'identity))))
(defun my/org-latex-template-with-header (body)
(org-latex-template
body
`(:title ""
:exported-data ,(make-hash-table)
:language "latex"
:latex-classes ,org-latex-classes
:latex-class "article"
:latex-header ,(mapconcat 'identity (my/org-latex-headers) "\n"))))
(defun my/latex-to-ascii (latex &optional multiline)
(let* ((catdvi-buf (get-buffer-create "*catdvi-buf*"))
(tmpname (make-temp-file "catdvi" nil ".tex"))
(dviname (format "%s.dvi" (file-name-sans-extension tmpname)))
(template (my/org-latex-template-with-header latex)))
(with-current-buffer catdvi-buf (erase-buffer))
(with-temp-file tmpname
(insert template)
tmpname)
(call-process (executable-find "texi2dvi")
nil (get-buffer-create "*texi2dvi-buf*") nil
"-o" dviname tmpname)
(if multiline
(progn
(call-process (executable-find "catdvi") nil (list catdvi-buf nil) nil
"-e" "0" dviname)
(replace-regexp-in-string
;; removes page numbering and page break
"[\f\v\t\n ]*1[\f\n\t \\.]*\\'" ""
(with-current-buffer catdvi-buf (buffer-string))))
(progn
(call-process (executable-find "catdvi") nil (list catdvi-buf nil) nil
"-s" "-e" "0" dviname)
(org-trim
(replace-regexp-in-string
;; removes page numbering and page break
"1[\f\n\t \\.]*\\'" ""
(with-current-buffer catdvi-buf (buffer-string))))))))
(defun my/org-ascii-latex-fragment (orig latex-fragment contents info)
(when (plist-get info :with-latex)
(my/latex-to-ascii
(org-element-property :value latex-fragment))))
(defun my/org-ascii-latex-environment (orig latex-environment contents info)
(message "my/org-ascii-latex-environment")
(when (plist-get info :with-latex)
(org-ascii--justify-element
(my/latex-to-ascii
(org-remove-indentation (org-element-property :value latex-environment)) t)
latex-environment info)))
(advice-add 'org-ascii-latex-fragment :around 'my/org-ascii-latex-fragment)
(advice-add 'org-ascii-latex-environment :around 'my/org-ascii-latex-environment)
Nota che dovrai anche compilare catdvida fonti. C'è anche un piccolo problema con la compilazione: alcuni file C usano una variabile definita in un file di intestazione dipendente (tipicamente installato separatamente) senza un const, mentre l'intestazione deve essere un const(facilmente risolvibile semplicemente aggiungendo il bit di dichiarazione necessario). texi2dvidovrebbe essere disponibile per l'installazione dal gestore pacchetti.
Alternative per LaTeX in linea:
Stavo pensando di utilizzare il TeXmetodo di input, che può utilizzare caratteri Unicode e in apice, tuttavia, ciò richiederebbe l'analisi e la pre-elaborazione del codice LaTeX per poter essere TeXinserito nel metodo di input.
Un'altra alternativa è provare a utilizzare l'analisi AUCTeX per capire gli script e gli apice, ma entrambi richiedono troppo sforzo ... Al momento è più facile da usare catdviper le formule incorporate e poi riparare manualmente gli script / apice.
(defun my/prepare-tex-ime (input)
(cl-loop for paren in '("[]{}") do
(setq input (replace-regexp-in-string
(format "\\\\%s" paren) paren input)))
input)
(defun my/tex-ime-translate (input)
(with-temp-buffer
(set-input-method 'TeX)
(setq quail-current-key "")
(cl-loop for c across input do
(setq last-command-event c)
(call-interactively 'quail-self-insert-command))
(buffer-string)))
Esempi:
** Problem 1
Prove that
#+HEADER: :exports results
#+HEADER: :results (by-backend (pdf "latex") (t "raw"))
#+BEGIN_SRC latex
\begin{align*}
L = \{w \in \{a, b, c, d\}^* \;|\; w=dv, v \in \{a, b, c\}^*,
\#_a(w) \cdot \#_c(w) < \#_b(w) \}
\end{align*}
#+END_SRC
is not regular.
Si traduce in
1.1 Problem 1
─────────────
Prove that
∗ ∗
L = {w ∈ {a,b,c,d} | w = dv,v ∈ {a,b,c} ,# (w)·# (w) < # (w)}
a c b
is not regular.