Formeln im Klartext-Export

8

Ich versuche einen Weg zu finden, ein Org-Dokument mit vielen Formeln im Klartext zu exportieren, aber die Ergebnisse sind bisher nicht großartig.

Was ich versucht habe:

  1. pandoc - hält im Grunde alle Mathematik in LaTeX unverändert, streift nicht einmal die Umgebungsmacher.
  2. detex - ersetzt keine griechischen Symbole (entfernt sie einfach), es gibt Artefakte in den erzeugten Formeln (ein kaufmännisches Und bleibt von der Ausrichtung übrig usw.)
  3. tex2mail - sieht lustig und sehr schwer zu lesen aus, hinterlässt Artefakte, Umgebungsmarkierungen usw.
  4. catdvi - ist das bisher beste, ich brauche es jedoch nur, um auf den LaTeX-Fragmenten in der Org-Datei ausgeführt zu werden, der Rest der Datei sieht sehr schlecht aus (Einrückungen, Titel usw.).
  5. hevea- Mit diesem Programm wird texi2dvieine Textausgabe generiert. Funktioniert nicht wirklich, die Ausgabe sieht sehr seltsam aus / einige griechische Buchstaben werden in Unicode übersetzt, andere nicht, die Ausrichtung ist falsch ...

Ich könnte wahrscheinlich ein spezielles Backend schreiben, um zuerst alle LaTeX-Fragmente nach DVI zu exportieren und dann auf diesen auszuführen catdvi, aber bevor ich dazu komme, gibt es vielleicht einen einfacheren Weg, dies zu tun?

wvxvw
quelle
Wenn wir nur die Datei mit der Vorschau-Mathematik im Organisationsmodus exportieren könnten, würde dies den Job erledigen. Aber ich weiß nicht, ob es einfach ist oder nicht.
DJJ
@DJJ Ich arbeite daran, ASCII-Backend-Funktionen für den Export zu beraten. Ich hoffe, bis zum Abend einige Ergebnisse zu erzielen.
wvxvw
Können Sie klarstellen, was Ihre gewünschte Ausgabe ist? Ich bin mir nicht sicher, wie Sie LaTeX verbessern würden, um Formeln im Klartext darzustellen. Was macht catdvieigentlich?
Tyler
@ Tyler catdvigeneriert Unicode + ASCII-Grafik zur Darstellung von DVI-Grafiken. Dies ist kaum eine Verbesserung gegenüber LaTeX, wird jedoch für Personen benötigt, die LaTeX-Quelle / PDF oder DVI nicht lesen können und in dieser Umgebung nicht verfügbar sind (z. B. bei der Interaktion mit einem Textterminal oder beim Senden von Nur-Text-E-Mails).
wvxvw
@wvxvw Das wäre ein ziemlich interessantes Feature. Möge die Macht mit dir sein.
DJJ

Antworten:

2

Also, hier ist etwas, das ich mir ausgedacht habe, aber es ist immer noch nicht perfekt. Es gibt zwei Hauptprobleme:

  1. catdviEs kann nicht dazu gebracht werden, Unicode-Indizes und hochgestellte Indizes zu verwenden. Stattdessen werden normal große Zeichen in der Zeile darunter und darüber platziert, wodurch Inline-LaTeX-Bits schlecht aussehen. Darüber hinaus gibt es ähnliche Probleme wie die Wiedergabe von \frac{}{}, \binom{}{}und ähnliche inline, wo sie auf der gleichen Zeile erscheinen und vollständig zerfallen in Text umgeben.

  2. Mehrzeiliger LaTeX-Code ist deutlich besser, catdvifügt jedoch manchmal zusätzliche Leerzeilen hinzu (es ist schwer zu wissen, ob diese entfernt werden sollen, aber ich könnte die Ausgabe nachbearbeiten, um Leerzeilen zu entfernen).

Unten ist der Code, den ich verwendet habe, und einige Beispiele, die generiert wurden:

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

Beachten Sie, dass Sie auch catdviaus Quellen kompilieren müssen . Es gibt auch ein kleines Problem beim Kompilieren: Einige C-Dateien verwenden eine Variable, die in einer abhängigen Header-Datei (normalerweise separat installiert) ohne a definiert ist const, während der Header ein a benötigt const(einfach durch Hinzufügen des erforderlichen Deklarationsbits zu beheben). texi2dvisollte für die Installation über den Paketmanager verfügbar sein.


Alternativen für Inline-LaTeX:

Ich habe über die Verwendung einer TeXEingabemethode nachgedacht , die Unicode-tiefgestellte und hochgestellte Zeichen verwenden kann. Dies würde jedoch das Parsen und Vorverarbeiten von LaTeX-Code erfordern, um ihn der TeXEingabemethode zuzuführen.

Eine andere Alternative besteht darin, zu versuchen, mithilfe von AUCTeX-Parsing Indizes und hochgestellte Zeichen zu ermitteln. Beides erfordert jedoch zu viel Aufwand. Es ist derzeit einfacher, catdviInline-Formeln zu verwenden und die tiefgestellten / hochgestellten Zeichen dann manuell zu korrigieren.

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

Beispiele:

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

Übersetzt ins

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.
wvxvw
quelle