Formule nell'esportazione di testo normale


8

Sto cercando di trovare un modo per esportare un documento Org con molte formule in testo semplice, ma i risultati non sono ancora grandi.

Cosa ho provato:

  1. pandoc - fondamentalmente mantiene invariata tutta la matematica in LaTeX, non toglie nemmeno i makrers all'ambiente.
  2. detex - non sostituisce i simboli greci (semplicemente li rimuove), ci sono manufatti nelle formule prodotte (sa e commerciali rimaste dall'allineamento ecc.)
  3. tex2mail - sembra divertente e molto difficile da leggere, lascia artefatti, indicatori ambientali ecc.
  4. catdvi - è il migliore finora, tuttavia, ho solo bisogno che venga eseguito sui frammenti LaTeX nel file Org, il resto del file sembra molto male (rientri, titoli ecc.).
  5. hevea- questo programma viene utilizzato da texi2dviper generare output di testo. Non funziona davvero, l'output sembra molto strano / alcune lettere greche sono tradotte in Unicode, altre no, l'allineamento è tutto sbagliato ...

Probabilmente potrei scrivere un backend speciale per esportare prima tutti i frammenti di LaTeX su DVI e poi eseguirli catdvi, ma prima di arrivarci, forse c'è un modo più semplice per farlo?


Se solo potessimo esportare il file con la matematica in anteprima in modalità org che farebbe il lavoro. Ma non so se sia facile da fare o no.
DJJ,

@DJJ Sto lavorando per consigliare le funzioni di backend ASCII che gestiscono l'esportazione, spero di avere dei risultati entro la sera.
wvxvw,

Puoi chiarire qual è l'output desiderato? Non sono sicuro di come migliorerai su LaTeX per rappresentare le formule in testo semplice. Cosa fa catdvieffettivamente?
Tyler,

@Tyler catdvigenera Unicode + ASCII-art per rappresentare la grafica DVI. Questo non è certo un miglioramento su LaTeX, ma è necessario per le persone che non riescono a leggere l'origine LaTeX / PDF o DVI non sono disponibili in quell'ambiente (ad es. Quando interagiscono con un terminale di testo o inviano e-mail di solo testo).
wvxvw,

@wvxvw Sarebbe una caratteristica piuttosto interessante. Che la forza sia con te.
DJJ,

Risposte:


2

Quindi, ecco qualcosa che mi è venuto in mente, ma non è ancora perfetto. Esistono due problemi principali:

  1. catdvinon può essere fatto per usare sottoscrizioni e superscript Unicode, invece posiziona caratteri di dimensioni normali sulla riga sotto e sopra, il che rende i bit LaTeX in linea cattivi. Ci sono anche problemi connessi, come il rendering di \frac{}{}, \binom{}{}e in linea simile, dove appaiono sulla stessa linea e completamente disintegrarsi in testo circostante.

  2. Il codice LaTeX multilinea è notevolmente migliore, ma a volte catdviaggiunge ulteriori righe vuote (è difficile sapere se rimuoverle, ma potrei post-elaborare l'output per rimuovere le righe vuote).

Di seguito è riportato il codice che ho usato e alcuni esempi generati:

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

Nota che dovrai anche compilare catdvida fonti. C'è anche un piccolo problema con la compilazione: alcuni file C usano una variabile definita in un file di intestazione dipendente (tipicamente installato separatamente) senza un const, mentre l'intestazione deve essere un const(facilmente risolvibile semplicemente aggiungendo il bit di dichiarazione necessario). texi2dvidovrebbe essere disponibile per l'installazione dal gestore pacchetti.


Alternative per LaTeX in linea:

Stavo pensando di utilizzare il TeXmetodo di input, che può utilizzare caratteri Unicode e in apice, tuttavia, ciò richiederebbe l'analisi e la pre-elaborazione del codice LaTeX per poter essere TeXinserito nel metodo di input.

Un'altra alternativa è provare a utilizzare l'analisi AUCTeX per capire gli script e gli apice, ma entrambi richiedono troppo sforzo ... Al momento è più facile da usare catdviper le formule incorporate e poi riparare manualmente gli script / apice.

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

Esempi:

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

Si traduce in

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.