プレーンテキストエクスポートの数式


8

プレーンテキストで多くの数式を含むOrgドキュメントをエクスポートする方法を見つけようとしていますが、これまでのところ素晴らしい結果は得られません。

私が試したこと:

  1. pandoc -基本的に、LaTeXのすべての数学を変更せずに維持し、環境マクロを取り除きません。
  2. detex -ギリシャ語の記号を置き換えません(単に削除します)。生成された式にアーティファクトがあります(配置から残っているアンパサンドなど)。
  3. tex2mail -見た目がおかしくて非常に見づらく、加工品や環境マーカーなどが残ります。
  4. catdvi -これまでのところ最高ですが、OrgファイルのLaTeXフラグメントで実行するために必要なだけであり、ファイルの残りの部分は非常に悪いように見えます(インデント、タイトルなど)。
  5. hevea-このプログラムは、texi2dviテキスト出力を生成するためにによって使用されます。実際には機能しません、出力は非常に奇妙に見えます/ギリシャ語の文字の一部はUnicodeに翻訳されますが、それ以外は翻訳されず、配置がすべて間違っています...

おそらくすべてのLaTeXフラグメントを最初にDVIにエクスポートしてcatdviからそれらを実行する特別なバックエンドを作成できますが、それに到達する前に、もっと簡単な方法があるのでしょうか?


プレビューされた数学を含むファイルを組織モードでエクスポートできれば、それでうまくいきます。しかし、それが簡単かどうかはわかりません。
DJJ 2015年

@DJJエクスポートを処理するASCIIバックエンド関数のアドバイスに取り組んでいます。夕方までに結果が出ることを願っています。
wvxvw 2015年

目的の出力を明確にできますか?LaTeXを改良してプレーンテキストで数式を表現する方法がわかりません。catdvi実際には何をしますか?
タイラー

@Tyler catdviは、DVIグラフィックを表すUnicode + ASCII-artを生成します。これはほとんどLaTeXの改善ではありませんが、LaTeXソースを読むことができない人/ PDFまたはDVIがその環境で利用できない場合(たとえば、テキスト端末とのやり取りや、テキストのみの電子メールの送信など)には必要です。
wvxvw 2015年

@wvxvwそれはかなり興味深い機能でしょう。力があなたと共にありますように。
DJJ 2015年

回答:


2

だから、ここに私が思いついたことがありますが、それでもまだ完璧ではありません。主な問題は2つあります。

  1. catdviUnicode下付き文字と上付き文字を使用することはできません。代わりに、通常のサイズの文字が上下の行に配置されるため、インラインのLaTeXビットは見栄えが悪くなります。などのレンダリングなどの関連の問題もあり\frac{}{}\binom{}{}それらが同じ行に表示され、テキストを囲むに完全に崩壊し、同様のインラインは、。

  2. 複数行の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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.