Ich habe eine PSTricks
Implementierung 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 diedirtree
Paket, aber mir gefallen die Symbole für Dateien und Verzeichnisse.
Im PSTricks-Code wird \par
für jedes neue Element (Datei oder Verzeichnis) ein neuer Absatz hinzugefügt. Darin TikZ
muss 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:
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
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 pic
s für die Icons, welche dann innerhalb des Baumes verwendet werden.
Dabei kommt die neue edges
Bibliothek 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 edges
Bibliothek, 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 edges
Bibliothek 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 pic
s 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, optional
den 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 forest
Umgebung.
\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 , 0
und 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 folder
festlegt .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 pic
für das Symbol an der entsprechenden Stelle zeichnet. tikz
Der Wert von gibt Code an, der unverändert an TikZ übergeben wird, nachdem der Baum gezeichnet wurde, aber bevor die forest
Umgebung 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, west
um das pic
entsprechend 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 pic
variieren 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, optional
auf 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}
Ü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.
\mkdirsize
für die Basisgröße des Verzeichnissymbols (Breite = 12 x Basisgröße);touchsize
für die Basisgröße des Dateisymbols (Breite = 8 x Basisgröße);\iconsep
für den Abstand zwischen dem Symbol und dem Namen;\iconsepfrompath
fü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 pic
basieren .mkdir size
touch size
Außerdem haben wir den äußersten linken Punkt jedes Symbols auf gesetzt, pic
anstatt x=0
ihn 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 sep
und 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 pic
um 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 pic
nicht 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 path
da 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},
},
},
},
},
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}