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:
catdvi
khô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.
Mã LaTeX đa dòng tốt hơn đáng kể, nhưng đôi khi catdvi
thê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 catdvi
từ 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). texi2dvi
nê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 TeX
phươ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ó TeX
và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 catdvi
cá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.