디센더 뒤의 \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}가 있을 때, XXX에 디센더가 있으면 텍스트의 맨 아래 줄과 줄 사이의 공간이 더 커집니다. 차라리 일정하게 유지하고 디센더를 선에 더 가깝게 두는 것이 좋습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

수직 자료 는 \hrule내부 레지스터를 재설정하기 때문에 기준선 건너뛰기 그리드를 깨뜨립니다 \prevdepth. 그러나 레지스터 값을 변수에 저장하고 \hrule이 레지스터를 인쇄하고 복원할 수 있습니다. 그런 다음 기준선 건너뛰기 그리드를 유지할 수 있습니다.

정상적인 행동:

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

를 사용하여 디센더 깊이를 제거할 수 있습니다 \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>}).

관련 정보