ÜBERARBEITETE VERSION

ÜBERARBEITETE VERSION

Ich habe eine PSTricksImplementierung eines benutzerdefinierten Verzeichnisbaums, die ich recht ansprechend finde. Ich möchte das Ganze im Grunde in konvertieren TikZ. Ich habe es geschafft, die Grundidee in zum Laufen zu bringen TikZ: Ich kann ein Verzeichnis und eine Datei erstellen. Aber ich habe keine Ahnung, wie ich sie relativ zum vorherigen Element positionieren soll. Ich kenne diedirtreePaket, aber mir gefallen die Symbole für Dateien und Verzeichnisse.

Im PSTricks-Code wird \parfür jedes neue Element (Datei oder Verzeichnis) ein neuer Absatz hinzugefügt. Darin TikZmuss ich wohl die einzelnen Knoten relativ zueinander positionieren. Dazu muss ich den letzten Knotennamen bzw. -speicherort speichern. Wie kann das gemacht werden? Oder geht das auch ganz anders?

Funktionierender PSTricks-Code

Dank an J. Stier

Code:

\documentclass{standalone}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{graphicx}
\usepackage{pstricks, pst-node, pstricks-add}

% ---------------------------
% PST-Directory-Tree
% ---------------------------

% Counter
\newcounter{leaves}
\newcounter{directories}
\newlength{\parskipnew}
\setlength{\parskipnew}{\parskip}

% Environment
\newenvironment{directory}[2][\linewidth]{%
  \setcounter{leaves}{0}%
  \addtocounter{directories}{1}%
  \edef\directoryname{D\thedirectories}%
  \begin{minipage}[t]{#1}%
\setlength{\parindent}{\linewidth}%
\addtolength{\parindent}{-\dirshrink\parindent}%
\parskip2pt%
\noindent%
\Rnode[href=-\dirshrink]{\directoryname}{%
  \parbox[t]{#1}{%
  \parbox[c]{0.65cm}{%
    \centering%
    \includegraphics[scale=0.7]{Figures/Icons/ordner}%
  }%
  \hspace{.2em}\texttt{#2}}%
}%
\par
}
{\end{minipage}\vspace{0.5\parskipnew}}

% Commands
\newcommand{\file}[2][]{%
  \addtocounter{leaves}{1}%
  \edef\leaflabel{L\theleaves\directoryname}%
  \par
  \Rnode{\leaflabel}{%
\parbox[t]{\dirshrink\linewidth}{%
  \parbox[c]{0.65cm}{%
    \centering\includegraphics[scale=0.7]{Figures/Icons/datei}%
  }%
  \hspace{.2em}\texttt{#2}\hfill#1}%
}%
  \ncangle[angleA=270,angleB=180,armB=0,nodesepA=3pt,nodesepB=2pt]{\directoryname}{\leaflabel}%
  \par%
}
% 
\newcommand{\dir}[2][]{%
  \addtocounter{leaves}{1}%
  \edef\leaflabel{L\theleaves\directoryname}%
  \par
  \Rnode{\leaflabel}{%
\parbox[t]{\dirshrink\linewidth}{%
  \parbox[c]{0.65cm}{%
    \centering%
    \includegraphics[scale=0.7]{Figures/Icons/ordner}%
  }%
  \hspace{.2em}\texttt{#2}\hfill#1%
}%
  }%
  \ncangle[angleA=270,angleB=180,armB=0,nodesepA=3pt,nodesepB=2pt]{\directoryname}{\leaflabel}%
  \par%
}
% 
\newcommand{\fother}[2][]{%
  \addtocounter{leaves}{1}%
  \edef\leaflabel{L\theleaves\directoryname}%
  \par
  \Rnode{\leaflabel}{%
\parbox[t]{\dirshrink\linewidth}{%
  \hspace{0.5em}\normalfont{\textit{#2}}\hfill#1
}%
  }%
  \ncangle[angleA=270,angleB=180,armB=0,nodesepA=3pt,nodesepB=2pt]{\directoryname}{\leaflabel}%
  \par%
}
% 
\newcommand{\dirfile}[1]{%
  \addtocounter{leaves}{1}%
  \edef\leaflabel{L\theleaves\directoryname}%
  \par
  \Rnode{\leaflabel}{%
\parbox[t]{\dirshrink\linewidth}{#1}%
  }%
  \ncangle[angleA=270,angleB=180,armB=0,nodesepA=3pt,nodesepB=2pt]{\directoryname}{\leaflabel}%
  \par%
}
%
\newcommand{\dirshrink}{0.967}
%
\newcommand{\optional}[1]{{\normalfont\mdseries$<$\hspace{0.05em}{\itshape #1}\hspace{0.15em}$>$}}

% ---------------------------
% Document
% ---------------------------

\begin{document}

\begin{pspicture}(6,12.5)
\psset{linewidth=0.5pt}
\rput[lb](0,0.5){
\begin{directory}{\optional{Project}}
\dirfile{%
  \begin{directory}{Figures}
    \file{fig-1.eps}
    \file{fig-1.pdf}
    \file{fig-1.png}
    \file{fig-2.eps}
    \file{fig-2.pdf}
    \file{fig-2.png}
  \end{directory}%
}
% %
\dirfile{%
  \begin{directory}{Scripts}
    \file{install\_package\_A.sh}
    \file{install\_package\_B.sh}
    \file{install\_package\_C.sh}
  \end{directory}
}
% %
\dirfile{%
  \begin{directory}{Sections}
    \file{section-1.tex}
    \file{section-2.tex}
    \file{section-3.tex}
    \file{literature.bib}
  \end{directory}
}
% %
\file{project.kilepr}
\file{project.tex}
% % 
\end{directory}}
\end{pspicture}

\end{document}

Ergebnis:

PSTricks-Ergebnis

Anfänglicher TikZ-Code

\documentclass{standalone}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{graphicx}
% \usepackage{pstricks, pst-node, pstricks-add}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\usetikzlibrary{fit}
\usetikzlibrary{positioning}

% ---------------------------
% PST-Directory-Tree
% ---------------------------

% Counter
\newcounter{leaves}
\newcounter{directories}
\newlength{\parskipnew}
\setlength{\parskipnew}{\parskip}

% Environment
\newenvironment{directory}[2][\linewidth]{%
  \setcounter{leaves}{0}%
  \addtocounter{directories}{1}%
  \edef\directoryname{D\thedirectories}%
  \begin{minipage}[t]{#1}%
    \setlength{\parindent}{\linewidth}%
    \addtolength{\parindent}{-\dirshrink\parindent}%
    \parskip2pt%
    \noindent%
    \node (i1\directoryname) {\includegraphics[scale=0.7]{Figures/Icons/ordner}};
    \node[right = .2em of i1\directoryname] (i2\directoryname) {\texttt{#2}};
    \begin{scope}[on background layer]
      \node[fit={(i1\directoryname) (i2\directoryname)}, fill=lightgray, inner sep=0pt] (\directoryname) {};
    \end{scope}
}
{\end{minipage}\vspace{0.5\parskipnew}}

% Commands
\newcommand{\file}[2][]{%
  \addtocounter{leaves}{1}%
  \edef\leaflabel{L\theleaves\directoryname}%
  \node[below right= 0.5ex and 0.5em of \directoryname.south](i1\leaflabel) {\includegraphics[scale=0.7]{Figures/Icons/datei}};%
  \node[right = .2em of i1\leaflabel] (i2\leaflabel) {\texttt{#2}};
  \node[fit={(i1\leaflabel) (i2\leaflabel)}, inner sep=0pt] (\leaflabel) {};
  \draw (\directoryname.south) |- (\leaflabel.west);
}
%
\newcommand{\dirshrink}{0.967}
%
\newcommand{\optional}[1]{{\normalfont\mdseries$<$\hspace{0.05em}{\itshape #1}\hspace{0.15em}$>$}}

% ---------------------------
% Document
% ---------------------------

\begin{document}

\begin{tikzpicture}(10,10)
  \begin{directory}{\optional{Project}}
    \file{fig-1.eps}
    \file{fig-2.eps}
  \end{directory}

\end{tikzpicture}

\end{document}

Benötigte Bilddateien

datei.png ordner.png

Antwort1

Mir ist gerade aufgefallen, dass Sie Bilder für die Symbole bereitgestellt haben. Naja. Hier ist eine reine TikZ-Lösung. Zumindest verwendet sieWaldwelches auf TikZ basiert. Zudem verwendet es zwei pics für die Icons, welche dann innerhalb des Baumes verwendet werden.

Dabei kommt die neue edgesBibliothek zum Einsatz fürWalddas einen Stil für Verzeichnisbäume enthält folder. Es kann auch Ordner zeichnen, aber sie sind nicht besonders ordner- oder dateiähnlich und werden daher wahrscheinlich nicht Ihren Erwartungen entsprechen. Hier wird der Stil nur verwendet, um das strukturelle Erscheinungsbild des Baums zu automatisieren.

Das istvieleinfacher mit der edgesBibliothek, da hierfür bisher die Einrichtung eines geeigneten Baumstils erforderlich war.

Laden Sie die gewünschten Pakete und Bibliotheken.

\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{forest}
\useforestlibrary{edges}
\begin{document}

Wenden Sie die Standardeinstellungen aus der edgesBibliothek an. Wenn Sie andere Baumarten zeichnen möchten, fügen Sie dies in eine TeX-Gruppe ein, um den Umfang einzuschränken.

\forestapplylibrarydefaults{edges}

Wir erstellen zwei pics für die Icons.

\tikzset{%

Für Ordnerformen: mkdir.

  mkdir/.pic={%
    \draw [pic actions] (-1.5ex,-1ex) -- ++(0,2ex) -- ++(.25ex,.25ex) -- ++(1.25ex,0) -- ++(.25ex,-.25ex) -- ++(1.25ex,0) |- cycle;
  },

Für Dateiformen: touch.

  touch/.pic={%
    \draw [pic actions] (-1ex,-1.5ex) |- ++(1.25ex,3ex) edge ++(.75ex,-.75ex) |- ++(.75ex,-.75ex) |- cycle;
  }
}

Jetzt einWald-spezifischer Stil, optionalden wir anstelle von verwenden \optional{}.

\forestset{%
  optional/.style={%
    content/.wrap value={$<$\hspace{0.05em}\normalfont\itshape ##1\hspace{0.15em}$>$},
  }
}

Nun zum eigentlichen Baum in der forestUmgebung.

\begin{forest}

Zuerst einige Anpassungen.

  for tree={

Wenden Sie diese Einstellungen auf den gesamten Baum an.

    font=\ttfamily,

Wir möchten, dass der Baum nach rechts wächst, also in einem Winkel von , 0und wir müssen die Reihenfolge der untergeordneten Elemente umkehren, sonst bleibt er verkehrt herum stehen.

    grow'=0,

Wenden Sie den Stil an, der die Typstruktur folderfestlegt .pstree

    folder,

Alle Terminalknoten sind Dateien, während alle anderen Verzeichnisse sind. Daher können wir die Symbole automatisch hinzufügen, indem wir testen, ob jeder Knoten untergeordnete Knoten hat (nicht terminal) oder nicht (terminal).

    if n children=0{

Wir müssen die Anpassung etwas verzögern, damit der ursprüngliche Inhalt erhalten bleibt. Anschließend fügen wir links etwas Platz hinzu, um Platz für das Symbol zu schaffen.

      before typesetting nodes={
        content/.wrap value={\hspace*{2.5ex}#1},
      },

Wir fügen eine TikZ-Annotation hinzu, die das picfür das Symbol an der entsprechenden Stelle zeichnet. tikzDer Wert von gibt Code an, der unverändert an TikZ übergeben wird, nachdem der Baum gezeichnet wurde, aber bevor die forestUmgebung beendet wird. Der Kontext des relevanten Knotens ist weiterhin verfügbar und wir können zB verwenden, (.west)um auf den Anker des aktuellen Knotens zuzugreifen, westum das picentsprechend zu platzieren.

      tikz={%
        \pic [xshift=1.5ex] at (.west) {touch};
      }
    }{

Nun machen wir dasselbe für die nicht-terminalen Knoten. Lediglich der Abstand und die picvariieren hier.

      before typesetting nodes={
        content/.wrap value={\hspace*{3.5ex}#1},
      },
      tikz={%
        \pic [xshift=2ex] at (.west) {mkdir};
      }
    }
  },

Nun zum Baum selbst, beginnend mit der Wurzel, optionalauf die wir den Stil anwenden möchten.

  [Project, optional

Erstes Unterverzeichnis

    [Figures

und dessen Inhalt, bei dem es sich in der Baumsprache um untergeordnete Knoten handelt.

      [fig-1.eps]
      [fig-1.pdf]
      [fig-1.png]
      [fig-2.eps]
      [fig-2.pdf]
      [fig-2.png]
    ]

Beenden Sie das erste Unterverzeichnis. Starten Sie das zweite Unterverzeichnis, das das zweite untergeordnete Element des Stammknotens des Baums ist.

    [Scripts

Und sein Inhalt sind nach wie vor Kinder.

      [install\_package\_A.sh]
      [install\_package\_B.sh]
      [install\_package\_C.sh]
    ]

Fügen Sie weitere Unterverzeichnisse und deren Inhalte hinzu.

    [Sections
      [section-1.tex]
      [section-2.tex]
      [section-3.tex]
      [literature.bib]
    ]

Die letzten beiden Einträge liegen auf der Ebene direkt unter der Wurzel, sind aber selbst Dateien, also untergeordnete Elemente der Wurzel, die ebenfalls Endknoten sind.

    [project.kilepr]
    [project.tex]

Schließen Sie die Wurzel.

  ]

Und den Baum fertigstellen.

\end{forest}
\end{document}

Verzeichnisbaum mit Wald v2

ÜBERARBEITETE VERSION

Wir möchten jedoch möglicherweise mehr Flexibilität. Beispielsweise möchten wir die Größe der Icons/Symbole für die Dateien und Verzeichnisse einfacher ändern und die Abstände zwischen dem Pfad und dem Icon einerseits und dem Icon und dem Namen andererseits steuern.

Wir können dies mit einem etwas leistungsstärkeren Satz von TikZ-Einstellungen und einigen Änderungen an derWaldCode. Der schwierigste Teil davon war für mich herauszufinden, wie man Vielfache von Dimensionen darin verwenden kann forest. Zum Beispiel, wie man etwas um das Zehnfache einer bestimmten Länge oder was auch immer verschieben soll. Schließlich habe ich dafür ein Scratch-Dimensionsregister verwendet, aber ich bin nicht sicher, ob das die effizienteste Lösung ist.

Wir beginnen wie zuvor mit einigen TikZ-Anpassungen.

\tikzset{%

Wir möchten, dass einige Makros verschiedene Dimensionen enthalten, damit sie leicht geändert werden können. Wir verwenden hierfür 4 Makros.

  • \mkdirsizefür die Basisgröße des Verzeichnissymbols (Breite = 12 x Basisgröße);
  • touchsizefür die Basisgröße des Dateisymbols (Breite = 8 x Basisgröße);
  • \iconsepfür den Abstand zwischen dem Symbol und dem Namen;
  • \iconsepfrompathfür den Abstand zwischen dem Pfad und dem Symbol.

Diese können als TikZ-Stile geändert werden.

  • mkdir size;
  • touch size;
  • icon sep;
  • icon sep from path.

Hier ist die Konfiguration:

  mkdir size/.store in=\mkdirsize,
  touch size/.store in=\touchsize,
  icon sep/.store in=\iconsep,
  icon sep from path/.store in=\iconsepfrompath,

Wir stellen sicher, dass alles einen Standardwert hat.

  mkdir size=.25ex,
  touch size=.25ex,
  icon sep=1.5ex,
  icon sep from path=1ex,

Jetzt möchten wir, dass unsere s auf den Werten von und picbasieren .mkdir sizetouch size

Außerdem haben wir den äußersten linken Punkt jedes Symbols auf gesetzt, picanstatt x=0ihn nach links zu verschieben, da sich die Position der Symbole im Baum so leichter richtig anpassen lässt.

  mkdir/.pic={%
    \draw [pic actions] (0,-4*\mkdirsize) -- ++(0,8*\mkdirsize) -- ++(\mkdirsize,\mkdirsize) -- ++(5*\mkdirsize,0) -- ++(\mkdirsize,-\mkdirsize) -- ++(5*\mkdirsize,0) |- cycle;
  },
  touch/.pic={%
    \draw [pic actions] (0,-6*\touchsize) |- ++(5*\touchsize,12*\touchsize) edge ++(3*\touchsize,-3*\touchsize) |- ++(3*\touchsize,-3*\touchsize) |- cycle;
  },
}

Wir möchten auch die Präambel des Baums anpassen, um die Werte von icon sepund zu verwenden icon sep from path.

\begin{forest}

Wir beginnen jedoch wie zuvor.

  for tree={
    font=\ttfamily,
    grow'=0,
    folder,

Die Änderungen bestehen darin, anzugeben, wo die Knoten sein sollen und welcher Platz vor dem Inhalt des Hauptknotens eingefügt werden soll. Mit diesem Teil hatte ich Probleme. Das funktioniert, ist aber möglicherweise nicht die effektivste oder effizienteste Lösung.

    if n children=0{
      before typesetting nodes={

Wir verwenden eine Scratch-Register-Dimension, um zu berechnen, wie viel Speicherplatz dem Knoteninhalt hinzugefügt werden muss.

        tempdima=\iconsepfrompath+\iconsep+8*\touchsize,
        content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
      },

Wir müssen es dann auch picum den entsprechenden Betrag nach rechts verschieben.

      tikz={%
        \pic [xshift=\iconsepfrompath] at (.west) {touch};
      },
    }{

Bei den Verzeichnisknoten gibt es eine Komplikation, da einer davon die Wurzel ist und dieser picnicht hierher verschoben werden sollte und dem Inhalt des Knotens weniger Platz hinzugefügt werden sollte. Daher behandeln wir diesen Fall separat.

      if level=0{

Das Verzeichnissymbol darf nicht verschoben werden.

        tikz={%
          \pic at (.west) {mkdir};
        },

Fügen Sie dem Knoten den Leerraum hinzu, aber nicht den Wert, icon sep from pathda dieser für das Stammverzeichnis irrelevant ist.

        before typesetting nodes={
          tempdima=\iconsep+12*\mkdirsize,
          content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
        },

Nun zu den Nicht-Stammverzeichnissen.

      }{
        tikz={%
          \pic [xshift=\iconsepfrompath] at (.west) {mkdir};
        },
        before typesetting nodes={
          tempdima=\iconsepfrompath+\iconsep+12*\mkdirsize,
          content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
        },
      },
    },
  },

überarbeiteter Verzeichnisbaum mit **forest** <code>edges</code>-Bibliothek

Vollständiger Code:

\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{forest}
\useforestlibrary{edges}
\begin{document}
\forestapplylibrarydefaults{edges}
\tikzset{%
  mkdir/.pic={%
    \draw [pic actions] (0,-4*\mkdirsize) -- ++(0,8*\mkdirsize) -- ++(\mkdirsize,\mkdirsize) -- ++(5*\mkdirsize,0) -- ++(\mkdirsize,-\mkdirsize) -- ++(5*\mkdirsize,0) |- cycle;
  },
  touch/.pic={%
    \draw [pic actions] (0,-6*\touchsize) |- ++(5*\touchsize,12*\touchsize) edge ++(3*\touchsize,-3*\touchsize) |- ++(3*\touchsize,-3*\touchsize) |- cycle;
  },
  mkdir size/.store in=\mkdirsize,
  touch size/.store in=\touchsize,
  icon sep/.store in=\iconsep,
  icon sep from path/.store in=\iconsepfrompath,
  mkdir size=.25ex,
  touch size=.25ex,
  icon sep=1.5ex,
  icon sep from path=1ex,
}
\forestset{%
  optional/.style={%
    content/.wrap value={$<$\hspace{0.05em}\normalfont\itshape ##1\hspace{0.15em}$>$},
  },
}
\begin{forest}
  for tree={
    font=\ttfamily,
    grow'=0,
    folder,
    if n children=0{
      before typesetting nodes={
        tempdima=\iconsepfrompath+\iconsep+8*\touchsize,
        content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
      },
      tikz={%
        \pic [xshift=\iconsepfrompath] at (.west) {touch};
      },
    }{
      if level=0{
        tikz={%
          \pic at (.west) {mkdir};
        },
        before typesetting nodes={
          tempdima=\iconsep+12*\mkdirsize,
          content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
        },
      }{
        tikz={%
          \pic [xshift=\iconsepfrompath] at (.west) {mkdir};
        },
        before typesetting nodes={
          tempdima=\iconsepfrompath+\iconsep+12*\mkdirsize,
          content/.wrap value={\expandafter\hskip \foresteregister{tempdima}#1},
        },
      },
    },
  },
  [Project, optional
    [Figures
      [fig-1.eps]
      [fig-1.pdf]
      [fig-1.png]
      [fig-2.eps]
      [fig-2.pdf]
      [fig-2.png]
    ]
    [Scripts
      [install\_package\_A.sh]
      [install\_package\_B.sh]
      [install\_package\_C.sh]
    ]
    [Sections
      [section-1.tex]
      [section-2.tex]
      [section-3.tex]
      [literature.bib]
    ]
    [project.kilepr]
    [project.tex]
  ]
\end{forest}
\end{document}

Antwort2

Das beantwortet Ihre Frage zwar nicht wirklich, aber ich finde, dass es ein nützliches Layout ist, das man leicht pflegen und bearbeiten kann. Es ermöglicht auch eine nicht standardmäßige Struktur. Ich habe noch nicht herausgefunden, wie man Dateisymbole einbindet. Es funktioniert auch am besten, wenn Sie die Spalten der Registerkartensteuerung einigermaßen gut ausgerichtet halten.

\documentclass{standalone}

\usepackage{menukeys}

\newmenumacro{\nixfile}[/]{hyphenatepaths}
\newmenumacro{\nixpath}[/]{hyphenatepathswithfolder}
\newmenumacro{\winpath}[bslash]{hyphenatepathswithfolder}
\newmenumacro{\winfile}[bslash]{hyphenatepaths}

\begin{document}
\begin{minipage}{\textwidth}
\begin{tabbing}
\hspace{1em}\=\hspace{1em}\=\hspace{1em}\=\hspace{12em}\=\\\kill
\nixpath{root/path } \>\>\>\>  Main Root                                 \+\\
\nixpath{subfolder }   \>\>\>  Specialized subfolder                     \+\\
\nixfile{subfile   }     \>\>  Some file                                 \-\\
\nixfile{wierd/file}   \>\>\>  Important subfile, unimportant subfolders   \\
\nixfile{file      }   \>\>\>  Main file                                   \\
\end{tabbing}
\end{minipage}
\end{document}

Typische Ausgabe mit nicht standardmäßigen Baumelementen

verwandte Informationen