Jadi, inilah sesuatu yang saya buat, tapi masih belum sempurna. Ada dua masalah utama:
catdvi
tidak dapat dibuat untuk menggunakan subscript dan superskrip Unicode, alih-alih menempatkan karakter berukuran normal pada baris di bawah dan di atas, yang membuat bit LaTeX inline terlihat buruk. Ada juga masalah terkait seperti rendering \frac{}{}
, \binom{}{}
dan inline serupa, di mana mereka muncul pada baris yang sama dan benar-benar hancur menjadi teks di sekitarnya.
Multiline LaTeX code terasa lebih baik, tetapi kadang-kadang catdvi
menambahkan baris kosong tambahan (sulit untuk mengetahui apakah harus menghapusnya, tapi saya bisa memposting-proses output untuk menghapus baris kosong).
Di bawah ini adalah kode yang saya gunakan dan beberapa contoh yang dihasilkan:
(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)
Perhatikan bahwa Anda juga harus melakukan kompilasi catdvi
dari sumber. Ada juga masalah kecil dengan kompilasi: beberapa file C menggunakan variabel yang ditentukan dalam file header dependen (biasanya diinstal secara terpisah) tanpa a const
, sementara header membutuhkannya menjadi const
(mudah diperbaiki dengan hanya menambahkan bit deklarasi yang diperlukan). texi2dvi
harus tersedia untuk diinstal dari manajer paket.
Alternatif untuk inline LaTeX:
Saya sedang berpikir tentang menggunakan TeX
metode input, yang dapat menggunakan karakter Unicode subscript dan superscript, namun, ini akan membutuhkan parsing dan pra-pemrosesan kode LaTeX untuk TeX
memasukkannya ke metode input.
Alternatif lain adalah mencoba menggunakan parsing AUCTeX untuk mencari tahu subskrip dan superskrip, tetapi keduanya menuntut terlalu banyak upaya ... Lebih mudah saat ini untuk menggunakan catdvi
formula inline dan kemudian memperbaiki subskrip / superskrip dengan tangan.
(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)))
Contoh:
** 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.
Diterjemahkan ke dalam
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.