![页边距中的普通 TeX 章节编号](https://linux22.com/image/313261/%E9%A1%B5%E8%BE%B9%E8%B7%9D%E4%B8%AD%E7%9A%84%E6%99%AE%E9%80%9A%20TeX%20%E7%AB%A0%E8%8A%82%E7%BC%96%E5%8F%B7.png)
我想在页边空白处排版该部分的编号。这是我要开始的 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
进入水平模式。