我想打印树结构并开始使用包 dirtree(v0.32,请参阅制作(简单)目录树)。以下通话工作顺利:
\dirtree{.1 root. .2 child1. .2 child2. .3 childofchild2. }
\def\mytree{{.1 root. .2 child1. .2 child2. .3 childofchild2. }}
\expandafter\dirtree\mytree{}
\dirtree
将绘制如下树状图
root
|-- child1
|-- child2
|-- child of child2
但是如果树数据的生成使用一些更复杂的宏,就会出现问题。
\documentclass{article}
\usepackage{dirtree}
% edited to remove the use of counters
%\newcounter{qtreedepth}
%\def\nodeC#1{\addtocounter{qtreedepth}{1}#1\addtocounter{qtreedepth}{-1}}
%\renewcommand{\item}[1]{.\arabic{qtreedepth} #1. }
\def\nodeC#1{{#1}}
\newcommand{\myitem}[1]{.1 #1. }
\begin{document}
\nodeC{\myitem{root}\nodeC{\myitem{child}}}
\expandafter\dirtree{\nodeC{\myitem{root}\nodeC{\myitem{child}}}}
\end{document}
错误信息:
! Use of \next doesn't match its definition.
<argument> \myitem
{root}\nodeC {\myitem {child}}
l.11 ...nodeC{\myitem{root}\nodeC{\myitem{child}}}
扩展有问题吗?用法\expandafter
正确吗?知道哪里出了问题吗?
(与此同时,我发现了关于在 TikZ 中绘制树的页面, 使用 TikZ 中的 tree 命令绘制目录列表。值得尝试,但另一方面我想知道上述方法不起作用的原因……)
答案1
这似乎实现了您喜欢的语法:
\documentclass{article}
\usepackage{dirtree}
\newcounter{nodeCdepth}
\newenvironment{nodeC}
{\ifnum\value{nodeCdepth}=0
\gdef\listfordirtree{}%
\let\item\nodeCitem
\fi
\stepcounter{nodeCdepth}}
{\addtocounter{nodeCdepth}{-1}%
\ifnum\value{nodeCdepth}=0
\expandafter\dirtree\expandafter{\listfordirtree}%
\fi}
\newcommand{\nodeCitem}[1]{%
\xdef\listfordirtree{%
\unexpanded\expandafter{\listfordirtree}%
.\thenodeCdepth\space\unexpanded{#1}. }%
}
\begin{document}
\begin{nodeC}
\item{root}
\begin{nodeC}
\item{bin}
\begin{nodeC}
\item{home}
\end{nodeC}
\item{xu}
\end{nodeC}
\end{nodeC}
\dirtree{.1 root. .2 bin. .3 home. .2 xu. }
\end{document}
只是为了比较,我添加了通常的dirtree
语法。
我在计数器中维护深度nodeCdepth
;当深度为零时,要么我们开始(在 处\begin{nodeC}
)并将容器宏初始化为空,要么我们结束(在 处\end{nodeC}
)并将容器宏传递给\dirtree
以处理节点列表。当计数器的值大于零时,\item
会将其参数添加到容器宏中,并被 语法所需的标记包围\dirtree
。