나는콘텐츠집에서 만든 매개변수 목록에서 실제 텍스트까지 노드의
예를 들어 다음과 같은 트리를 만들고 싶습니다.
\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}