將 \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

請注意預設部分。這是我能寫的最乾淨的程式碼,感謝答案這裡由維爾納.

歡迎提出意見

相關內容