我正在尝试生成一个两列的任务列表,其中第二列包含状态信息。它必须允许分页,并且看起来应该大致像这样:
我设法使用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}