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.

Öffne in Overleaf
\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.

Öffne in Overleaf
\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, 09:13

helmutW's gravatar image

helmutW
1063
Akzeptiert: 62%

bearbeitet 04 Okt, 07:24

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, 13: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, 14:58) Murmeltier

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

(04 Okt, 03: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, 07:25) helmutW

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

(04 Okt, 11:01) helmutW

@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, 14: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, 16:34) Murmeltier
Ergebnis 5 von 7 Alle anzeigen

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, 08:10

helmutW's gravatar image

helmutW
1063

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×69

Frage gestellt: 03 Okt, 09:13

Frage wurde angeschaut: 299 Mal

Zuletzt aktualisiert: 08 Okt, 08:10