
Я использую его thmtools
для набора теорем.
Мне нужен следующий результат:
Мой вопрос касается управления интервалом между буквами \hrule
s над и под окружением теоремы.
Я хочу, чтобы расстояние между hrule
s и абзацами выше и ниже теоремы было таким же, как и расстояние между двумя соседними абзацами.
Мой текущий код для thmtools:
\declaretheoremstyle[
...definitions about fonts..
preheadhook=\vskip\parskip\hrule\relax,
postfoothook=\hrule\relax,
spaceabove=10pt,
spacebelow=10pt
]{definition}
\declaretheorem[name=Theorem,numberwithin=chapter,style=definition]{theorem}
Я не уверен, что код latex для postfoothook
и preheadhook
правильный. С одной стороны, если я не изменю \parskip
(т. е. использую значение по умолчанию 0pt), hrules будут напечатаны рядом с текстом выше и ниже, как и ожидалось.
Но если я передам значение, как в \setlength{\parskip}{12pt}
, я не думаю, что разделение между hrules и абзацами выше и ниже действительно составляет 12 пунктов (после измерения расстояний с помощью моего PDF-ридера).
Я не прав? Как мне проверить это более систематически? Какие команды latex передать двум хукам, чтобы я все сделал правильно?
Мой код:
\documentclass{book}
\usepackage{amsthm,thmtools,kantlipsum}
\setlength{\parskip}{12pt}
\setlength{\parindent}{0pt}
\declaretheoremstyle[
headfont=\normalfont\bfseries,
notefont=\normalfont\bfseries,
headpunct={},
postheadspace=\newline,
bodyfont = \normalfont,
postfoothook=\hrule\relax,
preheadhook=\vskip\parskip\hrule\relax,
spaceabove=10pt,
spacebelow=10pt
]{definition}
\declaretheorem[name=Theorem,numberwithin=chapter,style=definition]{theorem}
\begin{document}
%\chapter{Introduction}
\kant[1-2]
\begin{theorem}
Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt id. Sagittis nisl rhoncus.
\end{theorem}
\kant[3][1-3]
\end{document}
решение1
Для измерения вертикальных зазоров \tikzmark
в выбранных местах было добавлено несколько линий, а затем с помощью tikzpicture
.
Видетьс использованием библиотеки tikzmark.Но для этого примера вам не нужно понимать код tikz..
Как видно на рисунке, пространство над и под ним \hrule
составляет 10 пунктов, как и ожидалось (зеленые линии).
Внутри baselineskip
теоремы размер шрифта составляет 12 пунктов (значение по умолчанию для класса книги с размером шрифта 10 пунктов), а в документе baselineskip + parskip равен 24 пунктам из-за 12 пунктов, добавленных с помощью parskip
. (оранжевые линии)
Имеется несоответствие расстояния между базовой линией верхней и нижней текстовых строк и hrule
(красные линии, 14pt и 12pt соответственно. Требуется >> обе 17pt).
Чтобы получить желаемый интервал
(1) Используется. \usepackage[skip=12pt]{parskip}
Будет установлено, что абзацы не будут иметь отступов, а parskip=12pt.
(2) Добавьте вертикальные пробелы до и после правил, чтобы они соответствовали желаемому пробелу в 17 пунктов между абзацами.
Результат сейчас
Это код, используемый для регулировки и измерения. Он будет автоматически регулироваться, если skip
или \abovebelow
длина будут изменены.
\documentclass[10pt]{book}
\usepackage{amsthm,thmtools,kantlipsum}
\usepackage{tikz}% needed <<<<<<<<<<
\usetikzlibrary{calc,tikzmark} % needed <<<<<<<<<<
\usepackage[autolanguage]{numprint}% needed <<<<<<<<<<
\usepackage[skip=12pt]{parskip} % added <<<<<<<<<<<<
\newlength{\abovebelow} \setlength{\abovebelow}{10pt} % set spaces above & below <<<<<<<<<
\newlength{\htX} \settoheight{\htX}{X} % adjust to font size
\newlength{\dtp} \settodepth{\dtp}{p}
\declaretheoremstyle[
headfont=\normalfont\tikzmark{b}, % added a mark <<<<<<
notefont=\normalfont\bfseries,
headpunct={\tikzmark{c}}, % added a mark <<<<<<
postheadspace=\newline,
bodyfont = \normalfont,
postfoothook= \hrule height 0.1pt \vspace*{\dimexpr \baselineskip -\htX},% changed <<<<<<
preheadhook=\vspace*{\dimexpr \baselineskip + \parskip- \htX- \dtp}\hrule height 0.1pt\vspace*{-\parskip}, % changed <<<<<<
spaceabove=\abovebelow,% changed <<<<<<
spacebelow=\abovebelow,% changed <<<<<<
]{definition}
\declaretheorem[name=Xheorem,numberwithin=chapter,style=definition]{theorem}
\begin{document}
X Some text
\tikzmark{g}Upper text.\tikzmark{a} % added a mark <<<<<<
\begin{theorem}
Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt id. Sagittis nisl rhoncus.\tikzmark{d} % added a mark <<<<<<
\end{theorem}
\tikzmark{f}Lower text.\tikzmark{e} % added a mark <<<<<<
% measure/check vertical spaces <<<<<<<<<<<<
\nprounddigits{1}
\newlength{\bs}\setlength{\bs}{\baselineskip}%
\newlength{\pp} \setlength{\pp}{\dimexpr \baselineskip + \parskip}%
\newlength{\ub} \setlength{\ub}{\dimexpr \baselineskip + \parskip- \htX}%
\newlength{\br} \setlength{\br}{\dimexpr 2\baselineskip -\htX}%
\begin{tikzpicture}[overlay,remember picture, every node/.style={right,midway,font=\tiny}]
\draw [color=red]($ (pic cs:a) +(-1pt,0pt) $ ) -- ($ (pic cs:a) +(-1pt,-\ub) $) node[fill=gray!10]{$\lenprint{\ub}$}; % upper blank
\draw [color=green]($ (pic cs:b) +(2pt,\htX) $ ) -- ($ (pic cs:b) +(2pt,\abovebelow+\htX) $) node{\the\abovebelow}; %upper
\draw [color=green]($ (pic cs:d) +(-1pt,0pt) $ ) -- ($ (pic cs:d) +(-1pt,-\abovebelow) $) node{\the\abovebelow}; %lower
\draw [color=red]($ (pic cs:f) +(2pt,\htX) $ ) -- ($ (pic cs:f) +(2pt,\ub+\htX) $) node[fill=gray!10]{$\lenprint{\ub}$}; %blank to rule
\draw [color=orange]($ (pic cs:d) +(-1pt,0pt) $ ) -- ($ (pic cs:d) +(-1pt,\baselineskip) $) node{\the\bs}; % baselineskip
\draw [color=orange]($ (pic cs:a) +(-1pt,0pt) $ ) -- ($ (pic cs:a) +(-1pt,\pp) $) node{\the\pp}; % baselineskip+parskip
\draw [color=red]($ (pic cs:g) +(2pt,\htX) $ ) -- ($ (pic cs:g) +(2pt,\ub +\htX) $) node[fill=gray!10]{$\lenprint{\ub}$}; %blamk to rule
\end{tikzpicture}
\end{document}
Это окончательный рабочий код, использующий приведенные выше результаты.
\documentclass[10pt]{book}
\usepackage{amsthm,thmtools,kantlipsum}
\usepackage[skip=12pt]{parskip} % added <<<<<<<<<<<<
\newlength{\abovebelow} \setlength{\abovebelow}{10pt} % set spaces above & below <<<<<<<<<
\newlength{\htX} \settoheight{\htX}{X} % adjust to font size
\newlength{\dtp} \settodepth{\dtp}{p}
\declaretheoremstyle[
headfont=\normalfont\bfseries, %
notefont=\normalfont\bfseries,
headpunct={}, %
postheadspace=\newline,
bodyfont = \normalfont,
postfoothook= \hrule \vspace*{\dimexpr \baselineskip -\htX},% changed <<<<<<
preheadhook=\vspace*{\dimexpr \baselineskip + \parskip- \htX- \dtp}\hrule \vspace*{-\parskip}, % changed <<<<<<
spaceabove=\abovebelow,% changed <<<<<<
spacebelow=\abovebelow,% changed <<<<<<
]{definition}
\declaretheorem[name=Theorem,numberwithin=chapter,style=definition]{theorem}
\begin{document}
\kant[1-2]
\begin{theorem}
Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt id. Sagittis nisl rhoncus.
\end{theorem}
\kant[3][1-3]
\end{document}