Hallo,

Der Code stammt ursprünglich von @Skillmon. Wie kann ich die Horizontale Linie auf EINE bestimmte Länge "setzen" (Wenn der String länger als 1-2 Zeichen ist) zb: 80 pt/ 50ex / 3 cm.... Bis Dato habe ich folgenden Befehl before computing xy={l=100pt} verwendet. Dieser Befehl funktioniert aber nicht mehr.

Ich habe diese Frage auch schon https://tex.stackexchange.com/questions/453605/my-string-is-too-long-for-my-node-i-need-more-space gepostet da ich leider möglichst bald ein Ergebnis brauche. In Zukunft werde ich solche Duplikate unterlassen. Danke für euer Verständnis.

\documentclass[11pt,a4paper,titlepage,bibliography=totoc,numbers=noenddot,abstract=on,multi,dvipsnames,svgnames,x11names]{scrreprt}
%https://tex.stackexchange.com/questions/453605/my-string-is-too-long-for-my-node-i-need-more-space
\usepackage{storebox}
\usepackage[edges]{forest}
\usepackage{adjustbox}

%Zeilenumbruch in der tikz Umgebung!
% addaswyd o gôd Sašo Živanović: http://tex.stackexchange.com/a/296771/
\def\hiddenparcommand{\par}
\newcommand\otherhiddenparcommand{\par\noindent}
\newcommand\hiddencommacommand{, }
\forestset{%
    declare keylist register={split here ids},% the list of nodes to split the tree at
    split here ids={},
    declare keylist register={split here interjects},% the list of comments to put in between the tree parts
    split here interjects={},
    declare keylist={split here auto siblings}{},% a list to hold the siblings which need edge restoration
    declare toks register=split here toks,
    declare dimen register=tmpdima,
    tmpdima'=80pt,
    declare dimen register=tmpdimb,
    tmpdimb'=40pt,
    declare dimen register=tmpdimc,
    tmpdimc'=0pt,
    to widest/.style={
        tikz+={\path (\forestregister{tempdima}, \forestoption{y}) -- (\forestregister{tempdimb}, \forestoption{y});},
    },
    hide commas/.style={%
        split here toks+={\hiddencommacommand},
        split here toks+={#1},
    },
    split dir tree pre/.style={%
        label={[text=gray, anchor=north, font=\scriptsize]below:{[cont.]}{}},
    },
    split dir tree post/.style={%
        label={[font=\scriptsize, anchor=south, text=gray]above:{[cont.]}{}},
    },
    split dir tree auto post/.style={% this gets applied to the first node after a break
        split dir tree post,
        tempkeylistc'={},
        tmpdimb/.option=y,
        for nodewalk={
            while={
                > ORw2+d _+d < On=! & {y}{tmpdimb}{##2-##1} {\textheight-#1} {n'}{1}%
            }{
                next,
                tempkeylistc/.option=name
            }%
        }{},
        % save the list
        split here auto siblings/.register=tempkeylistc,
        tikz+/.process={% this tries to redraw the edges to the following siblings
            OOw2{edge}{id}%
            {%
                \path [##1] (!u.parent anchor |- .north) ++(\forestregister{folder indent},1ex) coordinate (before ##2) |- (.child anchor);
                \edef\tempa{\foresteoption{split here auto siblings}}
                \foreach \i in \tempa \path [##1] (before ##2) |- ({forest cs:\i.child anchor});
            }%
        },
    },
    split dir tree/.code={%
        \forestset{%
            draw tree stage/.style={
                for root'={
                    tempdima/.min={%
                        >OOw2+d{x}{min x}{####1+####2}%
                    }{tree},
                    tempdimb/.max={%
                        >OOw2+d{x}{max x}{####1+####2}%
                    }{tree},
                    for tree={%
                        to widest,
                    },
                },
                tempcountb'=-1,
                do until={%
                    strequal((split_here_ids),"")
                }{%
                    tempkeylistb'={},
                    tempkeylista'={},
                    split register={split here ids}{,}{tempcounta,tempkeylistb+},
                    split register={split here interjects}{,}{temptoksa,tempkeylista+},
                    split here ids'/.register=tempkeylistb,
                    split here interjects'/.register=tempkeylista,
                    % Sašo Živanović: http://chat.stackexchange.com/transcript/message/28484520#28484520
                    for nodewalk={%
                        draw tree processing order/.style={%
                            filter={tree}{> ORw+n< OR> & {id}{tempcounta}{########1+1}{id}{tempcountb}}%
                        }%
                    }{},
                    for root'={draw tree},
                    TeX/.process={Rw{temptoksa}{\otherhiddenparcommand ####1\hiddenparcommand}},
                    tempcountb'/.register=tempcounta,
                },
                for nodewalk={%
                    draw tree processing order/.style={%
                        filter={tree}{>OR>{id}{tempcountb}}%
                    }%
                }{},
                for root'={draw tree},
            },
        }%
    },
    split dir here auto/.style n args=2{%
        split dir tree pre,
        !next node.split dir tree auto post=#2,
        split here ids+/.option=id,
        %     !next node.split resume here ids+/.option=id,
        split={#1}{,}{split here toks,hide commas},
        split here interjects/.register=split here toks,
    },
    split dir tree auto/.style={%
        split dir tree,
        before drawing tree={%
            tempdima/.max={y}{tree},
            tempdimc/.register=tempdima,
            tempdimd/.min={y}{tree},
            tempdima-/.register=tempdimd,
            tempdimb'=\textheight,
            tmpdima'=20ex,
            tmpdimc'=\pagetotal,
            while={%
                >RR>{tempdima}{tempdimb}%
            }{%
                for nodewalk={%
                    root',
                    until={%
                        > ROw2+d RRw2+d > {tempdimc}{y}{##1-##2} {tmpdima}{tmpdimc}{\textheight-##2-##1}%
                    }{next node},
                    previous node,
                    split dir here auto/.process={R_w2{tmpdima}{continued}{{##2}{##1}}},
                    next node,
                    tempdima/.option=y,
                    tempdimc/.register=tempdima,
                    tempdima-/.register=tempdimd,
                    tmpdima'=15ex,
                    tmpdimc'=80pt
                }{},
            },
        },
    },
}
%Zeilenumbruch in der tikz Umgebung! Ende

\usepackage{xparse}
\ExplSyntaxOn
\box_new:N \l_helmutW_box
\cs_new_protected:Npx \helmutW_replace_verb_newline:Nn #1 #2
  {
    \tl_replace_all:Nnn #1 { \char_generate:nn { 13 } { 12 } } { #2 }
  }
\cs_new_protected:Npx \helmutW_replace_verb_newline_newline:Nn #1 #2
  {
    \tl_replace_all:Nnn #1
      { \char_generate:nn { 13 } { 12 } \char_generate:nn { 13 } { 12 } } { #2 }
  }
\cs_new_protected:Npn \helmutW_process_verb_newline:nnn #1 #2 #3
  {
    \tl_set:Nn \ProcessedArgument { #3 }
    \helmutW_replace_verb_newline_newline:Nn \ProcessedArgument { #2 }
    \helmutW_replace_verb_newline:Nn \ProcessedArgument { #1 }
  }
\NewDocumentCommand \AutoSplittedTree
  {
    s
    O{ for~tree = { folder, grow'=0, fit=band, } }
    >{ \helmutW_process_verb_newline:nnn { ~ } { ~ \par } } +v
  }
  {
    \par
    \IfBooleanTF { #1 }
      { \iftrue }
      {
        \vbox_set:Nn \l_helmutW_box { \helmutW_tree:n { #2, #3 } }
        \dim_compare:nNnTF { \box_ht:N \l_helmutW_box } >
          { \dim_min:nn { \pagegoal-\pagetotal } { \textheight } }
          {
            \iftrue
          }
          {
            \box_use:N \l_helmutW_box
            \iffalse
          }
      }
      \helmutW_tree:n { #2, split~dir~tree~auto, #3 }
    \fi
  }
\cs_new_protected:Npn \helmutW_tree:n #1
  {
    \scantokens
      {
        \begin{forest}
          #1
        \end{forest}%
      }
  }
\ExplSyntaxOff

\begin{document}    
\AutoSplittedTree
  {
    [ XYZ
      [ XYZ
        [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{Too longggggggg}}
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{3}} ]
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{AA}} ]
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{4}} ]
        ]
      ]
    ]
  }
\end{document}

Update 2: Der Code wurde gekürzt. Der für das Problem (Node Länge vergrößern) unnötige Zeilenumbruch Code wurde gelöscht.

\documentclass[11pt,a4paper,titlepage,bibliography=totoc,numbers=noenddot,abstract=on,multi,dvipsnames,svgnames,x11names]{scrreprt}
\usepackage[edges]{forest}
\usepackage{xparse}
\ExplSyntaxOn
\box_new:N \l_helmutW_box
\cs_new_protected:Npx \helmutW_replace_verb_newline:Nn #1 #2
  {
    \tl_replace_all:Nnn #1 { \char_generate:nn { 13 } { 12 } } { #2 }
  }
\cs_new_protected:Npx \helmutW_replace_verb_newline_newline:Nn #1 #2
  {
    \tl_replace_all:Nnn #1
      { \char_generate:nn { 13 } { 12 } \char_generate:nn { 13 } { 12 } } { #2 }
  }
\cs_new_protected:Npn \helmutW_process_verb_newline:nnn #1 #2 #3
  {
    \tl_set:Nn \ProcessedArgument { #3 }
    \helmutW_replace_verb_newline_newline:Nn \ProcessedArgument { #2 }
    \helmutW_replace_verb_newline:Nn \ProcessedArgument { #1 }
  }
\NewDocumentCommand \AutoSplittedTree
  {
    s
    O{ for~tree = { folder, grow'=0, fit=band, } }
    >{ \helmutW_process_verb_newline:nnn { ~ } { ~ \par } } +v
  }
  {
    \par
    \IfBooleanTF { #1 }
      { \iftrue }
      {
        \vbox_set:Nn \l_helmutW_box { \helmutW_tree:n { #2, #3 } }
        \dim_compare:nNnTF { \box_ht:N \l_helmutW_box } >
          { \dim_min:nn { \pagegoal-\pagetotal } { \textheight } }
          {
            \iftrue
          }
          {
            \box_use:N \l_helmutW_box
            \iffalse
          }
      }
      \helmutW_tree:n { #2, split~dir~tree~auto, #3 }
    \fi
  }
\cs_new_protected:Npn \helmutW_tree:n #1
  {
    \scantokens
      {
        \begin{forest}
          #1
        \end{forest}
      }
  }
\ExplSyntaxOff

\begin{document}    
\AutoSplittedTree
  {
    [ XYZ
      [ XYZ
        [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{Too longggggggg}}
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{3}} ]
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{AA}} ]
         [ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{4}} ]
        ]
      ]
    ]
  }
\end{document}

gefragt 03 Okt '18, 15:13

helmutW's gravatar image

helmutW
116111
Akzeptiert-Rate: 40%

bearbeitet 19 Dez '19, 07:46

Ijon%20Tichy's gravatar image

Ijon Tichy
9.7k31228

Auch hier (wie schon im cross-post auf TeX.SX) sei erwähnt, dass nur das Macro \AutoSplittedTree (mit den zugehörigen Hilfsmakros) von mir stammt, der TikZ code stammt von http://tex.stackexchange.com/a/296771/.

(03 Okt '18, 19:31) Skillmon

Wenn Du alle komischen Zeichen aus Deinem Code entfernst, kann ich versuchen, mir das anzuschauen. Leider habe ich einen sehr alten Editor, mit dem ich Sachen wie "Sašo" nicht kopieren kann. Ich habe mir ein paar mal die Mühe gemacht, die von Hand zu entfernen, aber es ist mir zu umständlich, das sehr oft zu tun.

(03 Okt '18, 20:58) Community

Mitleser :) @murmeltier ich verwende folgenden Editor https://de.overleaf.com Man muss nichts installieren

(04 Okt '18, 09:59) Ferdinand

@murmeltier weiter so glaube ich kann ich diesen Code nicht kürzen. Ansonsten ist die nötige Struktur nicht mehr gegeben. Danke.

(04 Okt '18, 13:25) helmutW

Kann mir jemand weiterhelfen? Ich habe schon alles probiert...

(04 Okt '18, 17:01) helmutW

Ich werde bestimmt nicht overleaf verwenden. Ich bin leider nur mit meinem Editor schnell, und der kann dummerweise den Code nicht kopieren, weil da Sonderzeichen enthalten sind.

(04 Okt '18, 20:35) Community

@helmutW Evtl. @murmeltier wenn Du die Sonderzeichen in einer Kopie für hier wegkriegst? Ich helfe auch gern bei TikZ und Verwandtem, bin nur gerade auf schlauchender Dienstreise (Werftarbeit) mit sporadisch kurzem Internetzugang.

(04 Okt '18, 20:51) stefan ♦♦

@Stefan Das Problem liegt sicherlich an meinem Editor. Nur habe ich schon gefühlte 100 Mal die Kommentare mit Sonderzeichen wie in "Sašo" in Ablegern dieses Codes per Hand entfernt, und das ist sehr mühsam, weil das ein sehr langer Code ist. Mittlerweile hat sich das Ganze auch in eine Richtung weiterentwickelt, wo ich leider passen muss. (Ich vermute, dass es auch eine Forest-basierte Möglichkeit gibt, den Fehler zu entfernen, wenn der Tree nicht über mehr als eine Seite läuft, aber wegen der Editor-Probleme hab ich mir das nie angeschaut.)

(04 Okt '18, 22:34) Community
Ergebnis 5 von 8 show 3 more comments

Da der Code zu lange ist poste ich nur den relavanten Teil. before computing xy={l=30pt} wurde an der richtigen Stelle hinzugefügt. Danke an Ulrike Fischer. Original Post siehe https://tex.stackexchange.com/questions/453605/my-string-is-too-long-for-my-node-i-need-more-space

Öffne in Overleaf
\begin{document}    
\AutoSplittedTree
{
[ XYZ
[ XYZ
[ XYZ,edge label={node[pos=0.75,above]{Too}}
[ A,before computing xy={l=30pt},edge label={node[pos=0.75,above]{100}}]
[ XYZ,edge label={node[pos=0.75,above,font=\scriptsize]{4}} ]
]
]
]
}
\end{document}
Permanenter link

beantwortet 08 Okt '18, 14:10

helmutW's gravatar image

helmutW
116111
Akzeptiert-Rate: 40%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×689
×71
×10
×2

gestellte Frage: 03 Okt '18, 15:13

Frage wurde gesehen: 1,600 Mal

zuletzt geändert: 08 Okt '18, 14:10