制作文件夹和文件的目录树

制作文件夹和文件的目录树

如何绘制如下所示的目录树图像,表示文件夹和文件

在此处输入图片描述

为了绘制文件夹树,我使用了以下代码制作(简单)目录树,但没有明显的选项来包含文件,因此我在 Inkscape 中编辑了图像,如红色所示。

来自 Gonzalo Medina 帖子的复制代码(制作(简单)目录树)如下所示

    \documentclass[border=5pt]{standalone}
    \usepackage{forest}

    \definecolor{folderbg}{RGB}{124,166,198}
    \definecolor{folderborder}{RGB}{110,144,169}

    \def\Size{4pt}
    \tikzset{
      folder/.pic={
        \filldraw[draw=folderborder,top color=folderbg!50,bottom color=folderbg]
          (-1.05*\Size,0.2\Size+5pt) rectangle ++(.75*\Size,-0.2\Size-5pt);  
        \filldraw[draw=folderborder,top color=folderbg!50,bottom color=folderbg]
          (-1.15*\Size,-\Size) rectangle (1.15*\Size,\Size);
      }
    }

    \begin{document}

    \begin{forest}
      for tree={
        font=\ttfamily,
        grow'=0,
        child anchor=west,
        parent anchor=south,
        anchor=west,
        calign=first,
        inner xsep=7pt,
        edge path={
          \noexpand\path [draw, \forestoption{edge}]
          (!u.south west) +(7.5pt,0) |- (.child anchor) pic {folder} \forestoption{edge label};
        },
        before typesetting nodes={
          if n=1
            {insert before={[,phantom]}}
            {}
        },
        fit=band,
        before computing xy={l=15pt},
      }  
    [system
      [config
      ]
      [lib
        [Access
        ]
        [Plugin
        ]
      ]
      [templates
      ]
      [tests
      ]
    ]
    \end{forest}

    \end{document}

答案1

您可以style像这样为您的文件节点创建一个

file/.style={edge path={\noexpand\path [draw, \forestoption{edge}]
          (!u.south west) +(7.5pt,0) |- (.child anchor) \forestoption{edge label};},
         inner xsep=2pt,font=\small\ttfamily
            }

代码

\documentclass[border=5pt]{standalone}
\usepackage{forest}

\definecolor{folderbg}{RGB}{124,166,198}
\definecolor{folderborder}{RGB}{110,144,169}

\def\Size{4pt}
\tikzset{
      folder/.pic={
        \filldraw[draw=folderborder,top color=folderbg!50,bottom color=folderbg]
          (-1.05*\Size,0.2\Size+5pt) rectangle ++(.75*\Size,-0.2\Size-5pt);  
        \filldraw[draw=folderborder,top color=folderbg!50,bottom color=folderbg]
          (-1.15*\Size,-\Size) rectangle (1.15*\Size,\Size);
      }
    }


 \begin{document}

 \begin{forest}
      for tree={
        font=\ttfamily,
        grow'=0,
        child anchor=west,
        parent anchor=south,
        anchor=west,
        calign=first,
        inner xsep=7pt,
        edge path={
          \noexpand\path [draw, \forestoption{edge}]
          (!u.south west) +(7.5pt,0) |- (.child anchor) pic {folder} \forestoption{edge label};
        },
        % style for your file node 
        file/.style={edge path={\noexpand\path [draw, \forestoption{edge}]
          (!u.south west) +(7.5pt,0) |- (.child anchor) \forestoption{edge label};},
          inner xsep=2pt,font=\small\ttfamily
                     },
        before typesetting nodes={
          if n=1
            {insert before={[,phantom]}}
            {}
        },
        fit=band,
        before computing xy={l=15pt},
      }  
    [system
      [config
      ]
      [lib
        [Access
        ]
        [Plugin
        ]
        [file.txt,file
        ]
      ]
      [templates
      ]
      [tests
      ]
    ]
 \end{forest}

 \end{document}

在此处输入图片描述

答案2

这个答案有两个主要目的。

  1. 通过更新来简化现有代码,以利用当前 Forest 提供的设施,尤其是提供edgesfolder选项的库提供的设施。

  2. 创建一张file图片来匹配现有的folder图片,并启用样式以便在它们之间轻松切换。

此外,它还有次要用途。

  1. pic如果需要,提供一个可扩展的界面来添加更多图标。

什么时候贡萨洛·梅迪纳发布该代码后,Forest 没有提供支持这种结构的简单开箱即用的解决方案。这就是为什么我编写了诸如dir treeGonzalo Medina 引用的答案以响应对此类图表的请求。

从那时起,我们就有了经过广泛更新和扩展的 Forest,并开始通过库来扩展系统。其中一个已经提供的库edges,也许令人惊讶的是,它只支持这种树。

我不建议使用旧方法,除非你被困在 Forest 1 中而无法更新。更新的 Forest 对这种树的支持更加灵活、简单且更强大。


首先,我们pic为文件图标添加一个。

  file/.pic={%
    \filldraw [draw=folderborder, top color=folderbg!5, bottom color=folderbg!10] (-\Size,.4*\Size+5pt) coordinate (a) |- (\Size,-1.2*\Size) coordinate (b) -- ++(0,1.6*\Size) coordinate (c) -- ++(-5pt,5pt) coordinate (d) -- cycle (d) |- (c) ;
  },

这将选取基本文件夹颜色。显然,您可以根据需要将其更改为使用不同的颜色。

现在进行一些 Forest 配置。

\forestset{%
  declare autowrapped toks={pic me}{},

这是一个保存每个节点所需值的选项。最终,它将采用诸如 之类的值pic {file}。默认情况下,它是空的。

我们为这种树定义了一种风格pic dir tree

  pic dir tree/.style={%
    for tree={%
      folder,
      font=\ttfamily,
      grow'=0,
    },

树的默认值:folder与 无关。相反,它是 Forest库为目录样式树提供的pic样式的名称。edges

我们将pic me在解析树时收集设置。然后,我们将edge path通过将选项附加到 的值来将它们添加到edge label

    before typesetting nodes={%
      for tree={%
        edge label+/.option={pic me},
      },
    },
  },

folder这样就避免了使用树的样式来设置非默认路径的问题。

现在,对于方便的包装器。pic me set需要 2 个参数。第一个是要创建的 Forest 样式的名称。第二个是pic诸如folder(在图标意义上)或的名称file

  pic me set/.code n args=2{%
    \forestset{%
      #1/.style={%
        inner xsep=2\Size,
        pic me={pic {#2}},
      }
    }
  },

如此定义的每个样式都会做两件事。首先,它将节点的设置inner xsep为一个值,该值不是硬编码的,而是依赖于\Size。其次,它将节点的pic me选项设置为相关值。

目前我们只创建 2 种这样的样式。

  pic me set={directory}{folder},

第一个是directory。这将添加folder图标。(我们使用directory而不是folder以避免进一步混淆。)

  pic me set={file}{file},

第二个是file。这里没有什么复杂的,所以我们可以使用图标的名称file

如果有合适的样式,可以用同样的方式创建更多样式pic

}

现在要排版这种类型的树,我们可以在树的序言中使用以下内容。

\begin{forest}
  pic dir tree,

这将使用上面描述的选项来设置树。

  where level=0{}{% folder icons by default; override using file for file icons
    directory,
  },

在我们的例子中,我们将所有非根节点设置directory为默认使用该样式,因为它们大多数都需要文件夹图标。

然后我们可以写

      [file.txt, file
      ]

覆盖样式并使用文件图标来表示单个异常。

当前 Forest 中的文件夹和文件

完整代码:

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[edges]{forest}
\definecolor{folderbg}{RGB}{124,166,198}
\definecolor{folderborder}{RGB}{110,144,169}
\newlength\Size
\setlength\Size{4pt}
\tikzset{%
  folder/.pic={%
    \filldraw [draw=folderborder, top color=folderbg!50, bottom color=folderbg] (-1.05*\Size,0.2\Size+5pt) rectangle ++(.75*\Size,-0.2\Size-5pt);
    \filldraw [draw=folderborder, top color=folderbg!50, bottom color=folderbg] (-1.15*\Size,-\Size) rectangle (1.15*\Size,\Size);
  },
  file/.pic={%
    \filldraw [draw=folderborder, top color=folderbg!5, bottom color=folderbg!10] (-\Size,.4*\Size+5pt) coordinate (a) |- (\Size,-1.2*\Size) coordinate (b) -- ++(0,1.6*\Size) coordinate (c) -- ++(-5pt,5pt) coordinate (d) -- cycle (d) |- (c) ;
  },
}
\forestset{%
  declare autowrapped toks={pic me}{},
  pic dir tree/.style={%
    for tree={%
      folder,
      font=\ttfamily,
      grow'=0,
    },
    before typesetting nodes={%
      for tree={%
        edge label+/.option={pic me},
      },
    },
  },
  pic me set/.code n args=2{%
    \forestset{%
      #1/.style={%
        inner xsep=2\Size,
        pic me={pic {#2}},
      }
    }
  },
  pic me set={directory}{folder},
  pic me set={file}{file},
}
\begin{document}

\begin{forest}
  pic dir tree,
  where level=0{}{% folder icons by default; override using file for file icons
    directory,
  },
  [system
    [config
    ]
    [lib
      [Access
      ]
      [Plugin
      ]
      [file.txt, file
      ]
    ]
    [templates
    ]
    [tests
    ]
  ]
\end{forest}
\end{document}

https://tex.stackexchange.com/a/405253/如果您想要根节点的文件夹图标。

相关内容