
일반 TeX 및 파생 형식에서 신축성/수축성 길이 개념, 일명 a접착제또는건너뛰다또는고무 길이존재하며 일반적으로 다음과 같이 정의됩니다.
<dimen> plus <stretch-dimen> minus <shrink-dimen>
여기서 <dimen>
는 기본 치수이고 <stretch-dimen>
는 <shrink-dimen>
최대 늘이기 및 수축 값입니다. 건너뛰기 길이는 컨테이너에 맞게 이 범위 내에서 조정됩니다.
TeX 계산의 가장 작은 단위는 축척된 점이므로 1sp
모든 늘이기/축소 계산은 이 수준에서 양자화된다고 가정합니다.
건너뛰기 길이의 "양자화 단위"를 변경할 수 있습니까? 내 생각에는 그렇지 않다고 생각합니다. 왜냐하면 이것은 프리미티브의 (내부) 깊은 곳에 있기 때문입니다. 하지만 저는 TeXpert와는 거리가 멀고, 가능하다면 그리드와 같은 조판 작업에 유용할 수 있다고 생각합니다.
다음은 일반 TeX 코드로 일반적인 아이디어를 설정하는 훨씬 단순화된 MWE입니다.
\def\z{\hbox to 0pt{\hss\strut\vrule\hss}}
\def\zz{\z\hskip4pt}
\def\zzz{\zz\zz\zz\zz\zz}
x\z\hskip12pt plus 12pt minus 0pt %step 4pt
\z
x\z\hskip16pt plus 12pt minus 0pt %step 4pt
\z
x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt %step 4pt
\z\hfill}
x\zzz\zzz\zzz\zzz
\bye
이는 다음을 생성합니다.
처음 두 줄에서는 기본 차원이 사용되므로 규칙은 "그리드"(마지막 줄)에 맞춰 정렬됩니다. 그러나 두 번째 줄에서는 그리드 간격의 배수가 아닌 신축 구성 요소가 사용되므로 규칙이 정렬되지 않습니다.
스트레치 구성 요소가 가장 가까운 그리드 간격의 배수(여기서는 4pt
)에 맞춰지도록 "양자화"를 조정하는 방법이 있습니까?
답변1
"더하기 및 빼기" 결과의 계산은 컴퓨터에 따른 숫자 구현을 사용하여 TeX에서 수행되므로 Knuth는 문서에서 컴퓨터에 따른 결과를 생성하는 것을 비활성화하기 위해 매크로 프로그래머가 이러한 결과에 액세스할 가능성이 없다고 결정했습니다. 매크로 언어.
매크로를 제안합니다 \roundto{dimen}
. 이 매크로는 이전 상자의 너비를 "dimen"의 곱으로 다시 계산합니다. 이 예의 사용법은 다음과 같습니다.
x\hbox to 23pt{\z\hfill\hskip16pt plus 12pt minus 0pt \z\hfill}
x\hbox{\z\hskip16pt}\hbox to\dimexpr(23pt-16pt)/2{\hfil}\roundto{4pt}\z
x\zzz\zzz\zzz\zzz
귀하의 예 (첫 번째 줄) 에는 23pt에 고정 \hskip16pt
플러스가 포함되어 있습니다. 2*\hfill
그래서 각각 공간을 \hfill
차지합니다 (23pt-16pt)/2
. 는 \z
첫 번째 이후 \hfill
이므로 내 예의 두 번째 상자에는 이 차원이 있습니다. 그리고 \roundto
매크로는 이 상자의 너비를 4pt의 배수로 반올림합니다. \z
반올림 후 인쇄됩니다 .
매크로 \roundbox
는 다음과 같이 구현할 수 있습니다.
\newcount\tmpnum
\def\roundto#1{\setbox0=\lastbox \tmpnum=\wd0 \dimen0=#1\relax
% \advance\tmpnum by\dimexpr \dimen0/2\relax
% uncomment this ^ ^, if you need "central" roundning
% \advance\tmpnum by\dimen0 \advance\tmpnum by-1
% uncomment this ^ ^, if you need "upper" roundning
\divide\tmpnum by\dimen0 \multiply\tmpnum by\dimen0
\wd0=\the\tmpnum sp
\box0
}
매크로 의 의미있는 사용법 \roundto
:
x\hbox{\z various text\quad}\roundto{4pt}\z next text is aligned.
x\zzz\zzz\zzz\zzz