Я хотел бы иметь возможность изменитьсодержаниеузлов, от самодельного списка параметров до реального текста.
Например, я хотел бы создать такие деревья:
\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 параметрами, формат "$#2 \geq #1$ для #3 случаев"
Пока что мне удалось разделить содержимое каждого узла с помощьювариант разделения, но мне не удалось узнать, сколько их на самом деле, и получить доступ к каждому из них.
Я ищу что-то вроде:
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: Причина, по которой я пытаюсь сделать это таким образом, заключается в том, что мне нужно создать много больших деревьев с одинаковым форматом узлов. И с точки зрения писателя гораздо проще просто выбрать параметры каждого узла и сохранить форматирование отдельно, особенно если вам придется изменить его позже.
решение1
split option
(и другие split
ключи) "сжимают" заданный список ключей "instruction" (их #3
) и список "parameter" (в случае опции, разделенное значение опции, заданное как их #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}