
Ich möchte einen großen Stammbaum mit genealogytree
Paket erstellen und habe beschlossen, Personendaten in einer separaten Datei zu speicherntest_datenbank.tex(enthält drei Personen für eine MWE). Aus der Hauptdatei test.tex
erstelle ich ein neues Format für genealogytree
: xTestFormat
unter Verwendung der Schlüssel, die in „test_database.tex“ eingetragen wurden.
Ich habe den Abschnitt im PGF-Handbuch gelesen \pgfkeys
und verstehe, wie man im Allgemeinen prüft, ob der Schlüssel vorhanden ist, bevor man ihn verwendet, aber nicht in meinem Fall. Aus dem MWE: Da ich nicht im Voraus weiß, dass die Datenbank „Tom Water“-Daten enthält, weiß ich nicht, wie ich prüfen kann, ob der Schlüssel comment
für „Tom Walter“ vorhanden ist. Wenn ich also versuche, den Schlüssel zu verwenden, erhalte ich die Fehlermeldung: Undefined control sequence. }
.
Wie kann überprüft werden, dass ein pgf-Schlüssel nicht leer ist, wenn wir seinen Namen nicht im Voraus kennen?
MWE
(Entfernen Sie die Kommentarzeichen aus der drittletzten Zeile intest_datenbank.texfür die zu kompilierende Datei ( comment = {There is nothing to say}
).)
test.tex
\documentclass{standalone}
\usepackage[all]{genealogytree}
\begin{document}
% Define new keys in genealogytree database
\pgfkeys{/gtr/database/.cd,
nationality/.store in=\nationality,
given name/.store in=\givenname,
family name/.store in=\familyname
}
% Define new command with information to print
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\gtrPrintComment
}
% Define new format for genealogytree
\gtrDeclareDatabaseFormat{xTestFormat}
{% Define tcolorbox parameters based on 'nationality' key
\tcbset{french/.style={colback=blue!5!white,colframe=blue}}
\tcbset{british/.style={colback=red!5!white,colframe=red}}
}
{\PrintPeople}
\input{test_database}
\begin{tikzpicture}
\genealogytree[
timeflow=down,
processing=database,
database format=xTestFormat,
box={\nationality}
]
{child[id=fam_Water]{
p[id=Justine]{persdata=JustineID}
g[id=Tom]{persdata=TomID}
c[id=Jane]{persdata=JaneID}
}
}
\end{tikzpicture}
\end{document}
test_datenbank.tex
% Create database
% Jane Water
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/JaneID/.style={
female,
nationality = british,
given name = Jane,
family name = Water,
comment = {Something else}
}
}
% Justine Random
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/JustineID/.style={
female,
nationality = french,
given name = Justine,
family name = Random,
comment = {Something interesting}
}
}
% Tom Water
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/TomID/.style={
male,
nationality = british,
given name = Tom,
family name = Water,
% comment = {There is nothing to say}
}
}
Antwort1
Da der Fehler lautet, Undefined control sequence. \gtrDBcomment
können Sie einfach testen, ob dieser DB-Eintrag vorhanden ist, indem Sie testen \gtrDBcomment
, ob beispielsweise mit definiert ist \ifdefined
.
Falls Sie es nicht wussten: Wenn TeX auf eine nicht definierte Steuersequenz stößt, gibt es den Fehler aus und zeigt eine Kontextzeile an. In dieser Zeile ist die letzte Steuersequenz, die nicht definiert wurde. In Ihrem Fall zeigt TeX Folgendes an:
Undefined control sequence.
\gtrPrintComment ... {0pt}{\itshape \gtrDBcomment
}
Die letzte Steuersequenz der ersten Zeile ist \gtrDBcomment
, und das war tatsächlich die Steuersequenz, die TeX zu erweitern versuchte, obwohl sie nicht definiert war.
Wenn Sie also die Definition ändern, um \PrintPeople
zu testen, ob dieses Makro definiert ist, sollte alles in Ordnung sein:
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\ifdefined\gtrDBcomment
\gtrPrintComment
\fi
}
Komplettes MWE:
\documentclass{standalone}
\usepackage[all]{genealogytree}
\begin{document}
% Define new keys in genealogytree database
\pgfkeys{/gtr/database/.cd,
nationality/.store in=\nationality,
given name/.store in=\givenname,
family name/.store in=\familyname
}
% Define new command with information to print
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\ifdefined\gtrDBcomment
\gtrPrintComment
\fi
}
% Define new format for genealogytree
\gtrDeclareDatabaseFormat{xTestFormat}
{% Define tcolorbox parameters based on 'nationality' key
\tcbset{french/.style={colback=blue!5!white,colframe=blue}}
\tcbset{british/.style={colback=red!5!white,colframe=red}}
}
{\PrintPeople}
% Contents of the database
% Jane Water
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/JaneID/.style={
female,
nationality = british,
given name = Jane,
family name = Water,
comment = {Something else}
}
}
% Justine Random
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/JustineID/.style={
female,
nationality = french,
given name = Justine,
family name = Random,
comment = {Something interesting}
}
}
% Tom Water
\pgfkeys{/gtr/database/.cd,
persdata/.is choice,
persdata/TomID/.style={
male,
nationality = british,
given name = Tom,
family name = Water,
% comment = {There is nothing to say}
}
}
% End of database
\begin{tikzpicture}
\genealogytree[
timeflow=down,
processing=database,
database format=xTestFormat,
box={\nationality}
]
{child[id=fam_Water]{
p[id=Justine]{persdata=JustineID}
g[id=Tom]{persdata=TomID}
c[id=Jane]{persdata=JaneID}
}
}
\end{tikzpicture}
\end{document}