除非为空,否则换行

除非为空,否则换行

我正在尝试编写一个宏,用一条水平线结束一个组。如果该行非空,它应该添加换行符和水平线。如果该行是空的,例如该组以等式结尾,它应该只添加水平线。

我知道有些快速修复方法并不符合我的需要,例如,我可以离开垂直模式,不管之前发生了什么都断开线条并添加水平线。但是,如果组以等式结尾,则垂直空间太大。

语境: 我想定义一个定义环境,该定义环境在视觉上通过水平线与周围文本分开。为此,我使用以下定理样式定义amsthmthmtools

\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

我设法找到了一种解决方法,将结尾移到hlinepostfoothook 中,这样就thmtools可以帮我处理换行符了。通过将设置spacebelow0pt并将垂直空间也移到 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}

相关内容