2016-09-05 3 views
27

При использовании обоих индексов и надстроек на метке узла можно изменить расположение так, чтобы они находились непосредственно друг над другом.Улучшение позиционирования индекса и надстрочного указателя на ярлыках узлов

Пример:

digraph G { 
     x11[label=<X<SUB>1</SUB><SUP>(1)</SUP>>]; 
     x21[label=<X<SUB>2</SUB><SUP>(1)</SUP>>]; 
     x11 -> x21 
    } 

Который производит

enter image description here

Можно ли иметь (#) непосредственно над #, а не чуть правее? благодаря


Я пытался добавить пользовательский css скрипт (ре: HTML: can I place subscript text right under the superscript?) к моему dot сценария с stylesheet = "styles.css"; (Re: Using CSS classes in HTML labels on Graphviz), однако, она возвращает ошибку

Error: Unknown HTML element <span> on line 1

ответ

6

Собственный HTML-подобный рендеринг Graphviz довольно ограничен. Документы Graphviz ясно говорят об этом. Я не верю, что есть способ уговорить его сделать то, что вы хотите. Даже если есть способ настроить, например, a <table> определение для этого, результаты, скорее всего, будут выглядеть плохо.

Поэтому я рекомендую посмотреть на . Его цель - предоставить полную мощность LaTeX для рендеринга узлов. Настройка не является тривиальной, но результаты ее стоят.

Here's a page показаны примеры графиков, содержащих математическую математику LaTeX в узлах.

Вы не сказали, какой должен быть выход. Но есть способы конвертировать LaTeX во многие разные формы. Самый простой - Postscript и PDF. Но форматы изображений также возможны.

Добавление

Хорошо я установил dot2tex, и вот результат:

GraphViz graph with stacked subscripts under superscripts

Вот соответствующий dot код:

digraph G { 
    a_1 [texlbl="$X_{1}^{(1)}$"]; 
    a_2 [texlbl="$X_{1}^{(2)}$"]; 
    a_3 [texlbl="$X_{1}^{(3)}$"]; 
    a_1-> a_2 -> a_3 -> a_1; 
} 

Я составил с

$ dot2tex foo.gv -f tikz > foo.tex 
$ pdflatex foo.tex 

Поскольку вы уже используете LaTeX, вы сможете настроить его, чтобы удовлетворить ваши точные требования без особых проблем.

+0

Еще раз спасибо Gene, imo это дает самое приятное решение. [если требуется, одним из способов выравнивания чисел является использование '\ phantom':' texlbl = '$ X _ {\ phantom {(} 1}^{(2)} $ "'] – user2957945

4

согласно Документы Graphviz, их 'HTML-Like Labels' не включают элемент span, а теги шрифтов не позволяют атрибут стиля (или любой другой):

<SUB 
    <!-- No attributes --> 
> 

<SUP 
    <!-- No attributes --> 
> 

Два лучших вариантов для точного расположения текста кажутся:

1) Используйте ярлык с HTML-как таблицу, которая действительно позволяет для пользовательского стиля (и ручки вертикально расположенной текст штрафа в любом случае).

x11[label=< 
    <TABLE border="0" cellborder="0" cellspacing="0"> 
    <TR><TD rowspan="2" style="...">X</TD><TD style="...">(1)</TD></TR> 
    <TR>         <TD style="...">1</TD></TR> 
    </TABLE>>]; 

2) При использовании драйвера PostScript, override the node generation entirely и поставить файл пс, который рисует именно то, что вы хотите.

+0

Спасибо, это хорошее обходное решение, которое хранит все это в графике. Он центрирует числа непосредственно друг под друга, что отлично, но он добавляет немного дополнительного пространства между суб/надстрочными индексами и метками узла. Я посмотрю, посмотрю, смогу ли я настроить его. – user2957945

+0

Yup, настройка макета с атрибутами 'style' должна немного помочь. Использование полного tex, как предложено ниже, вероятно, более подходит для вас, но играть в таблицы с таблицами может быть достаточно для других. –

3

Возможно, мы могли бы представить более мощный рендеринг HTML (я только что заметил litehtml и sciter, который не является открытым исходным кодом), который, вероятно, имеет свою собственную систему make, потенциальные проблемы безопасности, свой собственный шрифт и управление названиями цветов, общие строки, Зависимости компилятора C++, утечки памяти и litehtml - это всего лишь 16-килограммовые строки кода, которые в наши дни едва перемещают счетчик для нас, просто я всегда чувствую себя немного виноватым, когда вижу твиты о том, как строить graphviz сложнее, чем ядро ​​linux. Stephen North

+0

Одна вещь, которую я ожидал быть возможной и был удивлен, прочитав, что документы не были, было бы использовать svg непосредственно для узла при использовании svg/растровых выходов. Думаю, это потому, что сложнее обеспечить, чтобы svg не просачивался за пределы области, чем эквивалент с postscript? –

+0

Спасибо за ваш комментарий Стивен. Да, я думаю, что изменение источника graphviz немного заблудилось для изменения позиций ярлыков! – user2957945

+0

Я просто заметил этот комментарий. На самом деле, я немного удивлен, что мы не поддерживаем SVG import (не то, что точка всего expat ghostscript и т. д.)? Документы всегда очень актуальны. Мы могли бы действительно использовать помощь, чтобы взглянуть на это. Я думаю, что рендеринга можно было бы определить ограничительную рамку импортированного кода или просто доверять объявленному ограничивающему прямоугольнику или доверять пользователю graphviz объявить правильный размер узла. Философски это было бы нашим общим подходом. –

Смежные вопросы