\forestset 매크로를 사용하여 각 노드에서 수학 모드를 자동으로 켜고 모든 쌍의 두 번째 구성 요소에 색상을 지정하시겠습니까?

\forestset 매크로를 사용하여 각 노드에서 수학 모드를 자동으로 켜고 모든 쌍의 두 번째 구성 요소에 색상을 지정하시겠습니까?

나는 각 노드에 한 쌍(예: $(8,16)$ 또는 $(S_2,M_2)$)을 입력하고 두 번째 구성 요소는 빨간색으로 표시되는 이진 트리를 생성하고 싶습니다. 매크로 를 어떻게 사용하나요 \forestset?산림 패키지) 이를 자동으로 수행하여 트리를 작성할 때 ? {{S_2}{M_2}}}대신 노드(또는 이와 유사한 것) 에 쓸 수 있도록 합니다 . {$(S_2,{\color{red} M_2})$ }특히, $...$매번 작성할 필요 없이 각 노드의 내용이 자동으로 수학 모드가 되도록 하려면 어떻게 해야 합니까?

매크로가 이를 지정하는 경우 더 좋습니다.만약에3개의 인수를 입력하고 세 번째 인수는 파란색으로 표시되므로 {{S_2}{M_2}{A_2}}대신에 eg (또는 이와 유사한)를 쓸 수 있습니다.{$(S_2,{\red M_2},{\color{blue} A_2})$ }

답변1

수학 모드에서 노드를 조판하려면 math content다음과 같이 key 를 사용하십시오.

\documentclass{article}
\usepackage{forest}

\begin{document}
\begin{forest}
  [2^{42}, math content
    [A]
    [A, math content]
  ]
\end{forest}
\end{document}

실제로 math content는 의 래퍼일 뿐입니다 content format. \ensuremath조판할 때 내용 주위에 배치합니다 . 하지만 어떤 방식으로든 콘텐츠를 변경하지 않고 꾸미는 데 사용할 수 있습니다.

\documentclass{article}
\usepackage{forest}

\forestset{
  quote/.style={
    content format={``\forestoption{content}''}
  },
  bold/.style={
    content format={\noexpand\textbf{\forestoption{content}}}
  },      
}

\begin{document}
\begin{forest}
  [A
    [B, quote]
    [C, bold]
  ]
\end{forest}
\end{document}

가지다모두트리의 노드는 수학 모드에서 자동으로 조판되며 math content공간 전파자 내부에서 사용됩니다 for tree. for tree실제로 주어진 옵션을 모든 노드에 적용하기 때문에 실제로는 약간 잘못된 이름입니다.보결트리, 하지만 아 뭐... 아래와 같이 루트 노드나 트리 프리앰블에서 사용된다면 이름 그대로입니다.

\documentclass{article}
\usepackage{forest}

\begin{document}
\begin{forest}
  for tree={math content}
  [S_1
    [S_2]
    [S_3]
  ]
\end{forest}
\end{document}

콘텐츠의 다양한 부분에서 다양한 일이 발생하도록 만드는 것은 좀 더 복잡하지만 Forest는 해당 작업을 수행할 수 있는 장비를 갖추고 있습니다. 키 계열 split은 일부 텍스트를 가져와 지정된 구분 기호로 분할한 다음 각 부분에 (아마도 다른) 키를 적용합니다. 잠시 후에 이에 대해 설명하겠지만 먼저 가족 구성원을 나열하겠습니다. split주어진 텍스트에 적용됩니다. split option일부 (숲) 옵션에서 텍스트를 가져옵니다. split register일부 (숲) 레지스터에서 텍스트를 가져옵니다 . 아래에서는 를 사용 split option하고 옵션에 대해 작동합니다 content. 여기서 노드 내용(대괄호 사이의 첫 번째 쉼표까지의 내용)이 저장됩니다.

이제 더 이상 고민하지 않고 OP 문제에 대한 솔루션을 살펴보겠습니다.

\documentclass{article}
\usepackage{forest}

\forestset{
  1st/.style={content'={#1}},
  2nd/.style={content+'={,{\color{red}#1}}},
  rest/.style={content+'={,{\color{blue}#1}}},
  autocolored math/.style={
    delay={
      for tree={
        math content,
        split option={content}{;}{1st,2nd,rest},
        content={(##1)},
      }
    }
  }
}

\begin{document}
\begin{forest} autocolored math
  [S_1;M_1
    [S_2;M_2]
    [S_3;M_3;A_3
      [S_4;M_4;A_4]
      [S_5;M_5;A_5;B_5]
    ]
  ]
\end{forest}
\end{document}

스타일 의 핵심 autocolored math은 물론 split option. 옵션(첫 번째 인수)에서 텍스트를 가져와서 (두 번째 인수) content발생 시 분할합니다 . ;여태까지는 그런대로 잘됐다. 세 번째 주장은 어떻습니까 1st,2nd,rest?

세 번째 인수에는 일부 스타일 이름이 나열됩니다. 첫 번째 스타일( 1st)은 내용의 첫 번째 부분을 인수( , 등)로 가져 S_1옵니다 S_2. 두 번째 스타일( 2nd)은 내용의 첫 번째 부분을 인수( , 등)로 가져 M_1옵니다 M_2. 세 번째 스타일( rest)은 ... 하지만 잠깐만요, 세 번째 인수가 없다는 게 뭐죠? 문제 없습니다. 이러한 경우(트리의 1과 2) rest는 호출되지 않습니다. 그리고 이름에서 rest알 수 있듯이 3개 이상의 인수가 있을 수 있으며 각 추가 인수(트리에서는 5개)에 대해 마지막 스타일이 호출됩니다. (그런데 스타일 이름은 분명히 무엇이든 될 수 있습니다.)

(의 정의에서 ) 에 대한 단어 content(아래 참조 split option) 대 . 열쇠 는 조금 특별합니다. 옵션 값을 "자동 래핑"합니다 . 즉, in은 옵션의 현재 값을 나타냅니다 (그리고 그 주위에 괄호를 넣습니다). ( 우리가 의 정의 내에 있기 때문에 두 배로 된 것이 있습니다 .)는 "정상적으로" 동작하므로 in 은 인수 를 참조합니다 (우리의 경우 이는 분할 표현식의 첫 번째 부분이 됩니다).content'1stcontentcontent=...content##1content={(##1)}content##autocolored mathcontent'1st/.style={content'={#1}}#11st

content+옵션의 현재 값에 지정된 텍스트를 추가합니다. 음, 위의 코드에서는 실제로 자동 래핑이 아닌 버전을 사용했습니다 content+'.

math content마지막으로, 내가 위에 를 넣었다는 점에 주목하세요 split option. 반면에 누군가는 그것이 뒤에 속할 것이라고 예상했을 수도 있습니다 content={(##1)}. 이는 어디에서나(내에서) 작동할 수 있음을 보여주기 위한 것이었습니다 for tree. 요점은 math content옵션 가치에 content전혀 영향을 미치지 않는다는 것입니다. 오히려 content format이 값이 사용되는 방법을 (를 통해) 결정합니다.

마지막으로 중요한 것은 왜 delay? 기본적으로 상위 옵션은 하위 옵션보다 먼저 처리됩니다. 여기에는 에 의한 노드의 설정 내용이 포함됩니다 [...]. 따라서 autocolored math루트 노드에서 발생하는 (글쎄, 원칙적으로 약간 다른 서문에서는 ...) 노드의 내용이 설정되기 전에 적용됩니다! 가 없으면 delay분할할 항목이 없습니다.

관련 정보