Rumus dalam ekspor teks biasa

8

Saya mencoba menemukan cara untuk mengekspor dokumen organisasi dengan banyak formula dalam teks biasa, tetapi hasilnya tidak terlalu bagus sejauh ini.

Apa yang saya coba:

  1. pandoc - pada dasarnya menjaga semua matematika di LaTeX tidak berubah, bahkan tidak menghapus pembuat lingkungan.
  2. detex - tidak menggantikan simbol Yunani (hanya menghapusnya), ada artefak dalam formula yang diproduksi (sa ampersand yang tersisa dari perataan dll)
  3. tex2mail - Terlihat lucu dan sangat sulit dibaca, meninggalkan artefak, penanda lingkungan, dll.
  4. catdvi - adalah yang terbaik sejauh ini, namun, saya hanya perlu menjalankannya pada fragmen LaTeX dalam file Org, sisa file terlihat sangat buruk (indentasi, judul dll).
  5. hevea- program ini digunakan oleh texi2dviuntuk menghasilkan output teks. Tidak benar-benar berfungsi, outputnya terlihat sangat aneh / beberapa huruf Yunani diterjemahkan ke dalam Unicode, yang lainnya tidak, perataannya salah ...

Saya mungkin bisa menulis backend khusus untuk pertama mengekspor semua fragmen LaTeX ke DVI dan kemudian menjalankannya catdvi, tetapi sebelum saya sampai di sana, mungkin ada cara yang lebih sederhana untuk melakukannya?

wvxvw
sumber
Kalau saja kita bisa mengekspor file dengan matematika yang dipratinjau dalam mode org yang akan melakukan pekerjaan. Tetapi saya tidak tahu apakah itu mudah dilakukan atau tidak.
DJJ
@ DJJ Saya sedang bekerja untuk memberi nasihat tentang fungsi-fungsi backend ASCII yang menangani ekspor, saya berharap memiliki beberapa hasil pada malam hari.
wvxvw
Bisakah Anda mengklarifikasi apa yang Anda inginkan? Saya tidak yakin bagaimana Anda akan meningkatkan LaTeX untuk mewakili rumus dalam teks biasa. Apa yang catdvisebenarnya dilakukan?
Tyler
@Tyler catdvimenghasilkan Unicode + ASCII-art untuk mewakili grafik DVI. Ini bukan peningkatan pada LaTeX, tetapi diperlukan bagi orang yang tidak dapat membaca sumber LaTeX / PDF atau DVI tidak tersedia di lingkungan itu (mis. Ketika berinteraksi dengan terminal teks, atau mengirim email hanya teks).
wvxvw
@ wvxvw Itu akan menjadi fitur yang cukup menarik. Semoga kekuatan bersamamu.
DJJ

Jawaban:

2

Jadi, inilah sesuatu yang saya buat, tapi masih belum sempurna. Ada dua masalah utama:

  1. catdvitidak 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.

  2. Multiline LaTeX code terasa lebih baik, tetapi kadang-kadang catdvimenambahkan 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 catdvidari 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). texi2dviharus tersedia untuk diinstal dari manajer paket.


Alternatif untuk inline LaTeX:

Saya sedang berpikir tentang menggunakan TeXmetode input, yang dapat menggunakan karakter Unicode subscript dan superscript, namun, ini akan membutuhkan parsing dan pra-pemrosesan kode LaTeX untuk TeXmemasukkannya 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 catdviformula 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.
wvxvw
sumber