我正在尝试编写一个宏,用一条水平线结束一个组。如果该行非空,它应该添加换行符和水平线。如果该行是空的,例如该组以等式结尾,它应该只添加水平线。
我知道有些快速修复方法并不符合我的需要,例如,我可以离开垂直模式,不管之前发生了什么都断开线条并添加水平线。但是,如果组以等式结尾,则垂直空间太大。
语境:
我想定义一个定义环境,该定义环境在视觉上通过水平线与周围文本分开。为此,我使用以下定理样式定义amsthm
和thmtools
:
\usepackage{amsthm}
\usepackage{thmtools}
\newcommand*\Vhrulefill[1]{\leavevmode\leaders\hrule height 1ex depth \dimexpr#1-1ex\hfill\kern0pt\noindent}
\newcommand*{\defheaderline}{{\color{lightgray}\Vhrulefill{1pt}}\newline}
\declaretheoremstyle[
headfont=\bfseries,
numbered=unless unique,
bodyfont=\normalfont,
spaceabove=\topsep,
postheadspace=1em,
headpunct={},
postheadhook=\defheaderline, % hline starting after the def label until end of line
prefoothook=\noindent\defheaderline, % <- problem is here: needs to break line unless it is empty
spacebelow=0.5\topsep,
]{sepdef}
另一个选择是将行放在 中postfoothook
。然而,这通常会导致定义完成,然后出现分页符,然后是下一页上的水平线 --- 这与我的想法并不完全一致。
谢谢你的帮助!
这是一个(当然不是最小的)工作示例:
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xcolor}
\usepackage{blindtext}
\newcommand*\Vhrulefill[1]{\leavevmode\leaders\hrule height 1ex depth \dimexpr#1-1ex\hfill\kern0pt\noindent}
\newcommand*{\defheaderline}{{\color{lightgray}\Vhrulefill{1pt}}\newline}
\declaretheoremstyle[
postheadhook=\defheaderline, % hline starting after the def label until end of line
prefoothook=\noindent\defheaderline, % <- problem is here: needs to break line unless it is empty
]{sepdef}
\declaretheorem[
style=sepdef,
]{definition}
\begin{document}
\begin{definition}
\blindtext[1]
This definition ends in text.
\end{definition}
\begin{definition}
This definition ends in a formula.
\[ \epsilon < 0 \]
\end{definition}
Lastly, the following definition is not visually separated, so I want the concluding line to be in its own line.
\begin{definition}
\blindtext[1]
\end{definition}
\end{document}
答案1
我设法找到了一种解决方法,将结尾移到hline
postfoothook 中,这样就thmtools
可以帮我处理换行符了。通过将设置spacebelow
为0pt
并将垂直空间也移到 postfoothook 中,可以缓解分页符的问题。因此,定理样式如下所示:
\declaretheoremstyle[
headfont=\bfseries,
numbered=unless unique,
bodyfont=\normalfont,
spaceabove=\topsep,
postheadspace=1em,
headpunct={},
postheadhook=\defheaderline,
postfoothook=\noindent\defheaderline\vspace{.5\topsep},
spacebelow=0pt,
]{sepdef}