Перетворити структуру OR-режиму в точкове джерело


12

Швидке генерування графіків з деревоподібної структури може бути дуже корисним, коли робити нотатки в org-режимі, які потребують спільного використання або прикраси для інших людей.

Я не міг знайти іншого способу зробити це, крім ручного створення динамічного блоку точка / графік.

Переклад із структурованого дерева на простий спрямований графік повинен бути досить простим.

Я шукаю простий спосіб перемістити дерево в режимі org (вибраний регіон) і перевести структуру дерева (і необов'язково деяку інформацію зі вмісту структури) на крапковий графік.

Я не можу бути першим, хто придумав це. Це вирішено?

вхід

* la1
** la2
*** la3
*** la4
** la5

і, можливо, змінна орга-до-точка-преамбула

digraph {
   rankdir=TB;
   splines=true;
   node [shape=box];

вихід буде виглядати як динамічний блок в режимі org

#+BEGIN_SRC dot :file out.png :cmdline -Kdot -Tpng
(contents of org-to-dot-preamble)

la1 -> la2
la1 -> la5
la2 -> la3
la2 -> la4
}
#+END_SRC

Більш вдосконалена версія спочатку оголосила б усі вузли та передбачала б певне форматування.

вхід

* la1
  firstline
  secondline
** la2
   firstline
   secondline
*** la3
*** la4
    firstline
** la5

Деякі змінні форматування

org-to-dot-shape
org-to-dot-font

вихід

#+BEGIN_SRC dot :file out.png :cmdline -Kdot -Tpng
(contents of org-to-dot-preamble)

la1 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la2 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la3 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la4 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]
la5 [shape=Mrecord, label="{firstline|secondline}", fontname = "helvetica"]

la1 -> la2
la1 -> la5
la2 -> la3
la2 -> la4
}
#+END_SRC

скріншот із буфера в органічному режимі результату макетування


Дуже цікаве запитання! Чи створить код перетворення точковий графік іншого буфера в органічному режимі або це власний буфер? Класна ідея!
Меліорат

Так, це було б корисно, як, наприклад, TikZ відображає в документах LaTeX.
Користувач Emacs

@Melioratus: Я думав просто використати вибраний регіон і помістити отриманий точковий код у кільце для вбивства або просто вставити його в точку.
Вернер

Відповіді:


4

Ось робочий приклад, який використовує org-elementAPI для розбору заголовків буфера:

* la1
** la2
*** la3
*** la4
** la5
**  Org element API test

#+name: lista
#+begin_src elisp
  (org-element-map (org-element-parse-buffer 'headline )
      'headline
    (lambda(hl)
      (let ((parent (org-element-property :parent hl )))
        (and (eq (org-element-type parent) 'headline)
             (list (org-element-property :title parent) (org-element-property :title hl))))))

#+end_src

#+RESULTS: lista
| la1 | la2                  |
| la2 | la3                  |
| la2 | la4                  |
| la1 | la5                  |
| la1 | Org element API test |

#+name: make-dot
#+BEGIN_SRC emacs-lisp :var table=lista :results output :exports none
  (mapcar #'(lambda (x)
                (princ (format "\"%s\" -> \"%s\";\n" (first x) (second x))))
          table)
#+END_SRC

#+RESULTS: make-dot
: "la1" -> "la2";
: "la2" -> "la3";
: "la2" -> "la4";
: "la1" -> "la5";
: "la1" -> "Org element API test";

#+BEGIN_SRC dot :file dependencias.pdf :cmdline -Tpdf :var input=make-dot :exports results
digraph {
   rankdir=TB;
   splines=true;
   node [shape=box];
   $input
  }
#+END_SRC

#+CAPTION: Dependency diagram
#+RESULTS:
[[file:dependencias.pdf]]

Це працює в кілька кроків: спочатку блок elisp використовує org-element-parse-bufferдля отримання всіх заголовків та витягує список батьківського заголовка та заголовка заголовка.

Потім інший джерельний блок перетворює цей список у кращий синтаксис.

Третій точковий блок джерела містить обертання DOT і включає згенеровані відносини.

Косметичні покращення: відфільтруйте розділ для самого тесту; ви можете додати тег до цього розділу та відфільтрувати за тегом у першому блоці.


Фантастичний! Це чудово!
RUserPassingБесень

3

Можливо, ви зможете повторно використовувати частину коду знизу http://pages.sachachua.com/evil-plans/ . Я в основному використовую записи org-map, щоб переглянути свої заголовки. Оскільки у мене є спрямований графік замість строгого дерева, я використовую прості пошуки регулярних виразів для аналізу структури посилань із зручного для людини тексту. Якщо ви просто працюєте з деревом, ви можете створити структуру дерева з заголовків безпосередньо. Після цього справа в створенні відповідного синтаксису graphviz, і org-babel може впоратися з його створенням і перетворенням у PNG або SVG. Сподіваюся, що це допомагає!


Це чудовий файл org і кілька приємних графіків.
db48x

3

Це не крапково, але якщо ви поспішаєте, наступні можуть бути корисними.

Нам потрібен org-plus-contribі FreeMind.app, щоб створити складну карту з документів в режимі org.

Установка додаткового орга-режим пакету під назвою org-plus-contribшляху M-x package-list-packages.

Можливо, нам може знадобитися додати

(require 'ox-freemind)

до наших .emacs.

Тоді ми можемо експортувати наш файл орг-режиму в Freemind * .mm файл C-c C-e f f, org-freemind-export-to-freemind.

Тепер ми відкриваємо * .mm від Freemind.app та voila!

від миші орг-до-мм

Наведіть курсор миші, щоб побачити вміст вузлів.

  • застереження: Експорт Freemind містить стару інформацію про посібник Org <8.0

1

ОНОВЛЕННЯ: 2019 рік

Існує пакет під назвою org-mind-map

https://github.com/theodorewiles/org-mind-map

Він створює графіки, орієнтовані на графік, з файлів org-mode, використовуючи мову крапок.

Після установки org-mind-map ви можете експортувати файл org C-c C-eі вибрати "Створити графік і крапковий файл"g d

Це створить крапковий файл з вашого файлу org. Він буде містити деякі візуальні налаштування з пакету org-mind-map за замовчуванням. Ви можете їх відредагувати або скопіювати відповідні частини в новий файл крапок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.