嵌套自定义 `xparse` 环境

嵌套自定义 `xparse` 环境

我用 定义了两个简单的环境xparse。当我尝试在环境todominute中嵌套环境时,出现了问题:minutes

\documentclass[a4paper, 10pt]{article}

\usepackage{polski}
\usepackage{xltxtra}
\usepackage{xparse}
\usepackage{booktabs}

\NewDocumentEnvironment {minutes} {} {%
    \begin{table*}[h!]
    \begin{tabular*}{\textwidth}{@{} p{0.25\textwidth} l p{0.4\textwidth} l @{}}
        \textbf{Zadanie} & \textbf{Typ} & \textbf{Opis} & \textbf{Przydział} \\
        \midrule
}{%
    \end{tabular*}
    \end{table*}
}

\NewDocumentEnvironment {todominute} {m O{}} {%
    {#1} & \textsc{TODO} &
}{%
    & {#2} \\
}

\begin{document}

\begin{minutes}
    \begin{todominute}{Poprawki opisu produktu}[TC]
        Zgodnie z opisem z paragrafu \ref{sec:opis_produktu}.
    \end{todominute}
    \begin{todominute}{Poprawki mapy pamięci}[MM]
        Zgodnie z opisem z paragrafu \ref{sec:mapa_pamieci}.
    \end{todominute}
\end{minutes}

\end{document}

我收到的只是一些没用的讯息:

! Extra }, or forgotten \endgroup.
\@endpbox ...finalstrut \@arstrutbox \par \egroup 
                                                  \hfil 
l.27 ...n{todominute}{Poprawki opisu produktu}[TC]

编辑: 阅读评论后,我明白了问题所在。有没有简单的方法可以实现所需的行为?我可以声明一个可以这样使用的新命令,并打印minutes环境中声明的表的整行吗?

\begin{minutes}
    \todominute{Poprawki opisu produktu}[TC]
        Zgodnie z opisem z paragrafu \ref{sec:opis_produktu}.
    \todominute{Poprawki mapy pamięci}[MM]
        Zgodnie z opisem z paragrafu \ref{sec:mapa_pamieci}.
\end{minutes}

答案1

如果对表行使用命令而不是环境,则问题就会消失。

\documentclass{article}

\usepackage{booktabs}
\usepackage{xparse}

\NewDocumentEnvironment {minutes} {} {%
    \begin{table*}[htp!]
    \begin{tabular*}{\textwidth}{@{} p{0.25\textwidth} l p{0.5\textwidth} l @{}}
        \textbf{Zadanie} & \textbf{Typ} & \textbf{Opis} & \textbf{Przydział} \\
        \midrule
}{%
    \end{tabular*}
    \end{table*}
}

\NewDocumentCommand {\todominute} {m o m} {
    #1 & \textsc{TODO} & #3
    & #2 \tabularnewline
}

\begin{document}

\begin{minutes}
    \todominute{Poprawki opisu produktu}[TC]
        {Zgodnie z opisem z paragrafu \ref{sec:opis_produktu}.}
    \todominute{Poprawki mapy pamięci}[MM]
        {Zgodnie z opisem z paragrafu \ref{sec:mapa_pamieci}.
        \begin{enumerate}
            \item asd
            \item qwe
            \item zxc
        \end{enumerate}
    }
\end{minutes}

\end{document}

答案2

我修改了一些 David 提出的解决方案。

我希望避免在细节列放在大括号中。

我的方法在参数顺序方面并不是很灵活,因为只有最后一列可以填充,而无需将其内容放入{}-wrapped 参数中。

无论如何,这样使用感觉更自然,因为它类似于默认itemize环境。作为额外奖励,它不会弄乱文本编辑器中的语法颜色。

\documentclass[10pt]{article}

\usepackage{booktabs}
\usepackage{xparse}

\NewDocumentEnvironment {minutes} { } {%
    \begin{table}[htp]
    \begin{tabular}{@{} p{0.2\textwidth} p{0.2\textwidth} p{0.5\textwidth} @{}}
        \toprule
        \textbf{Minute} & \textbf{Owner} & \textbf{Details} \tabularnewline
        \midrule
}{%
        \end{minipage} \tabularnewline
        \bottomrule
    \end{tabular}
    \end{table}
}

\NewDocumentCommand {\minute} { s m O{} } {%
    \IfBooleanTF #1 {%
    }{%
        \end{minipage} \tabularnewline
        \midrule
    }%
    {#2} & {#3} &
    \begin{minipage}[t]{0.5\textwidth}
}


\begin{document}


\begin{minutes}
    \minute*{Subject 1}%
        The first item \textbf{has to be} starred:\newline
        \verb=\minute*{The first...}=
    \minute{Info 2}
        The rest \textbf{musn't} be starred.
    \minute{Task 2}[TC]%
        So it goes.
\end{minutes}


\end{document}

相关内容