使用 environ 的自定义环境问题

使用 environ 的自定义环境问题

正如我的 MWE 所示,我有两个小问题需要帮助解决。

首先:当我接连启动两个环境且和problem之间没有空格时,我的第二个问题出现在右边距而不是前一个问题的下方。\end{problem}\begin{problem}

其次,如果我选择省略问题描述,我希望尽可能不要有空格(如第 4 个问题所示)。我想像问题 5 中那样做,但现在,第一个字母错误地显示为问题标题。

\documentclass{article}

\usepackage{environ}
\usepackage{array}

\newcounter{problem}
\setcounter{problem}{0}
\newlength{\mylen}
\settowidth{\mylen}{100}

\NewEnviron{problem}[1]{%
  \stepcounter{problem}\noindent
  \begin{tabular}{m{\mylen}p{\dimexpr\linewidth-\mylen-3\tabcolsep\relax}@{}}
    \arabic{problem}. & \textbf{#1}\\[1mm]
    & \BODY
  \end{tabular}}%

\begin{document}
  \begin{problem}{foobar}
    test    
  \end{problem}
  \begin{problem}
    test
  \end{problem}

\bigskip\bigskip\bigskip

  \begin{problem}{foobar}
    test    
  \end{problem}

  \begin{problem}{}
    test2
  \end{problem}

  \begin{problem}
    test
  \end{problem}
\end{document}

答案1

在此处输入图片描述

您需要添加\par定义以避免在文档中强制添加新段落。此外,使用它\refstepcounter可以解决\label您的问题。

这里不需要将环境主体作为宏来抓取,因此我恢复了标准环境定义,并且由于您希望标题是可选的,因此我将其声明为默认为空,这意味着它不需要[]语法{}

\documentclass{article}

%\usepackage{environ}
\usepackage{array}

\newcounter{problem}
\setcounter{problem}{0}
\newlength{\mylen}
\settowidth{\mylen}{100}

\newenvironment{problem}[1][]{%
  \refstepcounter{problem}
  \par\noindent
  \begin{tabular}{m{\mylen}p{\dimexpr\linewidth-\mylen-3\tabcolsep\relax}@{}}
  \arabic{problem}. & \ifx\relax#1\relax \else\textbf{#1}\\[1mm]&\fi
  %  \arabic{problem}. & \ifx\relax#1\relax \\ \else\textbf{#1}\\[1mm]\fi  &
  }
  {\end{tabular}\ignorespacesafterend}%

\begin{document}
  \begin{problem}[foobar]
    test    
  \end{problem}
  \begin{problem}
    test
  \end{problem}

\bigskip\bigskip\bigskip

  \begin{problem}[foobar]
    test    
  \end{problem}

  \begin{problem}[]
    test2
  \end{problem}

  \begin{problem}
    test
  \end{problem}
\end{document}

相关内容