\hrule после выносных элементов

\hrule после выносных элементов

Я пытаюсь переделать свое резюме в латексе и столкнулся с небольшой проблемой с размещением \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>}).

Связанный контент