
パッケージを使用して大規模な家系図を作成したいのでgenealogytree
、人物データを別のファイルに保存することにしましたテストデータベース.tex(MWE の場合は 3 人が含まれます)。メイン ファイルから、 「test_database.tex」に入力されたキーを使用して、test.tex
の新しい形式を作成しますgenealogytree
。xTestFormat
pgf マニュアルのセクションを読み\pgfkeys
、一般的にはキーを使用する前にキーが存在するかどうかを確認する方法は理解していますが、私の場合はそうではありません。MWE から: データベースに「Tom Water」のデータが含まれていることを事前に知らないため、comment
「Tom Walter」のキーが存在するかどうかを確認する方法がわかりません。そのため、キーを使用しようとすると、次のエラー メッセージが表示されました: Undefined control sequence. }
。
事前に pgfkey の名前がわからない場合に、pgfkey が空でないことを確認するにはどうすればよいでしょうか?
ムウェ
(最後から3行目のコメントを解除してくださいテストデータベース.texファイルをコンパイルするには ( comment = {There is nothing to say}
) を使用します。
テスト.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}
テストデータベース.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
かどうかをテストすることで、その DB エントリが存在するかどうかをテストできます\gtrDBcomment
(例: \ifdefined
)。
ご存知ない方のために説明すると、TeX が未定義の制御シーケンスに遭遇すると、エラーがスローされ、コンテキストの行が表示されます。その行では、定義されていない制御シーケンスが最後のものになります。この場合、TeX は次のように表示します。
Undefined control sequence.
\gtrPrintComment ... {0pt}{\itshape \gtrDBcomment
}
最初の行の最後の制御シーケンスは であり\gtrDBcomment
、これは確かに定義されていないにもかかわらず TeX が拡張しようとした制御シーケンスでした。
したがって、そのマクロが定義されているかどうかをテストするために の定義を変更すると\PrintPeople
、問題は解決するはずです。
\newcommand\PrintPeople[1]{
\gtrPrintSex~\givenname
\familyname
\ifdefined\gtrDBcomment
\gtrPrintComment
\fi
}
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}