だから、ここに私が思いついたことがありますが、それでもまだ完璧ではありません。主な問題は2つあります。
catdvi
Unicode下付き文字と上付き文字を使用することはできません。代わりに、通常のサイズの文字が上下の行に配置されるため、インラインのLaTeXビットは見栄えが悪くなります。などのレンダリングなどの関連の問題もあり\frac{}{}
、\binom{}{}
それらが同じ行に表示され、テキストを囲むに完全に崩壊し、同様のインラインは、。
複数行のLaTeXコードは著しく優れていますが、catdvi
余分な空白行が追加される場合があります(それらを削除するかどうかはわかりませんが、出力を後処理して空白行を削除できます)。
以下は私が使用したコードと生成されたいくつかの例です:
(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)
catdvi
ソースからコンパイルする必要があることにも注意してください。それをコンパイルするとマイナーの問題もある。いくつかのCファイルにはせずに(典型的には別々にインストールされる)に依存するヘッダファイルに定義された変数を使用してconst
ヘッダをすることを必要としながら、const
(容易にだけ必要宣言ビットを追加することによって固定します)。 texi2dvi
パッケージマネージャーからインストールできるようにする必要があります。
インラインLaTeXの代替:
TeX
ユニコードの下付き文字と上付き文字を使用できるインプットメソッドの使用を考えていましたが、インプットメソッドにフィードするには、LaTeXコードの解析と前処理が必要になりTeX
ます。
もう1つの代替方法は、AUCTeX解析を使用して下付き文字と上付き文字を理解しようとすることですが、どちらも手間がかかりすぎます...現時点ではcatdvi
、インライン数式に使用し、下付き文字/上付き文字を手動で修正する方が簡単です。
(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)))
例:
** 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.
に翻訳する
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.