Also, hier ist etwas, das ich mir ausgedacht habe, aber es ist immer noch nicht perfekt. Es gibt zwei Hauptprobleme:
catdvi
Es kann nicht dazu gebracht werden, Unicode-Indizes und hochgestellte Indizes zu verwenden. Stattdessen werden normal große Zeichen in der Zeile darunter und darüber platziert, wodurch Inline-LaTeX-Bits schlecht aussehen. Darüber hinaus gibt es ähnliche Probleme wie die Wiedergabe von \frac{}{}
, \binom{}{}
und ähnliche inline, wo sie auf der gleichen Zeile erscheinen und vollständig zerfallen in Text umgeben.
Mehrzeiliger LaTeX-Code ist deutlich besser, catdvi
fügt jedoch manchmal zusätzliche Leerzeilen hinzu (es ist schwer zu wissen, ob diese entfernt werden sollen, aber ich könnte die Ausgabe nachbearbeiten, um Leerzeilen zu entfernen).
Unten ist der Code, den ich verwendet habe, und einige Beispiele, die generiert wurden:
(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)
Beachten Sie, dass Sie auch catdvi
aus Quellen kompilieren müssen . Es gibt auch ein kleines Problem beim Kompilieren: Einige C-Dateien verwenden eine Variable, die in einer abhängigen Header-Datei (normalerweise separat installiert) ohne a definiert ist const
, während der Header ein a benötigt const
(einfach durch Hinzufügen des erforderlichen Deklarationsbits zu beheben). texi2dvi
sollte für die Installation über den Paketmanager verfügbar sein.
Alternativen für Inline-LaTeX:
Ich habe über die Verwendung einer TeX
Eingabemethode nachgedacht , die Unicode-tiefgestellte und hochgestellte Zeichen verwenden kann. Dies würde jedoch das Parsen und Vorverarbeiten von LaTeX-Code erfordern, um ihn der TeX
Eingabemethode zuzuführen.
Eine andere Alternative besteht darin, zu versuchen, mithilfe von AUCTeX-Parsing Indizes und hochgestellte Zeichen zu ermitteln. Beides erfordert jedoch zu viel Aufwand. Es ist derzeit einfacher, catdvi
Inline-Formeln zu verwenden und die tiefgestellten / hochgestellten Zeichen dann manuell zu korrigieren.
(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)))
Beispiele:
** 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.
Übersetzt ins
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.