在我看来, 似乎memoir
不支持\tightlists
某些字体大小(firmlists
顺便说一下 也不支持)。一张图片胜过千言万语:
屏幕截图的源代码如下所示。您可以注释/取消注释\tightlists
和\firmlists
以查看会发生什么。只有注释了这两行,我们才能正确获得高度递减的框。(但列表不再紧密 :-)
我真的发现了错误吗?还是我错过了一些明显的东西?
梅威瑟:
\documentclass[12pt]{回忆录} % \documentclass[12pt]{文章} \usepackage{printlen} \newlength{\demoboxheight} \newcommand{\demo}[1]{% \settoheight{\demoboxheight}{\fbox{\parbox{.5\textwidth}{\begin{#1} \开始{逐项列举} \item 虚拟 \item 虚拟 \item 虚拟 \end{逐项列举} \结束{#1} }}} \fbox{\parbox{.5\textwidth}{\begin{#1} \开始{逐项列举} \item 字体大小:#1 \item 高度:\uselengthunit{pt}\printlength{\demoboxheight} \item 即:\uselengthunit{mm}\printlength{\demoboxheight} \end{逐项列举} \结束{#1} }} } \紧密列表 % \公司列表 \开始{文档} \demo{大} \demo{大} \demo{正常尺寸} \demo{小} \demo{脚注大小} \demo{脚本大小} \demo{微小} \结束{文档}
答案1
与标准类一样article
,memoir
只为某些可用尺寸设置全套尺寸参数。\tiny
例如,如果您切换到,列表参数不会更改,因此列表会获取当前设置,即此处的 normalsize 设置,因为所有更改都在本地组中,但是如果您从切换到,\footnotesize
则会\tiny
获取小列表中的 footnotesize 设置。
有些方面与字体大小有关,例如行距和项目符号等,但大多数字体变化时未指定项目之间的间距以及前后列表的间距。
相关代码复制如下,\@listi
这里感兴趣的是第一级列表的设置(或不设置)。
\ProvidesFile{mem12.clo}%
[2010/10/19 v0.4b memoir class 12pt size option]
\renewcommand{\normalsize}{%
\@setfontsize\normalsize\@xiipt{14.5}%
\abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\belowdisplayskip \abovedisplayskip
\let\@listi\@listI}
\normalsize
\newcommand{\small}{%
\@setfontsize\small\@xipt{13.6}%
\abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 9\p@ \@plus3\p@ \@minus5\p@
\parsep 4.5\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep
%% \itemindent\z@
}%
\belowdisplayskip \abovedisplayskip
}
\newcommand{\footnotesize}{%
\@setfontsize\footnotesize\@xpt\@xiipt
\abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@
\abovedisplayshortskip \z@ \@plus3\p@
\belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@
\def\@listi{\leftmargin\leftmargini
\topsep 6\p@ \@plus2\p@ \@minus2\p@
\parsep 3\p@ \@plus2\p@ \@minus\p@
\itemsep \parsep
%% \itemindent\z@
}%
\belowdisplayskip \abovedisplayskip
}
\newcommand*{\miniscule}{\@setfontsize\miniscule\@viipt{8}}
\newcommand*{\tiny}{\@setfontsize\tiny\@viiipt{9.5}}
\newcommand*{\scriptsize}{\@setfontsize\scriptsize\@ixpt\@xpt}
\newcommand*{\large}{\@setfontsize\large\@xivpt{18}}
\newcommand*{\Large}{\@setfontsize\Large\@xviipt{22}}
\newcommand*{\LARGE}{\@setfontsize\LARGE\@xxpt{25}}
\newcommand*{\huge}{\@setfontsize\huge\@xxvpt{30}}
\ifextrafontsizes
\newcommand*{\Huge}{\@setfontsize\Huge\@xxxpt{37}}
\newcommand*{\HUGE}{\@setfontsize\HUGE\@xxxvipt{45}}
\else
\let\Huge=\huge
\let\HUGE=\huge
\fi
因此,预计某些大小可以更完整地处理列表,但是通过将列表设置设置为(例如) 0 \tightlists
,会使问题更加复杂。这意味着0pt
\itemsepi
不是自定义列表可以获得紧密的间距,但自定义列表的尺寸则不能,因为它们不使用\itemsepi
它们直接设置的\itemsep
。
幸运的是,在尺寸改变后,似乎有一个tightlist
(没有s
)你可以使用它来将(部分)参数重置为零。但它必须在列表内使用:
\documentclass[12pt]{memoir}
% \documentclass[12pt]{article}
\usepackage{printlen}
\newlength{\demoboxheight}
\makeatletter
\newcommand{\demo}[1]{%
\settoheight{\demoboxheight}{\fbox{\parbox{.5\textwidth}{\begin{#1}
\begin{itemize}\tightlist
\item dummy
\item dummy
\item dummy
\end{itemize}
\end{#1}
}}}
\fbox{\parbox{.5\textwidth}{\begin{#1}
\begin{itemize}\tightlist
\item font size: #1
\item height: \uselengthunit{pt}\printlength{\demoboxheight}
\item which is: \uselengthunit{mm}\printlength{\demoboxheight}
\item \texttt{\meaning\@listi}
\item \texttt{\the\itemsep}
\end{itemize}
\end{#1}
}}
}
\tightlists
% \firmlists
\begin{document}
\demo{Large}
\demo{large}
\demo{normalsize}
\demo{small}
\demo{footnotesize}
\demo{scriptsize}
\demo{tiny}
\end{document}
答案2
所以我跟着daleif 的评论,解决了我的问题。谢谢 daleif !
对于后人来说,这个故事的寓意是:不要说\tightlists
,而要使用enumitem
:
\usepackage{enumitem}
\setlist{nosep}