테이블 형식에서 \pgfkeys를 사용할 때 "정의되지 않은 제어 순서" 발생

테이블 형식에서 \pgfkeys를 사용할 때 "정의되지 않은 제어 순서" 발생

SRS 문서를 조판하려고 하는데 테이블의 요소를 통합하기 위한 사용자 정의 매크로를 만들고 싶습니다.

즉, 내가 원하는 것은 소프트웨어에 대한 요구 사항을 다음과 같이 지정하는 것입니다.

\SrsReqTableStart
\SrsReqAdd{%
        code=A001,
        desc=Gestione stati lavorazione, 
        prior=5
    }
\SrsReqTableEnd

문제는 키-값 인수를 테이블 행과 결합할 때 첫 번째 앰퍼샌드 및 문자 다음에 사용자 정의 명령 인식이 중지된다는 것입니다.

더 명확하게 하기 위해 이 코드는 매크로를 정의합니다.

\newcommand{\SrsReqTableStart}{
\vspace{10pt}
\begin{tabular}{ l l l l l }
    ID & Nome & Prior. & Sforzo \\
\hline
}

\newcommand{\SrsReqTableEnd}{
\end{tabular}
}

\pgfkeys{
 /srsreq/.is family, /srsreq,
 code/.estore in = \srsReqCode,
 desc/.estore in = \srsReqDesc,
 prior/.estore in = \srsReqPrior,
}
\newcommand{\SrsReqAdd}[1]{
\pgfkeys{/srsreq, #1}%
    \hyperref[\srsReqCode]{\srsReqCode} \srsReqDesc   &%
    \tabularnewline
}

그리고 이런 식으로 작동하지만 & 문자 뒤에 일부 명령(텍스트 작동)을 작성하면 오류가 발생합니다.

\hyperref[\srsReqCode]{\srsReqCode}  & \srsReqDesc %

이미 조사하고 명령과 키/값 패키지를 변경해 보았습니다. 이 상황은 아무것도 바뀌지 않았습니다.

감사해요

답변1

코드를 변경하고 약간의 해킹을 통해 모든 행에서 변수를 재정의하여 해결했습니다. 그렇지 않으면 기본값을 얻습니다. 작동하는 것 같으므로 누군가 필요한 경우 답변으로 게시하겠습니다.

기본값으로도 작동합니다.

내 SRS 기능 요구 사항 테이블은 이제 다음과 같이 정의됩니다.

\SrsReqTableStart
    \SrsReqAdd[code=RF-CL-01,effort=8 ,prior=  ]{Requirement 1}
    \SrsReqAdd[code=RF-CL-02,effort=  ,prior=5 ]{Requirement 2}
    \SrsReqAdd[code=RF-CL-02,effort=10,prior=5 ]{Requirement 3}
\SrsReqTableEnd

테이블을 인쇄하지만 인수는 테이블 구조와 독립적으로 지정됩니다(향후 변경에 더 유연함).

서문에서 패키지를 가져옵니다.

\usepackage{xkeyval} % Key/value coding

SRS 명령은 다음과 같이 정의됩니다.

\newcommand{\SrsReqTableStart}{
    \vspace{10pt}
    \begin{tabular}{ l l l l l }
        ID & Name & Prior. & Effort \\
    \hline
}
\newcommand{\SrsReqTableEnd}{
    \end{tabular}
}

모든 행은 다음 명령으로 정의됩니다.

\makeatletter % Override @ meaning
\newlength{\pb@width}
\define@key{SrsReqAdd}{code}{\def\pb@code{#1}}
\define@key{SrsReqAdd}{effort}{\def\pb@effort{#1}}
\define@key{SrsReqAdd}{prior}{\def\pb@prior{#1}}
\setkeys{SrsReqAdd}{code=?,effort=?,prior=?} % Defaults
\newcommand{\SrsReqAdd}[2][]{
    \setkeys{SrsReqAdd}{#1} % Set new keys
    \hyperref[\pb@code]{\pb@code} &%
    #2 &% 
    \setkeys{SrsReqAdd}{#1} \pb@prior &%
    \setkeys{SrsReqAdd}{#1} \pb@effort \tabularnewline%
}
\makeatother % End override

기본값 섹션을 참고하세요. 답변 덕분에 제가 만들 수 있는 가장 깨끗한 코드입니다.여기베르너에 의해.

의견 환영

관련 정보