我使用包创建了一个列表enumitem
。列表中的项目应该用多行文本块来枚举,如下所示
item
由于我还没有找到传递多个参数的方法,所以我只传递了一个minipage
。问题在于对齐:
我希望文本与单词“问题”对齐,即蓝线与红线对齐。但是将[t]
参数传递给它minipage
会产生错误。
更新。将选项传递给 minipage 后,[t]
项目的下一行太低,并且在第一个字母前添加了一个空格:
这是我的 MWE
\documentclass[10pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{xparse}
\usepackage{lipsum}
%\usepackage{lua-visual-debug} %uncomment to test if everything us ok (requires Lua)
\newcounter{problemscounter}
\newlength{\LABELWIDTH}
\newenvironment{problems}{
\begin{list}{}%
{
\usecounter{problemscounter}
\setlength{\labelwidth}{3cm}
\setlength{\LABELWIDTH}{\labelwidth}
\setlength{\labelsep}{0.5em}
\setlength{\leftmargin}{\labelwidth+\labelsep}
\setlength{\itemsep}{12pt}
\setlength{\listparindent}{1em}
\setlength{\parsep}{1pt}
\setlength{\topsep}{6pt}
}
}{
\end{list}
}
\NewDocumentCommand{\TT}{mmm}{
\item[{%
\begin{minipage}[t]{\LABELWIDTH}
\textbf{%
\textup{%
Problem\kern.4em\ignorespaces\stepcounter{problemscounter}\arabic{problemscounter}.%
}%
}\\
\textit{#1 point#2}.\\%
#3.
\end{minipage}
}]%
}
\begin{document}
\begin{problems}
\TT{1}{}{Mandatory} \lipsum[1]
\TT{2}{s}{Mandatory} More difficult one.
\TT{2017}{s}{Bonus} Good luck solving this.
\end{problems}
\end{document}
答案1
您可以按原样使用列表(尽管我添加了一些缺失的内容%
),但隐藏小页面的高度。然后,为了避免段落较短时三行项目标签过度打印,请检查\prevgraf
段落末尾的(行数),并根据需要添加一两行空白行。
\documentclass[10pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{xparse}
\usepackage{lipsum}
%\usepackage{lua-visual-debug} %uncomment to test if everything us ok (requires Lua)
\newcounter{problemscounter}
\newlength{\LABELWIDTH}
\newenvironment{problems}{%
\begin{list}{}%
{%
\usecounter{problemscounter}%
\setlength{\labelwidth}{3cm}%
\setlength{\LABELWIDTH}{\labelwidth}%
\setlength{\labelsep}{0.5em}%
\setlength{\leftmargin}{\labelwidth+\labelsep}%
\setlength{\itemsep}{12pt}%
\setlength{\listparindent}{1em}%
\setlength{\parsep}{1pt}%
\setlength{\topsep}{6pt}%
}%
}{%
\par
\end{list}%
}
\NewDocumentCommand{\TT}{mmm}{%
\par
\item[{%
\begin{minipage}[t][0pt]{\LABELWIDTH}%
\textbf{%
\textup{%
Problem\kern.4em\ignorespaces\stepcounter{problemscounter}\arabic{problemscounter}.%
}%
}\\%
\textit{#1 point#2}.\\%
#3.%
\end{minipage}%
}]%
\everypar\expandafter{\the\everypar
\let\svpar\par
\let\par\TTpar}%
}%
\newcommand\TTpar{%
\let\par\svpar
\par
\ifcase\prevgraf
\or%0
\mbox{}\\*\mbox{}\par\or%1
\mbox{}\par
\fi}
\begin{document}
\begin{problems}
\TT{1}{}{Mandatory} \lipsum[1]
\TT{2}{s}{Mandatory} More difficult one.
\TT{2017}{s}{Bonus} Good luck solving this.
\end{problems}
\end{document}
答案2
将其括在括号中。使用括号,您甚至可以使用可选参数(这将以另一种方式结束可选参数\item
)。然后您的方法就可以t
奏效了。
背景:如果您想使用\item
它,它会扫描以 开头[
并以 结尾的可选参数]
。这意味着如果您minipage
在其中放置一个,它会使用 来[t]
item
扫描结束括号,如下所示,并结束可选项。应该清楚的是,这既不是有意的,也不能工作。另一方面,括号形成一个可以“屏蔽”此类不良字符的组,这使得可选参数中的可选参数成为可能。
\documentclass[10pt]{scrartcl}
\usepackage[margin=1in]{geometry}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{xparse}
%\usepackage{lua-visual-debug} %uncomment to test if everything is ok (requires Lua)
\newcounter{problemscounter}
\newlength{\LABELWIDTH}
\newenvironment{problems}{
\begin{list}{}%
{
\usecounter{problemscounter}
\setlength{\labelwidth}{3cm}
\setlength{\LABELWIDTH}{\labelwidth} %Will be passed to minipage
\setlength{\labelsep}{0.5em}
\setlength{\leftmargin}{\labelwidth+\labelsep}
\setlength{\itemsep}{12pt}
\setlength{\listparindent}{1em}
\setlength{\parsep}{1pt}
\setlength{\topsep}{6pt}
}
}{
\end{list}
}
\NewDocumentCommand{\TT}{mmm}{
\item[{%
\begin{minipage}[t]{\LABELWIDTH}
\textbf{%
\textup{%
Problem\kern.4em\ignorespaces\stepcounter{problemscounter}\arabic{problemscounter}.%
}%
}\\
\textit{#1 point#2}.\\%
#3.
\end{minipage}
}]%
}
\begin{document}
\begin{problems}
\TT{1}{}{Mandatory} The first problem.
\TT{2}{s}{Mandatory} More difficult one.
\TT{2017}{s}{Bonus} Good luck solving this.
\end{problems}
\end{document}
更新 1:一个完全没有环境的解决方案,但有一个附加参数。
\documentclass[10pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{xparse}
\usepackage{lipsum}
\newcounter{problemscounter}
\newlength{\LABELWIDTH}
\setlength{\LABELWIDTH}{3cm}
\newlength{\LABELSEP}
\setlength{\LABELSEP}{.5em}
\NewDocumentCommand{\TT}{mmm +m}{
\begin{minipage}[t]{\LABELWIDTH}
\textbf{%
\textup{%
Problem\kern.4em\ignorespaces\stepcounter{problemscounter}\arabic{problemscounter}.%
}%
}\\
\textit{#1 point#2}.\\%
#3.
\end{minipage}\hfill
\begin{minipage}[t]{\dimexpr\textwidth-\LABELWIDTH-\LABELSEP}\setlength{\parindent}{1em}\setlength{\parskip}{1pt}
#4
\end{minipage}\par\vskip12pt
}
\begin{document}
\TT{1}{}{Mandatory}{\lipsum[1]}
\TT{2}{s}{Mandatory}{More difficult one.}
\TT{2017}{s}{Bonus}{Good luck solving this.}
\TT{1}{}{Mandatory}{\lipsum[1]}
\TT{1}{}{Mandatory}{\lipsum[1]}
\TT{1}{}{Mandatory}{\lipsum[1]}
\TT{1}{}{Mandatory}{\lipsum[1]}
\TT{1}{}{Mandatory}{\lipsum[1]}
\end{document}
更新 2:另一个可以考虑的方法是使用ltablex
或类似方法,它们允许自动调整文本宽度列(如p{3cm}X
)和分页。我不会详细说明这一点,因为这是一个非常棘手的方法。我推荐非列表版本。
答案3
正如评论中所讨论的,列表制作环境存在问题,具体取决于标签是高于(更深)还是低于项目主体。修复一种方法会破坏另一种方法,等等。因此,我在这里采用了一种tabular
方法。
我还使用堆栈而不是 来minipage
构造标签。我将其全部包装在problems
OP 提出的原始环境中。但是,不是使用\item
,而是像 一样设置它tabular
,如下所示:
\begin{problems}
\TT{1}{Mandatory} &\lipsum[1]\par\lipsum[2]\\
\TT{2}{Mandatory} & More difficult one.\\
\TT{2017}{Bonus} & Good luck solving this.
\end{problems}
最后,我不再需要指定“point”的后缀。我只需检查值是否等于 1;如果不等于,则添加“s”后缀。
已编辑,用于longtable
支持分页符。
\documentclass[10pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{xparse}
\usepackage[nopar]{lipsum}
\usepackage[usestackEOL]{stackengine}
\usepackage{tabularx,longtable}
%\usepackage{lua-visual-debug} %uncomment to test if everything us ok (requires Lua)
\newcounter{problemscounter}
\newlength{\LABELWIDTH}
\setlength{\LABELWIDTH}{3cm}
\newenvironment{problems}{\noindent\renewcommand\arraystretch{2}%
\begin{longtable}{c>{\parskip 1ex}p{\dimexpr\textwidth-\LABELWIDTH}}
}{
\end{longtable}
}
\NewDocumentCommand{\TT}{mm}{\stepcounter{problemscounter}%
{\Longunderstack[l]{%
\textbf{\textup{Problem\kern.4em\arabic{problemscounter}.}}\\
\textit{#1 point\ifnum#1=1\relax\else s\fi}.\\%
#2.}
}%
}
\newcommand\skipline{\vspace{\baselineskip}}
\newcommand\skiplines{\vspace{2\baselineskip}}
\begin{document}
\begin{problems}
\TT{1}{Mandatory} &\lipsum[1]\par\lipsum[2]\\
\TT{2}{Mandatory} & More difficult one.\\
\TT{2017}{Bonus} & Good luck solving this.\\
\TT{1000}{Ausgezeichnet} & Testing page breaks.
\lipsum[3-5]\\
\TT{2000}{Ausgezeichnet} & Testing page breaks.
\lipsum[4-6]
\end{problems}
\end{document}