
Я хочу создать большое генеалогическое древо с помощью genealogytree
пакета и решил хранить данные о людях в отдельном файле.test_database.tex(содержащий трех человек для MWE). Из основного файла test.tex
я создаю новый формат для genealogytree
: xTestFormat
используя ключи, которые были заполнены в 'test_database.tex'.
Я прочитал раздел руководства pgf \pgfkeys
и понял, как проверить, существует ли ключ перед его использованием в общем случае, но не в моем случае. Из MWE: поскольку я заранее не знаю, что база данных содержит данные 'Tom Water', я не знаю, как проверить, comment
существует ли ключ для 'Tom Walter'. Поэтому, когда я пытаюсь использовать ключ, я получаю сообщение об ошибке: Undefined control sequence. }
.
Как проверить, что pgfkey не пустой, если мы заранее не знаем его имя?
МВЭ
(Раскомментируйте третью с конца строку вtest_database.texдля компиляции файла ( comment = {There is nothing to say}
).)
тест.текс
\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}
}
}
решение1
Поскольку ошибка заключается в том, что Undefined control sequence. \gtrDBcomment
вы можете просто проверить, существует ли эта запись в БД, проверив, \gtrDBcomment
определена ли она, например, с помощью \ifdefined
.
Если вы не знали, когда TeX встречает неопределенную управляющую последовательность, он выдает ошибку и показывает строку контекста, в этой строке та управляющая последовательность, которая не была определена, будет последней. В вашем случае TeX показывает:
Undefined control sequence.
\gtrPrintComment ... {0pt}{\itshape \gtrDBcomment
}
Последняя управляющая последовательность первой строки — это \gtrDBcomment
, и это действительно была управляющая последовательность, которую TeX пытался расширить, хотя она не была определена.
Поэтому, если вы измените определение, \PrintPeople
чтобы проверить, определен ли этот макрос, все должно быть хорошо:
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\ifdefined\gtrDBcomment
\gtrPrintComment
\fi
}
Полная МВЭ:
\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}