2016-09-05 16 views
27

Podczas używania zarówno indeksu dolnego, jak i górnego na etykiecie węzła, można zmienić pozycję, tak aby znajdowały się bezpośrednio nad sobą.Poprawienie pozycjonowania indeksu dolnego i indeksu górnego na etykietach węzłów

Przykład:

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

która produkuje

enter image description here

Czy to możliwe, aby mieć (#) bezpośrednio nad # zamiast lekko w prawo? Dzięki


Próbowałem dodać niestandardową css skrypt (re: HTML: can I place subscript text right under the superscript?) do mojego dot skryptu z stylesheet = "styles.css"; (re: Using CSS classes in HTML labels on Graphviz), jednak to zwraca błąd

Error: Unknown HTML element <span> on line 1

Odpowiedz

6

Natywny rendering węzłów HTML w Graphviz jest dość ograniczony. Dokumenty Graphviz mówią to wyraźnie. Nie wierzę, że istnieje sposób, aby zmusić go do robienia tego, co chcesz. Nawet jeśli istnieje sposób na ulepszenie, np. Aby to zrobić, wyniki będą prawdopodobnie źle wyglądać.

Dlatego polecam spojrzeć na . Jego głównym celem jest umożliwienie pełnej mocy LaTeX do renderowania węzłów. Konfiguracja nie jest trywialna, ale wyniki są tego warte.

Here's a page pokazano przykłady wykresów zawierających matematykę zestawu LaTeX w węzłach.

Nie powiedziałeś, jaki powinien być wynik. Są jednak sposoby na konwersję LaTeXa na wiele różnych form. Najłatwiejsze są Postscript i PDF. Możliwe są jednak również formaty obrazów.

Dodawanie

Ok zainstalowałem dot2tex i oto wynik:

GraphViz graph with stacked subscripts under superscripts

Oto odpowiedni kod 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; 
} 

skompilowany z

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

Ponieważ już używasz LaTeX, powinieneś być w stanie dostosować to do swoich wymagań bez większych problemów.

+0

Dzięki jeszcze raz Gene, imo to daje najpiękniejsze rozwiązanie. [jeśli jest to wymagane, jeden ze sposobów wyrównania liczb używa '\ phantom':' texlbl = "$ X _ {\ phantom {(} 1}^{(2)} $" '] – user2957945

4

Per Dokumenty Graphviz, ich 'HTML-Like Labels' nie zawierają elementu span, a znaczniki stylów czcionek nie dopuszczają atrybutu stylu (ani żadnego innego):

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

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

Dwie najlepsze opcje dla precyzyjnego układu tekstu wydaje się być:

1) Użyj etykietę z tabeli HTML-like, która zezwala na zamówienie stylizacji (i uchwyty pionowo umieszczonym tekst drobnym tak).

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) W przypadku korzystania ze sterownika PostScript, override the node generation entirely i dostarczyć plik ps który czerpie dokładnie, co chcesz.

+0

Dzięki, to jest dobre obejście, które utrzymuje wszystko w grafviz. Centruje liczby bezpośrednio pod siebie, co jest wspaniałe, ale dodaje trochę dodatkowej przestrzeni między sub/superscripts i etykietami węzłów. Będę miał mały wygląd, żeby sprawdzić, czy mogę go poprawić. – user2957945

+0

Tak, ulepszenie układu za pomocą atrybutów "style" powinno nieco pomóc. Korzystanie z pełnego teksu, jak sugerowano poniżej, jest prawdopodobnie bardziej odpowiednie dla ciebie, ale błądzenie przy stołach może być wystarczające dla innych. –

3

Może moglibyśmy wprowadzić bardziej zaawansowany mechanizm renderowania HTML (zauważyłem właśnie litehtml i sciter, który nie jest open source), który prawdopodobnie ma swój własny system tworzenia, potencjalne problemy z zabezpieczeniami, własne zarządzanie czcionkami i kolorami, wspólne ciągi, Zależności kompilatora C++, przecieki pamięci i litehtml na przykład to tylko 16K wierszy kodu, które w dzisiejszych czasach ledwo przesuwają dla nas licznik, po prostu zawsze czuję się trochę winna, gdy widzę tweety o tym, jak budowanie graphviz jest trudniejsze niż jądro Linuxa. Stephen North

+0

Jedna rzecz, której oczekiwałem, jest możliwa i zdziwił się, że czytanie nie było, byłoby użycie svg bezpośrednio dla węzła podczas używania wyjść svg/raster. Chyba dlatego, że trudniej jest wyegzekwować to, że svg nie wycieka poza obszar niż ekwiwalent z postscript? –

+0

Dziękuję za Twój komentarz Stephen: Tak, myślę, że zmiana źródła graphviz idzie trochę dalej na małą zmianę pozycji etykiety! – user2957945

+0

Właśnie zauważyłem ten komentarz. Właściwie to jestem trochę zaskoczony, że nie obsługujemy SVG import (czy to nie jest punkt wszystkich maszyn expat ghostscript itp.?) Dokumenty są zawsze bardzo aktualne.Moglibyśmy naprawdę skorzystać z pomocy, aby spojrzeć na to świeżo.Myślę, że renderer może zorientować się ramkę graniczną zaimportowanego kodu, lub po prostu zaufaj zadeklarowanemu ograniczonemu polu lub zaufaj użytkownikowi graphviz do zadeklarowania prawidłowy rozmiar węzła. Filozoficznie byłoby to nasze ogólne podejście. –

Powiązane problemy