Formatee un documento HTML con el modo Org


11

El modo predeterminado de Org-mode durante la exportación de HTML es colocar al autor en el postamble en la parte inferior de la página.

Pero me gustaría exportar un documento en papel con el autor entre el título y el resumen. ¿Es posible de alguna manera colocar al autor después del título?

¿Y es posible etiquetar el resumen como un resumen? He usado los delimitadores

#+BEGIN_abstract
...
#+END_abstract

para marcar el texto como abstact, pero se representa como un párrafo normal (sin comillas). ¿Es posible obtener la sangría correcta para el resumen y una etiqueta localizada?


2
Para los requisitos abstractos use css. ...será envuelto como <div class="abstract"><p>...</p></div>. Para tener un título similar a LaTeX, tal vez debería llenar un informe de error. Por ahora usa la macro {{{AUTHOR}}}y los fragmentos @@html:whatever@@para construir lo que quieras.
rasmus

Respuestas:


10

Tal vez algo como esto (probado con LaTeX y 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

Tenga en cuenta html-headerque también podría generarse a través de org-html-preamble. Tenga en cuenta también que from org 8.3 org-latex-title-commandpuede usarse para personalizar el título como una cadena de formato.


2

Eche un vistazo al código fuente, parece que no hay opción para hacer esto.

No estoy seguro de lo que realmente quiere, solo proporcione dos formas posibles:

  1. Solo agrega un #+BEGIN_HTML ... #+END_HTMLbloque para escribir lo que quieras. (El contenido escrito en él se tratará como totalmente HTML). Pero es posible que deba agregarlo #+OPTIONS: toc: nilpara deshabilitar TOC o el autor se colocará bajo TOC.

  2. Vuelva a definir la función de exportación y haga lo que quiera (línea de aviso 50 ~ 52), simplemente coloque el siguiente código después (require 'ox-html)en su archivo de configuración:

      (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
¡Esto es absolutamente la forma incorrecta de hacerlo! Preferiblemente, necesita hacer una copia de respaldo derivada, ver org-export-define-derived-backendy agregar la nueva plantilla al :translate-alist. Para ejemplos concretos verifique ox-beamer.el, ox-koma-script.ely eg ox-s5.el.
rasmus

1

El problema más difícil que encontré con esto es el estilo condicional de diferentes secciones y la numeración condicional de diferentes secciones. Esta es una solución para ambos problemas.

Aquí está mi artículo:

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

Primero, esto incluye un archivo de organización con algunas opciones adicionales. Este archivo, llamado style.organteriormente, establece la exportación de HTML para cargar una hoja de estilo personalizada y establece algunas opciones de LaTeX. Si no está exportando a LaTeX, no los necesitará.

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

Para representar esto como HTML en papel, basta un poco de CSS (guardado en 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;
}

Sin embargo, los números de sección estarán equivocados. El modo Org puede numerar todas las secciones o ninguna. Los documentos generalmente necesitan números en las secciones del cuerpo, pero no el Resumen y el Resumen. El siguiente código hará que Org ponga números delante de las secciones normales, pero suprimirá los números si :NUMBERS: nose establece la propiedad :

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

Esto funciona bien para la exportación de LaTeX, pero no en la exportación de HTML. Sin embargo, con CSS moderno, los navegadores pueden hacer la numeración por usted (adjunto a 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;
}

Con eso, puede exportar su papel a LaTeX y HTML.


"El modo Org puede numerar todas las secciones o ninguna ". Uhm, ¿qué tal pasar la propiedad UNNUMBERED: ta un titular? De ORG-NEWS: Los encabezados, para los cuales la propiedad UNNUMBEREDno es nula, ahora se exportan sin números de sección, independientemente de sus niveles. La propiedad es heredada por los niños.
rasmus

@rasmus eso es genial! Sin embargo, por lo que puedo decir, esto solo se introdujo en el modo org 8.3, que aún no se ha lanzado.
bastibe

Se implementa en master y funciona en todos los backends. Org 8.3 está en la puerta. Que no se haya publicado significa que es el momento perfecto para probarlo y publicar informes de errores (según sea necesario).
rasmus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.