
Quero criar uma grande árvore genealógica usando genealogytree
o pacote e decidi armazenar os dados das pessoas em um arquivo separadotest_database.tex(contendo três pessoas para um MWE). A partir do arquivo principal test.tex
, crio um novo formato para genealogytree
: xTestFormat
usando as chaves que foram preenchidas em 'test_database.tex'.
Eu li a seção do manual do pgf \pgfkeys
e entendo como verificar se a chave existe antes de usá-la em geral, mas não no meu caso. Do MWE: como não sei antecipadamente se o banco de dados contém dados de 'Tom Water', não sei como verificar se comment
existe a chave para 'Tom Walter'. Então, quando tento usar a chave, recebo a mensagem de erro: Undefined control sequence. }
.
Como verificar se uma pgfkey não está vazia quando não sabemos antecipadamente o seu nome?
MWE
(Remova o comentário da penúltima linha emtest_database.texpara o arquivo ser compilado ( comment = {There is nothing to say}
).)
teste.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_database.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}
}
}
Responder1
Como o erro é que Undefined control sequence. \gtrDBcomment
você pode apenas testar se essa entrada do banco de dados existe testando se \gtrDBcomment
está definida, por exemplo, com \ifdefined
.
Caso você não saiba, quando o TeX encontra uma sequência de controle indefinida, ele lança o erro e mostra uma linha de contexto, nessa linha a sequência de controle que não foi definida será a última. No seu caso, o TeX mostra:
Undefined control sequence.
\gtrPrintComment ... {0pt}{\itshape \gtrDBcomment
}
A última sequência de controle da primeira linha é \gtrDBcomment
, e essa foi de fato a sequência de controle que o TeX tentou expandir, embora não tenha sido definida.
Portanto, se você alterar a definição de \PrintPeople
para testar se essa macro está definida, você deve estar bem:
\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}