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}
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/.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.
Mitleser :) @murmeltier ich verwende folgenden Editor https://de.overleaf.com Man muss nichts installieren
@murmeltier weiter so glaube ich kann ich diesen Code nicht kürzen. Ansonsten ist die nötige Struktur nicht mehr gegeben. Danke.
Kann mir jemand weiterhelfen? Ich habe schon alles probiert...
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.
@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.
@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.)