
Я пытаюсь переделать свое резюме в латексе и столкнулся с небольшой проблемой с размещением \hrule. Я определяю среду категории для каждого раздела через
\newenvironment{category}[1]
{%
{\bf{#1}}
\medskip
\hrule % Horizontal line
\medskip
\begin{itemize}[label={$-$},itemsep=0.15cm]
}
{%
\end{itemize}
\bigskip
}
Когда у меня есть \begin{category}{XXX}, пространство между нижней строкой текста и hrule становится больше, если у XXX есть подстрочные элементы. Я бы предпочел, чтобы оно оставалось постоянным, а подстрочные элементы располагались ближе к строке. Есть ли способ это сделать?
решение1
В \hrule
вертикальном материале baselineskip-grid нарушается, поскольку он сбрасывает внутренний \prevdepth
регистр. Но вы можете сохранить значение регистра в переменной, распечатать \hrule
и восстановить этот регистр. Тогда baselineskip-grid может быть сохранен.
Нормальное поведение:
Previous line
\hrule % this rule is printed immediately below the line without space.
Next line % this line is printed without space because \prevdepth is reset.
Сохранение \prevdepth
:
Previous line
\par \dimen0=\prevdepth % the \prevdepth value is saved
\hrule % this rule is printed immediately below the line without space.
\prevdepth=\dimen0 % restoring \prevdepth
Next line % this line keeps the baselineskip-grid
% but .4pt is added (the rule thickness)
Переходим \hrule
к сетке:
Previous line
\par \dimen0=\prevdepth % the \prevdepth value is saved
\kern \dimexpr 3pt-\prevdepth % the space 3pt from baseline
\hrule % hrule 3pt from previous baseline
\prevdepth=\dimen0 % restoring \prevdepth
\kern \dimexpr \prevdepth-3pt-.4pt \relax % space correction
Next line % Next line fits to baselineskip-grid.
Итак, вы можете определить \myhrule
и сделать следующее:
\newdimen\tmpdim
\def\myhrule{\par
\tmpdim=\prevdepth
\kern\dimexpr 3pt-\prevdepth
\hrule
\prevdepth=\tmpdim
\kern\dimexpr \prevdepth-3pt-.4pt \relax
}
Previous line.
\myhrule
Next line.
\bye
решение2
TeX не вставляет межстрочный клей до и после \hrule
, поэтому вам придется научить его, что вы хотите соблюдать расстояния независимо от верхних и нижних элементов. Самый простой способ — использовать распорки:
\documentclass{article}
\usepackage{enumitem}
\newenvironment{category}[1]
{\par\noindent\textbf{\strut#1\strut}
\medskip % <-------- adjust here
\hrule % Horizontal line
\medskip
\begin{itemize}[label={--},itemsep=0.15cm]
\prevdepth=\dp\strutbox
}
{\end{itemize}
\bigskip
}
\begin{document}
\hrule height 4pt % just to see the two boxes
\noindent
\begin{minipage}[t]{0.45\textwidth}
\vspace{0pt}% to set the alignment point
Some text before
\begin{category}{abcd}
\item acer
\end{category}
Some text after
\end{minipage}
\begin{minipage}[t]{0.45\textwidth}
\vspace{0pt}% to set the alignment point
Some text before
\begin{category}{ghij}
\item dgf
\end{category}
Some text after
\end{minipage}
\hrule height 4pt % just to see that the two boxes
\end{document}
«Категория» окружена распорками, и непосредственно перед печатью первого элемента мы делаем вид, что строка перед ней имеет глубину, равную глубине распорки ( \prevdepth=\dp\strutbox
).
Я набрал два примера на мини-страницах, чтобы лучше увидеть, что вертикальное выравнивание соответствует желаемому. Две жирные линии просто отмечают границы. \vspace{0pt}
В начале мини-страниц снова только для примера, он установит точку выравнивания двух блоков.
решение3
Вы можете удалить descender-depth, используя \raisebox
. Следующее определение \raisebox
содержится вsource2e.pdf
:
\raisebox{⟨distance⟩}[⟨height⟩][⟨depth⟩]{⟨box⟩}
Поднимает
⟨box⟩
вверх на⟨distance⟩
длину (вниз, если⟨distance⟩
отрицательно). Заставляет TeX думать, что новый блок простирается⟨height⟩
выше линии и⟨depth⟩
ниже, на общую вертикальную длину⟨height⟩
+⟨depth⟩
. Значения по умолчанию⟨height⟩
&⟨depth⟩
= фактическая высота и глубина блока в новом положении.
Итак, рассмотрим использование \raisebox{0pt}[\height][0pt]{<stuff>}
( \height
— естественная высота <stuff>
):
\documentclass{article}
\usepackage{enumitem}
\newenvironment{category}[1]{%
\par\noindent% No paragraph indent
\raisebox{0pt}[\height][0pt]{\textbf{#1}}\par
\medskip
\hrule% Horizontal rule
\medskip
\begin{itemize}[label={--},itemsep=.5em]
}{%
\end{itemize}
\bigskip
}
\begin{document}
Here is some content
\begin{category}{abcdef}
\item something
\item something else
\end{category}
Some more content
\begin{category}{ghijkl}
\item something
\item something else
\end{category}
\end{document}
Обратите внимание на использование \par
для входа в вертикальный режим. В противном случае (первое) использование \medskip
является излишним и выдается только позже (один раз в вертикальном режиме каким-то другим способом).
Более экстремальным может быть то \smash
, что контент вообще не занимает никакой вертикальной высоты/глубины (аналогично \raisebox{0pt}[0pt][0pt]{<stuff>}
).