正如我的 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}