Генерация таблиц с заголовками из блока кода

9

Я хотел бы генерировать таблицы, которые имеют заголовки из блоков кода. Что-то вроде этого:

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

К сожалению что-то подобное :table-header | First | Second |не существует. Вернее, я надеюсь, что я что-то упускаю. (Здесь я использую (identity ...)в качестве заполнителя для кода, который фактически рассчитывает значение.)

Этот обходной путь не совсем для меня:

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

Я должен изменить содержимое блока кода, и результирующий заголовок на самом деле не строка заголовка, а строка, как и любой другой.

В связи с этим (но не на 100% то же самое, выше, я хотел бы избежать размещения инструкций по настройке таблицы внутри блока кода, ниже необходимого), есть ли специальный элемент, который вызывает вставку разделителя? Что-то вроде:

#+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 |
Tarsius
источник

Ответы:

9

Просто используйте hlineвместо linebreak. Следующие работы:

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

#+RESULTS:
| First | Second |
|-------+--------|
| a     | b      |
| c     | d      |
Тобиас
источник
После того, как вы поигрались с :colnamesпредложенным в другом ответе, похоже, мне нужно будет открыть запрос на #+BEGIN_SRC ... :colnames yesдобавление функции :colnames "| First | Second |". До тех пор я пойду с этим подходом.
Tarsius
Только примечание в случае , если кто считает , что это полезное дополнение: Если вы не используете quoteзначения d для всего (например , может быть , вы используете :varзаголовок и a, b, cи т.д., на самом деле получены переменные , которые вы используете listна), просто процитировать 'hlineсам символ
Линдес
3

После добавления строки заголовка:

  1. Назначить #+NAME:блоку кода.

    #+NAME: needs-a-table-header
    #+BEGIN_SRC emacs-lisp :results value table 
      (cons (list "First" "Second")
            (identity '((a b) (c d))))
    #+END_SRC
    
  2. Добавить #+CALL:заявление с :colnames yesзаголовком

    #+CALL: needs-a-table-header() :colnames yes 
    
  3. Запустите #+CALL:оператор, используя C-c C-c.

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

Надеюсь, что это помогло!


Код протестирован с использованием

GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + версия 3.14.13)
org-версия: 8.3.2

Melioratus
источник
Спасибо. Чтобы не было двух таблиц, я использовал префикс кода и вызов с #+NAME: same-name. Так как при использовании этого подхода мне все еще не хватает строки заголовка, я перейду к решению в другом ответе.
tarsius
@tarsius Спасибо за обновление! Кстати, спасибо, что задали этот вопрос! Я знаю несколько разных способов добавления заголовков таблиц, которые могут оказаться полезными. Я просмотрю свои заметки и пост другой ответ.
Мелиоратус