알 수 없는 정의 확인 \pgfkeys

알 수 없는 정의 확인 \pgfkeys

패키지를 사용하여 대규모 계보 나무를 만들고 싶고 genealogytree인물 데이터를 별도의 파일에 저장하기로 결정했습니다.test_database.tex(MWE의 경우 3명 포함) 메인 파일에서 'test_database.tex'에 채워진 키를 사용하여 : test.tex에 대한 새로운 형식을 만듭니다 .genealogytreexTestFormat

나는 pgf 매뉴얼 섹션을 읽었 \pgfkeys으며 일반적으로 키를 사용하기 전에 키가 존재하는지 확인하는 방법을 이해하지만 내 경우에는 그렇지 않습니다. MWE에서: 데이터베이스에 'Tom Water' 데이터가 포함되어 있는지 미리 알지 못하기 때문에 comment'Tom Walter'에 대한 키가 존재하는지 확인하는 방법을 모르겠습니다 . 그래서 키를 사용하려고 하면 다음과 같은 오류 메시지가 나타납니다 Undefined control sequence. }.

pgfkey 이름을 미리 모르는 경우 pgfkey가 비어 있지 않은지 확인하는 방법은 무엇입니까?

MWE

(마지막에서 세 번째 줄의 주석 처리를 취소하십시오.test_database.tex파일을 컴파일하려면 ( comment = {There is nothing to say}).)

test.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}
    }
}

답변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}

여기에 이미지 설명을 입력하세요

관련 정보