枚举小页面内的多行内容的列表

枚举小页面内的多行内容的列表

我使用包创建了一个列表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构造标签。我将其全部包装在problemsOP 提出的原始环境中。但是,不是使用\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}

在此处输入图片描述

相关内容