매개변수에 따라 노드의 내용 형식 지정

매개변수에 따라 노드의 내용 형식 지정

나는콘텐츠집에서 만든 매개변수 목록에서 실제 텍스트까지 노드의

예를 들어 다음과 같은 트리를 만들고 싶습니다.

\documentclass{standalone}
\usepackage{forest}

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

여기에 이미지 설명을 입력하세요

다음과 같이 형식이 지정됩니다.

여기에 이미지 설명을 입력하세요

기본적으로 세미열로 구분된 매개변수 수에 따라 최종 콘텐츠의 형식을 다르게 지정하고 싶습니다.

  • 매개변수가 1개인 경우 형식은 "#1이 하나입니다"입니다.
  • 매개변수가 2개인 경우 형식은 "#1[#2] 포함"입니다.
  • 3개의 매개변수를 사용하는 경우 형식은 "#3개 경우의 경우 $#2 \geq #1$"입니다.

지금까지 각 노드의 콘텐츠를 다음과 같이 분할했습니다.분할 옵션, 그러나 실제로 얼마나 많은 것을 가지고 있는지 파악하고 각각에 액세스하는 데 성공하지 못했습니다.

내가 찾고 있는 것은 다음과 같습니다.

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}
               {}
            }
        }  
    }
}

추신: 제가 그렇게 하려는 이유는 동일한 노드 형식으로 많은 큰 트리를 만들어야 하기 때문입니다. 그리고 작성자의 관점에서는 각 노드의 매개변수를 선택하고 서식을 별도로 유지하는 것이 훨씬 쉽습니다. 특히 나중에 변경해야 하는 경우에는 더욱 그렇습니다.

답변1

split option(및 기타 split키) 주어진 "명령" 키 목록(자신의 #3)과 "매개변수" 목록(옵션의 경우 옵션의 분할 값은 자신의 #1)을 "압축"합니다. 따라서 옵션의 일부는 다른 키로 처리될 수 있습니다.

\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}

답변2

split option다른 차원의 목록에서 작동하는지 잘 모르겠습니다 . (정말 모르겠다는 것은 내가 모른다는 뜻입니다.) 그러나 내용을 다음과 같이 나눌 수도 있습니다.xstring . (저도 추가했어요가짜 공백을 제거하는 패치; 이후 버전의 pgf에서는 더 이상 필요하지 않습니다.)

\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}

여기에 이미지 설명을 입력하세요

또는 문자열과 함께 작동하는 버전도 있습니다.

\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}

관련 정보