表内的嵌套新环境定义

表内的嵌套新环境定义

我正在尝试定义两个环境,一个在另一个中使用。第一个是简历中的一个部分,第二个是子部分(cvitem)。后者包含一个无序列表(暂时注释掉,以隔离问题)。子部分应该是两列,我尝试使用表格来创建,这样所有子部分都可以对齐在一起。cvitem 就是这个表格中的行。

\documentclass[12pt]{article}
\usepackage{array}
\usepackage{ragged2e}

\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash}p{#1}}
\newenvironment{cvsection}[1]{
    { \Large \bf #1 }
    \hrule height 0.5pt
    \begin{tabular}{@{}>{}L{.25\linewidth}L{.75\linewidth}@{}}
} {
    \end{tabular}
}

\newenvironment{cvitem}[4]{
    #3 \linebreak #4 & {\bf #1}, #2 \linebreak \\
    %\begin{itemize}
} {
    %\end{itemize}
}

\begin{document}
\begin{cvsection}{Education}
    \begin{cvitem}{xxx}{xx}{xx}{xx}
        %\item x
    \end{cvitem}
\end{cvsection}
\end{document}

当我将 cvitem 重写为 时newcommand,代码编译成功。但由于我想插入一个列表,所以它应该是一个环境。我尝试将 cvitem 定义为命令,并使用包将其转换为环境environ,但这导致了相同的错误。

答案1

您不能在环境&形成的组中发出问题cvitem

利用environ一些\aftergroup技巧你就能做到。

\documentclass[12pt]{article}
\usepackage{array}
\usepackage{ragged2e}
\usepackage{environ}

\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash}p{#1}}
\newenvironment{cvsection}[1]
 {%
  {\Large\bfseries #1}\vskip3pt\hrule height 0.5pt
  \begin{tabular}{@{}>{}L{.25\linewidth}L{.75\linewidth}@{}}
 }
 {\end{tabular}}

\NewEnviron{cvitem}[4]{%
  \xdef\cvitembody{%
    \unexpanded{#3\par#4 & {\bfseries #1}, #2\tabularnewline}%
    \noexpand\begin{itemize}%
    \unexpanded\expandafter{\BODY}%
    \noexpand\end{itemize}\noexpand\tabularnewline
  }%
  \aftergroup\cvitembody
}

\begin{document}

\begin{cvsection}{Education}
  \begin{cvitem}{xxx}{xx}{xx}{xx}
  \item x
  \end{cvitem}
\end{cvsection}

\end{document}

在此处输入图片描述

答案2

我想到了一个解决方法,使用命令而不是环境。我不明白为什么这样做有效,而原始问题中的代码却无效。

\documentclass[12pt]{article}
\usepackage{array}
\usepackage{ragged2e}
\usepackage{enumitem}

\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash}p{#1}}
\newenvironment{cvsection}[1]{
    { \Large \bf #1 }
    \hrule height 0.5pt
    \begin{tabular}{@{}>{}L{.25\linewidth}L{.75\linewidth}@{}}
} {
    \end{tabular}
}

\newcommand{\cvitembegin}[4]{
    #3 \linebreak #4 & 
    {\bf #1}, #2 \linebreak
    \begin{itemize}[noitemsep,nolistsep]
}
\newcommand{\cvitemend}{
    \end{itemize}\\
}

\begin{document}
\begin{cvsection}{Education}
    \cvitembegin{xxx}{xx}{xx}{xx}
        \item x
    \cvitemend
\end{cvsection}
\end{document}

相关内容