Проверить определение неизвестно \pgfkeys

Проверить определение неизвестно \pgfkeys

Я хочу создать большое генеалогическое древо с помощью 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}

введите описание изображения здесь

Связанный контент