
나는 각 노드에 한 쌍(예: $(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'
1st
content
content=...
content
##1
content={(##1)}
content
##
autocolored math
content'
1st/.style={content'={#1}}
#1
1st
content+
옵션의 현재 값에 지정된 텍스트를 추가합니다. 음, 위의 코드에서는 실제로 자동 래핑이 아닌 버전을 사용했습니다 content+'
.
math content
마지막으로, 내가 위에 를 넣었다는 점에 주목하세요 split option
. 반면에 누군가는 그것이 뒤에 속할 것이라고 예상했을 수도 있습니다 content={(##1)}
. 이는 어디에서나(내에서) 작동할 수 있음을 보여주기 위한 것이었습니다 for tree
. 요점은 math content
옵션 가치에 content
전혀 영향을 미치지 않는다는 것입니다. 오히려 content format
이 값이 사용되는 방법을 (를 통해) 결정합니다.
마지막으로 중요한 것은 왜 delay
? 기본적으로 상위 옵션은 하위 옵션보다 먼저 처리됩니다. 여기에는 에 의한 노드의 설정 내용이 포함됩니다 [...]
. 따라서 autocolored math
루트 노드에서 발생하는 (글쎄, 원칙적으로 약간 다른 서문에서는 ...) 노드의 내용이 설정되기 전에 적용됩니다! 가 없으면 delay
분할할 항목이 없습니다.