Génération de tables avec des en-têtes à partir d'un bloc de code

9

Je voudrais générer des tables qui ont des en-têtes à partir de blocs de code. Quelque chose comme ça:

#+BEGIN_SRC emacs-lisp :results value table :table-header | First | Second |
  (identity '((a b) (c d)))
#+END_SRC

#+RESULTS:
| First | Second |
|-------+--------|
| a     | b      |
| c     | d      |

Malheureusement, quelque chose comme :table-header | First | Second |ça n'existe pas. Ou plutôt j'espère que j'oublie quelque chose. (Ici, j'utilise (identity ...)comme un espace réservé pour le code qui calcule réellement une valeur.)

Cette solution de contournement ne le fait pas tout à fait pour moi:

#+BEGIN_SRC emacs-lisp :results value table
  (cons (list "First" "Second")
        (identity '((a b) (c d))))
#+END_SRC

#+RESULTS:
| First | Second |
| a     | b      |
| c     | d      |

Je dois modifier le contenu du bloc de code et l'en-tête résultant n'est pas en fait une ligne d'en-tête, c'est une ligne comme les autres.

En rapport avec cela (mais pas à 100% de la même manière, ci-dessus, j'aimerais éviter d'avoir à mettre des instructions de configuration de table à l' intérieur du bloc de code, en dessous de ce qui est requis), y a-t-il un élément spécial qui provoque l'insertion d'un séparateur? Quelque chose comme:

#+BEGIN_SRC emacs-lisp :results value table
  (nconc (identity '((a b) (c d)))  ; calculated value A
         (list 'linebreak)          ; explicitly inserted linebreak
         (identity '((A B) (C D)))) ; calculated value B
#+END_SRC

#+RESULTS:
| a | b |
| c | d |
|---+---|
| A | B |
| B | D |
tarse
la source

Réponses:

9

Utilisez simplement hlineau lieu de linebreak. Les oeuvres suivantes:

* test
#+BEGIN_SRC emacs-lisp :results value table
  '(("First" "Second")
    hline
    (a b) (c d))
#+END_SRC

#+RESULTS:
| First | Second |
|-------+--------|
| a     | b      |
| c     | d      |
Tobias
la source
Après avoir joué avec :colnamescomme suggéré dans l'autre réponse, il semble que je devrais ouvrir la demande de fonctionnalité pour #+BEGIN_SRC ... :colnames yesainsi que :colnames "| First | Second |". Jusque-là, je vais suivre cette approche.
tarsius
Juste une note au cas où quelqu'un trouve cela un ajout utile: Si vous ne l' utilisez des quotevaleurs d pour tout (par exemple , vous êtes peut - être au moyen d' un en- :vartête et a, b, c, etc. sont effectivement variables dérivées que vous utilisez listsur), juste citer la 'hlinesymbole lui-même.
lindes
3

Après avoir ajouté la ligne d'en-tête:

  1. Attribuer #+NAME:au bloc de code.

    #+NAME: needs-a-table-header
    #+BEGIN_SRC emacs-lisp :results value table 
      (cons (list "First" "Second")
            (identity '((a b) (c d))))
    #+END_SRC
    
  2. Ajouter une #+CALL:instruction avec en- :colnames yestête

    #+CALL: needs-a-table-header() :colnames yes 
    
  3. Exécuter l' #+CALL:instruction à l'aide de C-c C-c.

    #+RESULTS:
    | First | Second |
    |-------+--------|
    | a     | b      |
    | c     | d      |
    

J'espère que cela a aidé!


Code testé avec

GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + version 3.14.13)
org-version: 8.3.2

Melioratus
la source
Merci. Pour éviter d'avoir deux tables, j'ai préfixé le bloc de code et l'appel avec #+NAME: same-name. Étant donné que je dois encore contre la ligne d'en-tête lors de l'utilisation de cette approche, j'irai avec la solution dans l'autre réponse.
tarsius
@tarsius Merci pour la mise à jour! BTW merci d'avoir posé cette question! Je connais plusieurs façons d'ajouter des en-têtes de tableau qui pourraient vous être utiles. Je vais parcourir mes notes et poster une autre réponse.
Melioratus