
Quiero crear un árbol genealógico grande usando genealogytree
el paquete y decidí almacenar los datos de las personas en un archivo separado.prueba_base de datos.tex(que contiene tres personas para un MWE). Desde el archivo principal test.tex
, creo un nuevo formato para genealogytree
: xTestFormat
usando las claves que se completaron en 'test_database.tex'.
Leí la sección del manual de pgf \pgfkeys
y entiendo cómo verificar si la clave existe antes de usarla en general, pero no en mi caso. Del MWE: como no sé de antemano que la base de datos contiene datos de 'Tom Water', no sé cómo comprobar que comment
existe la clave para 'Tom Walter'. Entonces, cuando intento usar la clave, aparece el mensaje de error: Undefined control sequence. }
.
¿Cómo comprobar que una pgfkey no está vacía cuando no sabemos su nombre de antemano?
MWE
(Elimine el comentario de la antepenúltima línea enprueba_base de datos.texpara que el archivo se compile ( comment = {There is nothing to say}
).)
prueba.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}
prueba_base de datos.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}
}
}
Respuesta1
Dado que el error es, Undefined control sequence. \gtrDBcomment
puede probar si esa entrada de base de datos existe probando si \gtrDBcomment
está definida, por ejemplo, con \ifdefined
.
En caso de que no lo sepas, cuando TeX encuentra una secuencia de control no definida, arroja el error y muestra una línea de contexto, en esa línea la secuencia de control que no estaba definida será la última. En su caso, TeX muestra:
Undefined control sequence.
\gtrPrintComment ... {0pt}{\itshape \gtrDBcomment
}
La última secuencia de control de la primera línea es \gtrDBcomment
, y esa fue de hecho la secuencia de control que TeX intentó expandir aunque no estaba definida.
Entonces, si cambias la definición de \PrintPeople
para probar si esa macro está definida, deberías estar bien:
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\ifdefined\gtrDBcomment
\gtrPrintComment
\fi
}
MWE completo:
\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}