Formatieren Sie ein HTML-Papier im Org-Modus

11

Der Standardmodus im Org-Modus beim HTML-Export besteht darin, den Autor in das Postamble am unteren Rand der Seite einzufügen.

Aber ich möchte ein papierähnliches Dokument mit dem Autor zwischen dem Titel und dem Abstract exportieren. Ist es irgendwie möglich, den Autor nach dem Titel zu platzieren?

Und ist es möglich, das Abstract als Abstract zu bezeichnen? Ich habe die Begrenzer verwendet

#+BEGIN_abstract
...
#+END_abstract

um den Text als abstact zu markieren, aber er wird nur als normaler Absatz wiedergegeben (kein Blockzitat wie Einzug). Ist es möglich, den richtigen Einzug für das Abstract und ein lokalisiertes Label zu erhalten?

ceving
quelle
2
Verwenden Sie für die abstrakten Anforderungen CSS. ...wird verpackt als <div class="abstract"><p>...</p></div>. Um einen LaTeX-ähnlichen Titel zu haben, sollten Sie möglicherweise einen Fehlerbericht ausfüllen. Verwenden Sie vorerst das Makro {{{AUTHOR}}}und die Snippets @@html:whatever@@, um das zu erstellen, was Sie möchten.
Rasmus

Antworten:

10

Vielleicht so etwas (getestet mit LaTeX und HTML)

#+TITLE: An Orged Paper
#+AUTHOR: Rasmus
#+DATE: A Dark Day for Science 

#+RESULTS: html-header

#+begin_abstract
#+begin_center
{{{html-only(*Abstract*)}}}
#+end_center
my long abstract that is longer than one line. my long abstract that is longer than one line.
#+end_abstract
#+toc: headlines
* Introduction
Please read my paper!
* Data
~{0,1}~
* Conclusion
Something deep and profound

{{{html-only(------------)}}}
* styles                                                           :noexport:
#+HTML_HEAD_EXTRA: <style type="text/css">
#+HTML_HEAD_EXTRA: <!--
#+HTML_HEAD_EXTRA:   .header_title {font-size: 2em; font-weight: bold;}
#+HTML_HEAD_EXTRA:   .header_author {font-size: 1.5em; font-weight: bold;text-align:center;}
#+HTML_HEAD_EXTRA:   .header_date {text-align:center;}
#+HTML_HEAD_EXTRA:   .header_date .timestamp {font-size:1em; color:#000000;}
#+HTML_HEAD_EXTRA:   .abstract {max-width: 30em; margin-left: auto; margin-right: auto;}
#+HTML_HEAD_EXTRA: -->
#+HTML_HEAD_EXTRA: </style>

#+OPTIONS: toc:nil

#+MACRO: html-only (eval (if (org-export-derived-backend-p org-export-current-backend 'html) "$1" ""))

#+NAME: html-header
#+BEGIN_SRC emacs-lisp :results raw :exports (if (org-export-derived-backend-p org-export-current-backend 'html) "results" "none")
  "#+begin_header
  ,#+begin_header_author
  {{{AUTHOR}}}
  ,#+end_header_author
  ,#+begin_header_date
  {{{DATE}}}
  ,#+end_header_date
  ,#+end_header
"
#+END_SRC

Beachten Sie, dass das html-headerauch über generiert werden könnte org-html-preamble. Beachten Sie auch, dass from org 8.3 org-latex-title-commandverwendet werden kann, um den Titel als Formatzeichenfolge anzupassen.

Rasmus
quelle
2

Schauen Sie sich den Quellcode an, es scheint, dass dies keine Option ist.

Ich bin mir nicht sicher, was Sie wirklich wollen. Geben Sie einfach zwei Möglichkeiten an:

  1. Fügen #+BEGIN_HTML ... #+END_HTMLSie einfach einen Block hinzu, um zu schreiben, was Sie wollen. (Der darin geschriebene Inhalt wird vollständig als HTML behandelt.) Möglicherweise müssen Sie jedoch hinzufügen #+OPTIONS: toc: nil, um das Inhaltsverzeichnis zu deaktivieren, oder der Autor wird unter Inhaltsverzeichnis platziert.

  2. Definieren Sie die Exportfunktion neu und tun Sie, was Sie wollen (Hinweiszeile 50 ~ 52). (require 'ox-html)Fügen Sie einfach den folgenden Code in Ihre Konfigurationsdatei ein:

      (defun org-html-template (contents info)
        "Return complete document string after HTML conversion.
      CONTENTS is the transcoded contents string.  INFO is a plist
      holding export options."
        (concat
         (when (and (not (org-html-html5-p info)) (org-html-xhtml-p info))
           (let ((decl (or (and (stringp org-html-xml-declaration)
                  org-html-xml-declaration)
                 (cdr (assoc (plist-get info :html-extension)
                     org-html-xml-declaration))
                 (cdr (assoc "html" org-html-xml-declaration))
    
                 "")))
             (when (not (or (eq nil decl) (string= "" decl)))
         (format "%s\n"
             (format decl
                 (or (and org-html-coding-system
                      (fboundp 'coding-system-get)
                      (coding-system-get org-html-coding-system 'mime-charset))
                     "iso-8859-1"))))))
         (org-html-doctype info)
         "\n"
         (concat "<html"
           (when (org-html-xhtml-p info)
             (format
              " xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"%s\" xml:lang=\"%s\""
              (plist-get info :language) (plist-get info :language)))
           ">\n")
         "<head>\n"
         (org-html--build-meta-info info)
         (org-html--build-head info)
         (org-html--build-mathjax-config info)
         "</head>\n"
         "<body>\n"
         (let ((link-up (org-trim (plist-get info :html-link-up)))
         (link-home (org-trim (plist-get info :html-link-home))))
           (unless (and (string= link-up "") (string= link-home ""))
             (format org-html-home/up-format
               (or link-up link-home)
               (or link-home link-up))))
         ;; Preamble.
         (org-html--build-pre/postamble 'preamble info)
         ;; Document contents.
         (format "<%s id=\"%s\">\n"
           (nth 1 (assq 'content org-html-divs))
           (nth 2 (assq 'content org-html-divs)))
         ;; Document title.
         (let ((title (plist-get info :title)))
           (format "<h1 class=\"title\">%s</h1>\n" (org-export-data (or title "") info)))
         ;; Author
         (let ((author (plist-get info :author)))
           (format "<h2 class=\"author\">%s</h2>\n" (org-export-data (or author "") info)))
         contents
         (format "</%s>\n"
           (nth 1 (assq 'content org-html-divs)))
         ;; Postamble.
         (org-html--build-pre/postamble 'postamble info)
         ;; Closing document.
         "</body>\n</html>"))        
    
kuanyui
quelle
3
Dies ist absolut der falsche Weg dazu !! Vorzugsweise müssen Sie eine abgeleitete org-export-define-derived-backendVorlage erstellen, die neue Vorlage anzeigen und der hinzufügen :translate-alist. Für konkrete Beispiele überprüfen Sie ox-beamer.el, ox-koma-script.elund z ox-s5.el.
Rasmus
1

Das schwierigste Problem, auf das ich gestoßen bin, ist das bedingte Styling verschiedener Abschnitte und die bedingte Nummerierung verschiedener Abschnitte. Dies ist eine Lösung für beide Probleme.

Hier ist mein Papier:

#+TITLE: Complex Tracking of Awesome Things
#+AUTHOR: Bastibe
#+INCLUDE: style.org

* Abstract
:PROPERTIES:
:NUMBERS: no
:HTML_CONTAINER_CLASS: abstract
:END:

Lorem ipsum dolor sit amet...

* Introduction
:PROPERTIES:
:NUMBERS: no
:END:

* Methodology

* Results

* Conclusion

* Acknowledgements
:PROPERTIES:
:NUMBERS:  no
:END:

Zunächst enthält dies eine Organisationsdatei mit einigen zusätzlichen Optionen. Diese style.orgoben genannte Datei legt den HTML-Export zum Laden eines benutzerdefinierten Stylesheets fest und legt einige LaTeX-Optionen fest. Wenn Sie nicht nach LaTeX exportieren, benötigen Sie diese nicht.

#+LANGUAGE: en
#+OPTIONS: tags:nil html-postamble:nil # toc:nil
#+STARTUP: nofold hideblocks
#+BIND: org-latex-title-command ""

#+HTML_MATHJAX: path:"MathJax/MathJax.js"
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="style.css" />

#+LATEX_CLASS: article
#+LATEX_CLASS_OPTIONS: [a4paper, 12pt]
#+LATEX_HEADER: \usepackage{setspace}
#+LATEX_HEADER: \onehalfspacing
#+LATEX_HEADER: \usepackage{fontspec}
#+LATEX_HEADER: \setmainfont{Cambria}
#+LATEX_HEADER: \setmonofont{PragmataPro}
#+LATEX_HEADER: \usepackage{polyglossia}
#+LATEX_HEADER: \setdefaultlanguage{english}
#+LATEX_HEADER: \usepackage[a4paper, scale=0.8]{geometry}
#+LATEX_HEADER: \usepackage{amsmath}
#+LATEX_HEADER: \usepackage{units}
#+LATEX_HEADER: \usepackage{titling}
#+LATEX_HEADER: \usepackage{listings}
#+LATEX_HEADER: \lstset{basicstyle=\ttfamily\footnotesize,showstringspaces=false}
#+LATEX_HEADER: \usepackage[hang]{caption}

Um dies als papierähnliches HTML zu rendern, reicht ein wenig CSS aus (gespeichert in style.css:

#content {
    max-width: 80ex;
    position: relative;
    margin: 5px auto;
    font-family: Cambria;
    text-align: justify;
    -moz-hyphens: auto;
}

.abstract {
    max-width: 65ex;
    margin: 5px auto;
    margin-top: 4em;
    margin-bottom: 4em;
    content: none;
}

p {
    text-indent: 5ex;
    margin-bottom: 0;
    margin-top: 0;
}

Die Abschnittsnummern sind jedoch falsch. Der Org-Modus kann entweder alle oder keine Abschnitte nummerieren. Papiere benötigen normalerweise Zahlen in den Körperteilen, nicht jedoch die Zusammenfassung und die Zusammenfassung. Mit dem folgenden Code setzt Org Zahlen vor reguläre Abschnitte, unterdrückt jedoch die Zahlen, wenn die Eigenschaft festgelegt :NUMBERS: noist:

(defun headline-numbering-filter (data backend info)
  "No numbering in headlines that have a property :numbers: no"
  (let* ((beg (next-property-change 0 data))
         (headline (if beg (get-text-property beg :parent data))))
    (if (string= (org-element-property :NUMBERS headline) "no")
        (cond ((eq backend 'latex)
               (replace-regexp-in-string
                "\\(part\\|chapter\\|\\(?:sub\\)*section\\|\\(?:sub\\)?paragraph\\)"
                "\\1*" data nil nil 1))
              ((eq backend 'html)
               (replace-regexp-in-string
                "\\(<h[1-6]\\)\\([^>]*>\\)"
                "\\1 class=\"nonumber\"\\2" data nil nil)))
      data)))

(setq org-export-filter-headline-functions '(headline-numbering-filter))

Dies funktioniert gut für den LaTeX-Export, jedoch nicht für den HTML-Export. Mit modernem CSS können Browser die Nummerierung jedoch für Sie vornehmen (angehängt an style.css):

/* do not show section numbers */
span.section-number-2 { display: none; }
span.section-number-3 { display: none; }
span.section-number-4 { display: none; }
span.section-number-5 { display: none; }
span.section-number-6 { display: none; }

/* use LaTeX-style names for the counters */
h1 { counter-reset: section; }
h2 { counter-reset: subsection; }
h3 { counter-reset: subsubsection; }
h4 { counter-reset: paragraph; }
h5 { counter-reset: subparagraph; }

.nonumber::before { content: none; }

h2::before {
    content: counter(section) " ";
    counter-increment: section;
}

h3::before {
    content: counter(section) "." counter(subsection) " ";
    counter-increment: subsection;
}

h4::before {
    content: counter(section) "." counter(subsection) "." counter(subsubsection) " ";
    counter-increment: subsubsection;
}

h5::before {
    content: counter(section) "." counter(subsection) "." counter(subsubsection) "." counter(paragraph) " ";
    counter-increment: paragraph;
}

h6::before {
    content: counter(section) "." counter(subsection) "." counter(subsubsection) "." counter(paragraph) "." counter(subparagraph) " ";
    counter-increment: subparagraph;
}

Damit können Sie Ihr Papier sowohl nach LaTeX als auch nach HTML exportieren.

Bastibe
quelle
"Der Org-Modus kann entweder alle oder keine Abschnitte nummerieren ." Ähm, wie wäre es, wenn Sie die Immobilie UNNUMBERED: tan eine Überschrift weitergeben? Aus ORG-NEWS: Überschriften, für die die Eigenschaft UNNUMBEREDnicht Null ist, werden jetzt unabhängig von ihrer Ebene ohne Abschnittsnummern exportiert. Die Eigenschaft wird von Kindern geerbt.
Rasmus
@rasmus das ist super! Soweit ich das beurteilen kann, wurde dies jedoch nur im org-Modus 8.3 eingeführt, der noch nicht veröffentlicht wurde.
Bastibe
Es ist in Master implementiert und funktioniert auf allen Backends. Org 8.3 ist vor der Haustür. Dass es nicht veröffentlicht wurde, bedeutet, dass es der perfekte Zeitpunkt ist, es zu testen und Fehlerberichte zu veröffentlichen (falls erforderlich)!
Rasmus