Công thức trong xuất văn bản thuần


8

Tôi đang cố gắng tìm cách xuất tài liệu Org với nhiều công thức bằng văn bản thuần túy, nhưng kết quả cho đến nay vẫn chưa có kết quả tốt.

Những gì tôi đã cố gắng:

  1. pandoc - về cơ bản giữ cho tất cả toán học trong LaTeX không thay đổi, thậm chí không loại bỏ các trình tạo môi trường.
  2. detex - không thay thế các biểu tượng Hy Lạp (chỉ đơn giản là loại bỏ chúng), có các tạo tác trong các công thức được sản xuất (sa ampersands còn lại từ căn chỉnh, v.v.)
  3. tex2mail - trông buồn cười và rất khó đọc, để lại đồ tạo tác, đánh dấu môi trường, v.v.
  4. catdvi - là tốt nhất cho đến nay, tuy nhiên, tôi chỉ cần nó chạy trên các đoạn LaTeX trong tệp Org, phần còn lại của tệp trông rất tệ (thụt lề, tiêu đề, v.v.).
  5. hevea- chương trình này được sử dụng texi2dviđể tạo đầu ra văn bản. Không thực sự hoạt động, đầu ra trông rất lạ / một số chữ cái Hy Lạp được dịch sang Unicode, một số khác thì không, căn chỉnh đều sai ...

Tôi có thể có thể viết một phần phụ trợ đặc biệt để trước tiên xuất tất cả các đoạn LaTeX sang DVI và sau đó chạy catdvitrên các đoạn đó, nhưng trước khi tôi nhận được nó, có lẽ có cách nào đơn giản hơn để làm điều đó?


Nếu chỉ chúng ta có thể xuất tệp với toán học được xem trước ở chế độ org sẽ thực hiện công việc. Nhưng tôi không biết có dễ làm hay không.
DJJ

@DJJ Tôi đang làm việc để tư vấn các chức năng phụ trợ ASCII xử lý việc xuất, tôi hy vọng sẽ có một số kết quả vào buổi tối.
wvxvw

Bạn có thể làm rõ đầu ra mong muốn của bạn là gì? Tôi không chắc bạn sẽ cải thiện LaTeX như thế nào để thể hiện các công thức trong văn bản thuần túy. Những gì catdvithực sự làm?
Tyler

@Tyler catdvitạo ra Unicode + ASCII-art để thể hiện đồ họa DVI. Đây không phải là một cải tiến trên LaTeX, nhưng nó là cần thiết cho những người không thể đọc nguồn LaTeX / PDF hoặc DVI không có sẵn trong môi trường đó (ví dụ: khi tương tác với thiết bị đầu cuối văn bản hoặc gửi email chỉ có văn bản).
wvxvw

@wvxvw Đó sẽ là một tính năng khá thú vị. Mạnh mẽ lên.
DJJ

Câu trả lời:


2

Vì vậy, đây là thứ tôi nghĩ ra, nhưng nó vẫn chưa hoàn hảo. Có hai vấn đề chính:

  1. catdvikhông thể được thực hiện để sử dụng các đăng ký và siêu ký tự Unicode, thay vào đó, nó đặt các ký tự có kích thước bình thường trên dòng bên dưới và bên trên, điều này làm cho các bit LaTeX nội tuyến trông xấu. Ngoài ra còn có các vấn đề liên quan như việc vẽ của \frac{}{}, \binom{}{}và nội tuyến tương tự, nơi họ xuất hiện trên cùng một dòng và hoàn toàn tan rã thành xung quanh văn bản.

  2. Mã LaTeX đa dòng tốt hơn đáng kể, nhưng đôi khi catdvithêm các dòng trống bổ sung (thật khó để biết có nên loại bỏ chúng hay không, nhưng tôi có thể xử lý hậu kỳ để loại bỏ các dòng trống).

Dưới đây là mã tôi đã sử dụng và một số ví dụ được tạo:

(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)

Lưu ý rằng bạn cũng sẽ cần phải biên dịch catdvitừ các nguồn. Ngoài ra còn có một vấn đề nhỏ khi biên dịch nó: một số tệp C sử dụng một biến được xác định trong tệp tiêu đề phụ thuộc (thường được cài đặt riêng) mà không có const, trong khi tiêu đề cần phải là một const(dễ dàng sửa chữa bằng cách chỉ cần thêm bit khai báo cần thiết). texi2dvinên có sẵn để cài đặt từ trình quản lý gói.


Các lựa chọn thay thế cho LaTeX nội tuyến:

Tôi đã suy nghĩ về việc sử dụng TeXphương thức nhập liệu, có thể sử dụng các ký tự phụ và ký tự Unicode, tuy nhiên, điều này sẽ yêu cầu phân tích và xử lý trước mã LaTeX để đưa nó TeXvào phương thức nhập.

Một cách khác là cố gắng sử dụng phân tích cú pháp AocateeX để tìm ra các chỉ số và siêu ký tự, nhưng cả hai đều đòi hỏi quá nhiều nỗ lực ... Hiện tại, việc sử dụng catdvicác công thức nội tuyến trở nên dễ dàng hơn và sau đó sửa chữa các chỉ mục / siêu ký tự bằng tay.

(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)))

Ví dụ:

** 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.

Dịch sang

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.