页边距中的普通 TeX 章节编号

页边距中的普通 TeX 章节编号

我想在页边空白处排版该部分的编号。这是我要开始的 MWE。

%  --- Fonts ------------------------------------------------
\font\0="Roboto Condensed Light" at 12pt\0
\font\ssa="Roboto Condensed Bold" at 24pt

%  --- Layout ------------------------------------------------
\raggedright
\parindent=0pt
\parskip=1em

%  --- Structure ---------------------------------------------
\newcount\SectionNumber

\def\Section #1\par{%
\vskip 40pt
\advance \SectionNumber by 1
{\ssa\the\SectionNumber. #1}
\vskip 8pt
}

% Start Text
\Section Project One

\input knuth

\bye

边距前的示例

我正在看这个答案并尝试在这里进行修改,所以我想到了这一点:

\def\inmargin#1{\strut\vadjust{\kern-\dp\strutbox\smash{\llap{#1}}\kern\dp\strutbox}}

\def\Section #1\par{%
\vskip 40pt
\advance \SectionNumber by 1
{\ssa\inmargin{\the\SectionNumber. }#1}
\vskip 8pt
}

这很接近,但是当节标题有降部时,它似乎对齐不正确。请参阅:

排列不齐

如您所见,1. 比应在的位置略低。如果我省略下降部,则不会出现此问题:

在此处输入图片描述

我尝试了各种方法,创建自己的框并移动它,还尝试将整个节标题的字距向外调整到边距。我并不关心采用什么方法,我只是想了解我遗漏了什么。我怀疑这与节标题文本的高度和深度有关。

答案1

让我们看看你的\inmargin宏会发生什么:

\def\inmargin#1{%
  \strut
  \vadjust{
    \kern-\dp\strutbox
    \smash{\llap{#1}}%
    \kern\dp\strutbox
  }%
}

你发出一个\strut启动水平模式的 ,因为它确实\unhcopy\strutbox。但是,你应该意识到 Plain 确实

\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width0pt}

\ssa与 24pt 的字体相比,这个字体相当小。然后你告诉 TeX,在段落排版完成后,在段落的第一行(即章节标题)后,-\dp\strutbox将插入一个垂直字距(-3.5pt)、一个包含章节编号的破框和另一个字距(3.5pt)。现在,如果章节标题有降部,它将远远超过 3.5pt,因为它使用了大字体。

您尝试修改的宏用于在左边距添加一些内容,但不知道添加的位置。对于您的情况,您知道何时必须宣布边缘中的对象:在\Section命令下。因此不需要任何技巧:只需\llap这样做。

但是,不是水平命令,因此您需要以某种方式启动它。正确的方法是发出\llap,它独立于您对 的设置而起作用。\hbox\noindent\parindent

\def\Section#1\par{%
  % be in vertical mode
  \par
  % step the section number
  \global\advance\SectionNumber by 1
  % don't bother to add vertical space if there's already
  \ifdim\lastskip<40pt \removelastskip\penalty-400 \vskip40pt\fi
  % start horizontal mode without indent
  \noindent
  % print the section number
  \llap{\ssa\the\SectionNumber. }%
  % print the section title
  {\ssa\baselineskip=32pt \interlinepenalty=10000 #1\par}%
  % no page break
  \nobreak
  % some vertical space
  \vskip 8pt
}

完整示例

%  --- Fonts ------------------------------------------------
\font\roboto="Roboto Condensed Light" at 12pt
\roboto
\font\ssa="Roboto Condensed Bold" at 24pt

%  --- Layout ------------------------------------------------
\raggedright
\parindent=0pt
\parskip=1em

%  --- Structure ---------------------------------------------
\newcount\SectionNumber

\def\Section#1\par{%
  % be in vertical mode
  \par
  % step the section number
  \global\advance\SectionNumber by 1
  % don't bother to add vertical space if there's already
  \ifdim\lastskip<40pt \removelastskip\penalty-400 \vskip40pt\fi
  % start horizontal mode without indent
  \noindent
  % print the section number
  \llap{\ssa\the\SectionNumber. }%
  % print the section title
  {\ssa\baselineskip=32pt \interlinepenalty=10000 #1\par}%
  % no page break
  \nobreak
  % some vertical space
  \vskip 8pt
}

% Start Text
\Section Project One

\input knuth

\Section Project Two

\input knuth

\bye

在此处输入图片描述

答案2

设置章节标题时,应处于水平模式。以下操作应该可以正常工作:

\def\Section #1\par{%
\vskip 40pt
\advance \SectionNumber by 1
{\leavevmode\ssa\llap{\the\SectionNumber. }#1}
\vskip 8pt
}

注意使用\leavevmode进入水平模式。

相关内容