定義不明のチェック\pgfkeys

定義不明のチェック\pgfkeys

パッケージを使用して大規模な家系図を作成したいのでgenealogytree、人物データを別のファイルに保存することにしましたテストデータベース.tex(MWE の場合は 3 人が含まれます)。メイン ファイルから、 「test_database.tex」に入力されたキーを使用して、test.texの新しい形式を作成しますgenealogytreexTestFormat

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}

ここに画像の説明を入力してください

関連情報