包含状态信息的两列任务列表

包含状态信息的两列任务列表

我正在尝试生成一个两列的任务列表,其中第二列包含状态信息。它必须允许分页,并且看起来应该大致像这样:

在此处输入图片描述

我设法使用tabu和拼凑了一些东西enumitem,但它有点乱,间距很奇怪。最初,任务之间的空间太大(我添加了负数vspace),状态最初应该是顶部对齐(与任务标题高度相同;我为第一列添加了 m 限定符)。理想情况下,它只是一个包含标题、任务文本和状态的列表。

有什么建议么?

\documentclass{book}
\usepackage{lipsum}
\usepackage{enumitem}
\usepackage{longtable}
\usepackage{tabu}

\newcommand{\status}[1]{\fbox{\textsc{#1}}}
\newlist{task}{description}{1}
\setlist[task]{style=nextline, leftmargin=*, labelindent=*, itemindent=*, itemsep=0pt, topsep=2mm, partopsep=0mm}

\begin{document}
\lipsum[11]
\begin{longtabu} to\linewidth {@{}X[-5 j m]X[c p]@{}}
    \begin{task}
    \item[First Task] 
        \lipsum[13]
    \vspace{-3mm}
  \end{task}&
  \status{done}\\
  \begin{task}
      \item[Second Task] 
        \lipsum[4]
    \vspace{-3mm}
     \end{task}& 
     \status{in progress} \\
  \begin{task}
      \item[Third Task]
        \lipsum[10]
     \vspace{-3mm}
     \end{task} &
     \status{new} \\
\end{longtabu}
\end{document}

答案1

由于您希望将状态对齐到顶部,我建议您将其放入项目标签中。以下操作将列表的右边距增加可定义的长度\statuswidth,并在该列的中心放置一个带有状态的框:

\documentclass{book}

\usepackage{lipsum}
\usepackage{enumitem}

\newlength{\statuswidth}
\setlength{\statuswidth}{3cm}
\newcommand{\status}[1]{\hfill\hbox to 0pt{\hbox to
\statuswidth{\hss\fbox{\textnormal{\scshape #1}}\hss}\hss}}

\newlist{task}{description}{1}
\setlist[task]{style=nextline, leftmargin=*, labelindent=*,
  itemindent=*, itemsep=0pt, topsep=2mm, partopsep=0mm,
  before=\setlength{\rightmargin}{\statuswidth}}

\begin{document}

\lipsum[11]
\begin{task}
\item[First Task\status{done}] 
  \lipsum[13]
\item[Second Task\status{in progress}] 
  \lipsum[4]
\end{task}

\end{document}

示例输出

如果您希望状态正确刷新,请改用以下定义\status

\newcommand{\status}[1]{\hfill\hbox to 0pt{\hbox to
\statuswidth{\hss\fbox{\textnormal{\scshape #1}}}\hss}}

即删除倒数第二个的前一个代码\hss

答案2

我倾向于一种更简单的方法:

\documentclass{book}
\usepackage{lipsum}
\usepackage{longtable}
\usepackage{calc,array}
\usepackage[pass,showframe]{geometry}

\newcommand{\status}[1]{\fbox{\textsc{#1}}}
\newcommand{\task}[1]{\multicolumn{2}{@{}l}{\textbf{#1}}}

\newlength{\statuslen}
\settowidth{\statuslen}{\fbox{\textsc{in progress}}}

\begin{document}
\lipsum[11]
\begin{longtable}
  {@{}>{\hspace*{3em}}l@{}
   m{\textwidth-2\tabcolsep-\statuslen-3em}
   l@{}}
\task{First Task} \\*
  &\lipsum[13]
  &\status{done} \\
\task{Second Task} \\*
  &\lipsum[4]
  &\status{in progress} \\
\task{Third Task} \\*
  &\lipsum[10]
  &\status{new} \\
\end{longtable}
\end{document}

在此处输入图片描述

geometry包仅用于构建页面框架和显示页边距。

答案3

另一种方法是定义你自己的自定义环境。因此,使用Task下面的定义,你只需使用

\begin{Task}{<name>}{status}
    text of task
\end{Task}

在此处输入图片描述

代码:

\documentclass{book}

\newcommand*{\TextA}{Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque scelerisque odio nec lorem dignissim ultricies.  Quisque tristique turpis consectetur ligula bibendum vestibulum.}

\newcommand*{\TextB}{Aliquam tincidunt sapien vel odio consequat pulvinar. Donec laoreet cursus faucibus. Nam tincidunt malesuada arcu quis viverra. Vivamus eget quam ut justo mattis dignissim. Suspendisse convallis gravida consectetur. Nullam a nulla diam, in fringilla nulla. Sed at justo et lacus dapibus feugiat.}

\newcommand*{\LeftMargin}{0.5cm}%
\newcommand*{\RightMargin}{2.5cm}%
% http://tex.stackexchange.com/questions/588/how-can-i-change-the-margins-for-only-part-of-the-text
\def\ChangeMargin#1#2{\list{}{\rightmargin#2\leftmargin#1}\item[]}%
\let\endChangeMargin=\endlist%


\newcommand{\status}[1]{\fbox{\textsc{#1}}}

\newenvironment{Task}[2]{%
    \smallskip\par\noindent\textbf{#1}\hfill\status{#2}%
    \ChangeMargin{\LeftMargin}{\RightMargin}%
    \vspace{\dimexpr-\baselineskip+3pt\relax}%
}{%
    \endChangeMargin\ignorespacesafterend%
}

\begin{document}
\noindent\TextB

\begin{Task}{First Task}{in progress}
    \TextA
\end{Task}
\begin{Task}{Second Task}{in progress}
    \TextB
\end{Task}
\begin{Task}{Third Task}{new}
    \TextA
\end{Task}
\end{document}

答案4

另一种方法是使用带有三个参数的命令 \task:

\task{<name>}{<status>}{<text>}

完整示例:

\documentclass{book}
\usepackage{lipsum}
\usepackage{tabu}
\usepackage{longtable}

\newcommand\status[1]{\fbox{\textsc{#1}}}
\newcommand\task[3]{%
  \multicolumn{2}{@{}p{6cm}}{\bfseries #1} & \status{#2} \\* & #3\\}

\begin{document}
\lipsum[11]
\begin{longtabu} to \linewidth{@{}p{1cm}@{}X[p]c@{}}
\task{First Task}{done}{\lipsum[2]} 
\task{Second Task}{in progress}{\lipsum[4]} 
\task{Third Task}{done}{\lipsum[2]} 
\end{longtabu}
\end{document}

在此处输入图片描述

相关内容