这是我使用 LuaLaTeX 编译的 MWE:
\documentclass[oneside,DIV=12]{scrbook}
\usepackage{scrhack}
\usepackage[automark]{scrlayer-scrpage}
\usepackage[english]{babel}
\usepackage[babel]{microtype}
\usepackage{mathtools, amsthm, amssymb}
\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
\setmathfont{Latin Modern Math}
\usepackage{setspace}\setdisplayskipstretch{}
\usepackage{enumitem}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% List environment settings
\setlist[enumerate]{font={\bfseries}}
\setlist[enumerate,1]{label=\arabic*., labelsep=0.5em}
\setlist[enumerate,2]{label=(\roman*), align=left, leftmargin=3em, labelwidth=2.5em}
% Resizeable \bullet symbol
\newcommand{\rbullet}[1][.75]{\mathbin{\vcenter{\hbox{\scalebox{#1}{$\bullet$}}}}} % https://tex.stackexchange.com/a/389240/228055
% Custom amsthm theorem environments
\newtheoremstyle{custom}
{\topsep} % ABOVESPACE
{\topsep} % BELOWSPACE
{\normalfont} % BODYFONT
{0pt} % INDENT (empty value is the same as 0pt)
{\(\rbullet\) \bfseries} % HEADFONT
{ } % HEADPUNCT
{\newline} % HEADSPACE
{\thmnote{#3 }\thmname{#1}} % CUSTOM-HEAD-SPEC
\theoremstyle{custom}
\newtheorem*{problems}{Problems}
\newtheorem*{solutions}{Solutions}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\onehalfspacing\KOMAoptions{DIV=current}
\begin{problems}
\begin{enumerate}
\item[]
% No. 01
\item Prove the following:
\begin{enumerate}
% (i)
\item \(x^n - y^n = (x - y) (x^{n-1}+ x^{n-2} y + \dots + x y^{n-2} + y^{n-1})\).
% (ii)
\item \(x^3 + y^3 = (x + y) (x^2 - xy + y^2)\), (There is a particularly easy way to do this, using \textbf{(iv)}, and it will show you how to find a factorization for \(x^n + y^n\) whenever \(n\) is odd.)
\end{enumerate}
% No. 02
\item What is wrong with the following ``proof''? Let \(x = y\). Then
\begin{align*}
x^2 &= xy, \\
x^2 - y^2 &= xy - y^2, \\
(x + y) (x - y) &= y (x - y), \\
x + y &= y, \\
2y &= y, \\
2 &= 1.
\end{align*}
% No. 03
\item Prove the following:
\begin{enumerate}
% (i)
\item \(\dfrac{a}{b} + \dfrac{c}{d} = \dfrac{ad + bc}{bd}\), if \(b\), \(d \neq 0\).
% (ii)
\item \(\left.\dfrac{a}{b} \,\middle/\, \dfrac{c}{d}\right. = \dfrac{ad}{bc}\), if \(b\), \(c\), \(d \neq 0\).
% (iii)
\item If \(b\), \(d \neq 0\), then \(\dfrac{a}{b} = \dfrac{c}{d}\) if and only if \(ad = bc\). Also determine when \(\dfrac{a}{b} = \dfrac{b}{a}\).
\end{enumerate}
% No. 04
\item Find all numbers \(x\) for which
\begin{enumerate}
% (i)
\item \(\dfrac{1}{x} + \dfrac{1}{1 - x} > 0\).
% (ii)
\item \(\dfrac{x - 1}{x + 1} > 0\).
\end{enumerate}
% No. 05
\item Prove the following:
\begin{enumerate}
% (i)
\item If \(a < b\) and \(c < d\), then \(a + c < b + d\).
% (ii)
\item If \(a < b\), then \(-b < -a\).
\end{enumerate}
% No. 06
\item \begin{enumerate}[label=(\alph*)]
% (a)
\item Prove that if \(0 \leq x < y\), then \(x^n < y^n\),\(n = 1, 2, 3, \dots\)
% (b)
\item Prove that if \(x < y\) and \(n\) is odd, then \(x^n < y^n\).
\end{enumerate}
\end{enumerate}
\end{problems}
\end{document}
当使用该enumitem
包时,我通常对列表中的默认垂直值感到满意sep
,但我发现当内联数学模式中有显示样式分数时,它会有点窄或紧,即\dfrac
包含在\item
它会有点窄或紧。例如,我发现中间的垂直间距从3, 然后3(一),第3(二)条,第3(三)条,4,4(一),4(二),结束于5对我来说还不够。不过其余的都还不错。
我的问题是: 当列表中的项目在内联数学模式下包含显示样式分数时,如何全局调整/拉伸列表中项目之间的垂直间距?
最好不要手动向每个包含内联数学模式中的显示样式分数的环境添加选项,并且不会全局影响不包含内联数学模式中的显示样式分数的其他环境的enumerate
垂直间距和值,以免过度拉伸整个文档的长度。谢谢。sep
enumerate
答案1
这是我想出的方法。您无需弄清楚\dfrac
列表中是否存在某个位置,然后更改 sep,而是可以本地重新定义\dfrac
自身,这样它就会“更高”一点,从而模拟额外的空间。
\documentclass{article}
\usepackage{amsmath}
\usepackage{enumitem}
\setlist[enumerate]{font={\bfseries}}
\setlist[enumerate,1]{label=\arabic*., labelsep=0.5em}
\setlist[enumerate,2]{label=(\roman*), align=left, leftmargin=3em, labelwidth=2.5em}
\makeatletter
\let\enumcopy\enumerate
\let\endenumcopy\endenumerate
\let\olddfrac\dfrac
\renewenvironment{enumerate}{
\renewcommand{\dfrac}[2]{
\olddfrac{##1}{##2}
\ifnum\arabic{\@enumctr}>1
\rule{0pt}{30pt}
\fi
}
\enumcopy
}{
\endenumcopy
}
\makeatother
\begin{document}
\begin{enumerate}
\item
\begin{enumerate}
\item $\dfrac{1}{2}$
\item $\dfrac{1}{2}$
\end{enumerate}
\end{enumerate}
\end{document}
解释:
enumerate
首先,我通过执行以下操作复制环境
\let\enumcopy\enumerate
\let\endenumcopy\endenumerate
这是可行的,因为 latex 中的每个环境实际上都是两个宏\ENV
和endENV
。之后你可以enumerate
使用其自身重新定义。
\renewenvironment{enumerate}{
\enumcopy
}{
\endenumcopy
}
现在只需将重新定义的\dfrac
命令放在环境定义内enumitem
,这样它就不会影响\dfrac
文档中的任何其他地方。
我们再次需要一个副本来使用其自身重新定义它。例如,\dfrac
可以使用来增加高度。\rule{0pt}{<height>}
\let\olddfrac\dfrac
\renewcommand{\dfrac}[2]{\olddfrac{#1}{#2}\rule{0pt}{30pt}}
但是,如果\dfrac
要将其放置在列表的第一项中,则可能不需要上面的额外空间。为了解决这个问题,您可以通过以下方式检查它是否不是第一项:
\ifnum\arabic{\@enumctr}>1
<code>
\fi
其中\@enumctr
是当前级别枚举环境的计数器。
另请注意,如果您在另一个中使用它,则必须退出#1
并#2
添加额外的#
\renew...
1pt
例如,如果你将规则的宽度设置为
\rule{1pt}{30pt}
你将看到它究竟是如何工作的