Formater un papier HTML avec le mode Org


11

La valeur par défaut du mode org lors de l'exportation HTML est de mettre l'auteur dans le postambule au bas de la page.

Mais je voudrais exporter un document de type papier avec l'auteur entre le titre et le résumé. Est-il possible de placer l'auteur après le titre?

Et est-il possible d'étiqueter l'abstrait comme un abstrait? J'ai utilisé les délimiteurs

#+BEGIN_abstract
...
#+END_abstract

pour marquer le texte comme l'abstrait mais il est rendu comme un paragraphe normal (pas de bloc comme le retrait). Est-il possible d'obtenir le bon retrait pour le résumé et une étiquette localisée?


2
Pour les exigences abstraites, utilisez css. ...sera enveloppé comme <div class="abstract"><p>...</p></div>. Pour avoir un titre similaire à LaTeX, vous devriez peut-être remplir un rapport de bogue. Pour l'instant, utilisez la macro {{{AUTHOR}}}et les extraits @@html:whatever@@pour créer ce que vous voulez.
rasmus

Réponses:


10

Peut-être quelque chose comme ça (testé avec LaTeX et 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

Notez que le html-headerpourrait également être généré via org-html-preamble. Notez également que from org 8.3 org-latex-title-commandpeut être utilisé pour personnaliser le titre sous forme de chaîne de format.


2

Jetez un oeil sur le code source, il semble qu'il n'y ait aucune option pour le faire.

Je ne sais pas ce que vous voulez vraiment, fournissez simplement deux façons possibles:

  1. Ajoutez simplement un #+BEGIN_HTML ... #+END_HTMLbloc pour écrire ce que vous voulez. (Le contenu qui y est écrit sera traité comme totalement HTML.) Mais vous devrez peut-être ajouter #+OPTIONS: toc: nilpour désactiver la table des matières ou l'auteur sera placé sous la table des matières.

  2. Redéfinissez la fonction d'exportation et faites ce que vous voulez (ligne 50 ~ 52), placez simplement le code suivant (require 'ox-html)dans votre fichier de configuration:

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

3
C'est absolument la mauvaise façon d'y arriver !! De préférence, vous devez créer un support dérivé, voir org-export-define-derived-backendet ajouter le nouveau modèle au :translate-alist. Pour des exemples concrets, vérifiez ox-beamer.el, ox-koma-script.elet par exemple ox-s5.el.
rasmus

1

Le problème le plus difficile que j'ai rencontré est le style conditionnel de différentes sections et la numérotation conditionnelle de différentes sections. Il s'agit d'une solution pour ces deux problèmes.

Voici mon article:

#+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:

Tout d'abord, cela inclut un fichier org avec quelques options supplémentaires. Ce fichier, appelé style.orgci-dessus, définit l'exportation HTML pour charger une feuille de style personnalisée et définit quelques options LaTeX. Si vous n'exportez pas vers LaTeX, vous n'en aurez pas besoin.

#+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}

Pour le rendre en HTML papier, un peu de CSS suffit (enregistré dans 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;
}

Cependant, les numéros de section seront erronés. Le mode org peut soit numéroter toutes les sections, soit aucune. Les articles ont généralement besoin de numéros sur les sections du corps, mais pas du résumé et du résumé. Le morceau de code suivant obligera Org à placer des nombres devant les sections régulières, mais supprimera les nombres si la propriété :NUMBERS: noest définie:

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

Cela fonctionne bien pour l'exportation LaTeX, mais pas dans l'exportation HTML. Avec le CSS moderne, les navigateurs peuvent faire la numérotation pour vous (en annexe 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;
}

Avec cela, vous pouvez exporter votre papier vers LaTeX et HTML.


"Le mode org peut numéroter toutes les sections, ou aucune ." Uhm, que diriez-vous de passer la propriété UNNUMBERED: tà un titre? Depuis ORG-NEWS: les titres, pour lesquels la propriété UNNUMBEREDn'est pas nulle, sont désormais exportés sans numéros de section, quels que soient leurs niveaux. La propriété est héritée par des enfants.
rasmus

@rasmus c'est génial! Cependant, pour autant que je sache, cela n'a été introduit qu'en mode org 8.3, qui n'est pas encore publié.
bastibe

Il est implémenté en master et fonctionne sur tous les backends. Org 8.3 est sur le pas de la porte. Le fait qu'il n'ait pas été publié signifie que c'est le moment idéal pour le tester et publier des rapports de bogues (si nécessaire)!
rasmus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.