Formatieren des Knoteninhalts abhängig von Parametern

Formatieren des Knoteninhalts abhängig von Parametern

Ich möchte gerne ändern können,Inhaltder Knoten, von einer selbst erstellten Parameterliste bis zu einem tatsächlichen Text.

Ich möchte beispielsweise Bäume wie die folgenden erstellen:

\documentclass{standalone}
\usepackage{forest}

\begin{document}
\begin{forest}
[9;12;4
    [31;21]
    [3
        [14]
        [7;21;3]
    ]
]
\end{forest}
\end{document}

Bildbeschreibung hier eingeben

wird folgendermaßen formatiert:

Bildbeschreibung hier eingeben

Grundsätzlich möchte ich, je nach Anzahl der Parameter, getrennt durch eine Semikolon, den endgültigen Inhalt unterschiedlich formatieren:

  • mit 1 Parameter ist das Format „#1 ist die Eins“
  • mit 2 Parametern ist das Format „mit #1[#2]“
  • mit 3 Parametern ist das Format „$#2 \geq #1$ für #3 Fälle“

Bisher konnte ich den Inhalt jedes Knotens aufteilen mitSplit-Option, aber es ist mir nicht gelungen, herauszufinden, wie viele ich tatsächlich habe, und auf jede davon zuzugreifen.

Ich suche etwa Folgendes:

before typesetting nodes={
   for tree={
       split option={content}{;}{params},
       if {length(params) = 1}{content=params[1] is the one}{
           if {length(params) = 2}{content=with params[1][params[2]]}{
               if {length(params} = 3}{content=$params[2] \geq params[1]$ for params[3] cases}
               {}
            }
        }  
    }
}

PS: Der Grund, warum ich das auf diese Weise versuche, ist, dass ich viele große Bäume mit demselben Knotenformat erstellen muss. Und aus Sicht des Autors ist es viel einfacher, einfach die Parameter jedes Knotens auszuwählen und die Formatierung getrennt zu halten, insbesondere wenn Sie sie später ändern müssen.

Antwort1

split option(und andere splitSchlüssel) „zippt“ die angegebene „Anweisungs“-Schlüsselliste (ihre #3) und die „Parameter“-Liste (im Optionsfall den geteilten Wert der Option, der als ihre angegeben ist #1). Die Teile der Option können daher mit unterschiedlichen Schlüsseln verarbeitet werden.

\documentclass{standalone}
\usepackage{forest}

\forestset{
  declare toks register=param1,
  declare toks register=param2,
  declare toks register=param3,
  gobble/.style={},
  my split/.style={
    param1={},
    param2={},
    param3={},
    split option={content}{;}{param1,param2,param3,gobble},
    if param2={}{
      content'/.process=Rw1{param1}{##1 is the one}
    }{
      if param3={}{
        content'/.process=R2w2{param1}{param2}{with ##1[##2]}
      }{
        content'/.process=R3w3{param1}{param2}{param3}{$##2 \geq ##1$ for ##3 cases}
      }
    }
  }
}

\begin{document}
\begin{forest} delay={for tree=my split}
[9;12;4
    [31;21]
    [3
        [14]
        [7;21;3]
    ]
]
\end{forest}
\end{document}

Antwort2

Ich bin mir nicht sicher, ob split optiondas mit Listen unterschiedlicher Dimensionen funktioniert. (Ich bin mir nicht sicher, was eigentlich bedeutet, dass ich es nicht weiß.) Sie könnten den Inhalt jedoch mit aufteilen xstring. (Ich habe auch einPatch, der störende Leerzeichen entfernt; in späteren Versionen von pgf wird dies nicht mehr erforderlich sein.)

\documentclass{standalone}
\usepackage{forest}
\usepackage{xstring}
\makeatletter
% remove the stray space https://tex.stackexchange.com/a/513549
\patchcmd{\pgfutilsolvetwotwoleqfloat}
  { \noexpand\pgfmathfloatdivide@}
  {\noexpand\pgfmathfloatdivide@}
  {}{}
\makeatother
\begin{document}
\begin{forest}
before typesetting nodes={
    for tree={
        content/.wrap value={\StrCount{#1}{;}[\mydim]%
        \StrSubstitute{#1}{;}{,}[\mytemp]%
        \ifcase\mydim
         \pgfmathsetmacro{\myone}{{\mytemp}[0]}\myone\ is the one
        \or
         \pgfmathsetmacro{\myone}{{\mytemp}[0]}%
         \pgfmathsetmacro{\mytwo}{{\mytemp}[1]}%
         {with \myone[\mytwo]}
        \or
         \pgfmathsetmacro{\myone}{{\mytemp}[0]}%
         \pgfmathsetmacro{\mytwo}{{\mytemp}[1]}%
         \pgfmathsetmacro{\mythree}{{\mytemp}[2]}%
         {$\mytwo\geq\myone$ for \mythree\ cases}
        \fi}}}
[9;12;4
    [31;21]
    [3
        [14]
        [7;21;3]
    ]
]
\end{forest}
\end{document}

Bildbeschreibung hier eingeben

Oder eine Version, die auch mit Zeichenfolgen funktioniert.

\documentclass{standalone}
\usepackage{forest}
\usepackage{xstring}
\makeatletter
% remove the stray space https://tex.stackexchange.com/a/513549
\patchcmd{\pgfutilsolvetwotwoleqfloat}
  { \noexpand\pgfmathfloatdivide@}
  {\noexpand\pgfmathfloatdivide@}
  {}{}
\makeatother
\def\pfttwo#1;#2|{\def\myone{#1}\def\mytwo{#2}}%
\def\pftthree#1;#2;#3|{\def\myone{#1}\def\mytwo{#2}\def\mythree{#3}}%
\begin{document}
\begin{forest}
before typesetting nodes={
    for tree={
        content/.wrap value={\StrCount{#1}{;}[\mydim]%
        \ifcase\mydim
         \pgfmathsetmacro{\myone}{#1}\myone\ is the one
        \or
         \pfttwo#1|%
         {with \myone[\mytwo]}
        \or
         \pftthree#1|%
         {$\mytwo\geq\myone$ for \mythree\ cases}
        \fi}}}
[9;12;4
    [31;21]
    [3
        [14]
        [7;21;3]
    ]
]
\end{forest}
\end{document}

verwandte Informationen