如何在包 dirtree 的命令 \dirtree 中使用宏?

如何在包 dirtree 的命令 \dirtree 中使用宏?

我想打印树结构并开始使用包 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

相关内容