继续这问题,我尝试制作一个项目列表,每个项目都包含不可破坏的文本。这可以使用 minipage 手动完成:
\documentclass[10pt,a4paper]{article}
\usepackage{lipsum} %for example
\setlength{\textheight}{7cm} %about one item fits per page
\begin{document}
\begin{itemize}
\item\begin{minipage}[t]{\linewidth}
\lipsum[1]
\end{minipage}
\item\begin{minipage}[t]{\linewidth}
\lipsum[2]
\end{minipage}
\end{itemize}
\end{document}
我希望它定义一个列表环境,就像 itemize(或其他)一样,只是项目会自动插入到 minipage 中,就像我的手动示例一样。该解决方案对于嵌套列表环境应该是强大的,因此如果要\item
重新定义,必须以非常温和的方式进行...不确定如何。在重新定义环境 itemize-block(例如)后,以下代码应该可以编译,并且不会破坏页面中每个项目中的文本:
\begin{itemize-block}
\item
\lipsum[1]
\item \begin{itemize}
\item let us make sure it compiles even with
\item a nested list...
\end{itemize}
\item
\lipsum[2]
\end{itemize-block}
这当然可以做到...只是我不知道该怎么做。
答案1
我会这样做:
\newenvironment{block-itemize}{%
\itemize
\let\olditem\item
\let\closepage\relax
\renewcommand\item[1][]{%
\closepage\olditem[#1]\minipage[t]{\linewidth}%
\let\closepage\endminipage
}%
}{%
\closepage
\enditemize
}
然后你写
\begin{block-itemize}
\item \lipsum[1]
\item \lipsum[2]
\end{block-itemize}
简单解释一下:启动时,环境会开始一个常规操作\itemize
,然后将 的通常定义保存\item
到 中\olditem
。然后\item
重新定义,以便:(1) 关闭“上一个”小页面 (2) 启动一个常规项目(使用\olditem
)和 (3) 打开一个新的小页面。当然,对于第一个项目,没有小页面可以关闭,这就是为什么\closepage
首先将其定义为\relax
(不执行任何操作),但\endminipage
在第一次使用 之后将其重新定义为\item
。环境的结束只是关闭最后一个小页面和 itemize 环境。
笔记:实际上,我会使用类似和的东西\my@olditem
,\my@closepage
并将整个定义放入样式文件中,这样我就不会意外地重新定义来自另一个包的命令。但我想让上面的代码保持干净,而不要@
到处都是那些。
答案2
这是对以下评论的回复胡安的回答。
这是他的建议的修改版本,适用于description
环境。
% ==========================================================
% Adapted from TeX.StackExchange.com user Juan A. Navarro's
% solution for itemize as seen at
% https://tex.stackexchange.com/a/4493/327
% ----------------------------------------------------------
\newcommand\myitem[1][]{%
\closepage\item[#1]\minipage[t]{\linewidth}%
\let\closepage\endminipage%
}
% ----------------------------------------------------------
\newenvironment{block-description}{%
\description
\let\olditem\item
\let\closepage\relax
%\def\item[1][]{\myitem}[1]
}{%
\closepage
\enddescription
}
我不喜欢让项目定义存在于那样的环境之外,但是我尝试过的所有变化都失败了,而且我不知道该如何修复它。
应用程序看起来像
\begin{block-description}
\myitem[Week 1] Aug. 18--22 \\
\begin{tabular}{lp{2.5cm}p{7.5cm}}
& Reading & Topic and notes \\
\hline
Mon. & & Intro; administriva; pretest\\
Tue. & \\
Wed. & 18.1--18.5 & Electrostatics; Coulombs law \\
Thu. & \multicolumn{1}{r}{\textbf{Activity day:}} &
sticky electrostatics \\
Fri. & & Electrostatic force and multiple
charges
\end{tabular}
\myitem[Week 2] Another table for the next week
\myitem[Week 3] Yet another table for the third week
\begin{block-description}
每周内容完整地显示在一页或另一页上,不会中断。
这是今天出现的一个小问题:要在此上下文中启用真正的脚注,请使用类似
\NewDocumentCommand\myfootnotetext{o +m}{% One optional and one long mandatory argument
\closepage% End the current item so that we are outside of
% minipage context
\IfNoValueTF{#1}
{\footnotetext{#2}}
{\footnotetext[#1]{#2}}% Call \footnotetext either with or
% without the optional argument
\let\closepage\relax% Re-define \closepage so that the next
% \myitem won't break when it tries \closepage
}
这需要\usepackage{xparse}
。然后您可以\footnotemark
在项目内部发出并\myfootnotetext
在该项目的底部发出,脚注将出现在页面底部(当然,在无法正确放置的病理情况下)。