在另一个邮政我收到了创建章节标题的代码Memoir
。我想在水平双线之间添加一些文本,如下所示:
========= Hello World======== 章节名称
(参见下面的 MWE)现在我想了解发生了什么,以便我可以用特定行修改双重规则。我花了一些令人沮丧的时间玩弄数字。没有任何东西像我期望的那样运行......我想知道是否有人可以评论代码段及其用途。首先,我想将顶部规则设为 1 pt,间隙为 .5pt,然后将下部规则设为 .5pt......但为了将来参考,我真的很想了解发生了什么。
\documentclass{memoir}
\usepackage{lipsum}
\newdimen\ruleheight \ruleheight=.4pt
\def\doublerule#1{\vbox{\setbox0=\hbox{ #1 }%
\baselineskip=3pt \lineskiplimit=-\maxdimen
\hbox to\hsize{\ruleheight=1.2pt\doubleruleA\kern\wd0\doubleruleA}%
\hbox to\hsize{\doubleruleA\box0 \doubleruleA}}}
\def\doubleruleA{{\advance\ruleheight by2pt\leaders\vrule height\ruleheight depth-1pt\hfil}}
\makechapterstyle{mychapter}{%
\renewcommand{\printchaptername}{}% suppress "Chapter" from heading
\renewcommand*{\printchapternum}{}% suppress numbering from heading
\renewcommand*{\chaptitlefont}{\centering}% title formatting
\renewcommand\afterchapternum{%
\vskip1em \cleaders\doublerule{Hello world}\vskip\baselineskip \vskip2em}
\setlength\beforechapskip{10pt}%
\setlength\afterchapskip{30pt}% adjust vertical space after the title
}
\chapterstyle{mychapter}
\begin{document}
\chapter{Sample Chapter}
\lipsum[1]
\end{document}
答案1
\def\doublerule#1{%
\vbox{
\setbox0=\hbox{ #1 }%
\baselineskip=3pt \lineskiplimit=-\maxdimen
\hbox to\hsize{\ruleheight=1.2pt\doubleruleA\kern\wd0\doubleruleA}%
\hbox to\hsize{\doubleruleA\box0 \doubleruleA}%
}%
}
\def\doubleruleA{{
\advance\ruleheight by2pt
\leaders\vrule height\ruleheight depth-1pt\hfil}}
我们来逐行看一下代码。
首先启动 a \vbox
;在其中设置一个临时框,并将参数用空格括起来。
然后\baselineskip
将 设置为 3pt,并将 设置为\lineskiplimit
意味着就行间计算而言,没有两条线会被认为太靠近彼此。
然后是一个水平框\doubleruleA
,其中包含,一个与文本(章节标题)一样宽的空白区域加上空格,然后再次\doubleruleA
;但规则的宽度设置为 1.2pt(对于较重的规则)。
此后设置第二行,具有标准规则宽度;它与之前相同,但在中间使用设置文本\box0
。
的工作原理\doubleruleA
是(局部)将规则厚度增加 2pt,但由于深度为负,因此会减少 1pt。此规则将尽可能延伸,因此它将填充 使用的框\doublerule
。
在我看来,这使得控制规则的相对位置变得相当困难。如果您想增加规则之间的空间,请按照 操作\baselineskip=3pt
。
这是我的操作方法,更清晰地设置距离和厚度。
\documentclass{memoir}
\usepackage{lipsum}
\newcommand{\upperchapterrule}{1.6pt} % upper rule
\newcommand{\lowerchapterrule}{0.8pt} % lower rule
\newcommand{\chapterrulesep}{2pt} % space between the rules
\newcommand{\chapterruleoffset}{1pt} % distance of the bottom rule from the baseline
\newcommand{\doublerule}[1]{%
\vbox{
\sbox0{ #1 }%
\dimen0=\textwidth
\advance\dimen0 by -\wd0
\divide\dimen0 by 2 % width of the rules
\noindent
\makedoublerule
\usebox{0}%
\makedoublerule
}
}
\newcommand{\makedoublerule}{%
\vbox{
\hrule width \dimen0 height \upperchapterrule
\vskip\chapterrulesep
\hrule height \lowerchapterrule
\vskip\chapterruleoffset
}%
}
\makechapterstyle{mychapter}{%
\renewcommand{\printchaptername}{}% suppress "Chapter" from heading
\renewcommand*{\printchapternum}{}% suppress numbering from heading
\renewcommand*{\chaptitlefont}{\centering}% title formatting
\renewcommand\afterchapternum{%
\vskip1em
\cleaders\doublerule{Hello world}\vskip\baselineskip
\vskip2em
}%
\setlength\beforechapskip{10pt}%
\setlength\afterchapskip{30pt}% adjust vertical space after the title
}
\chapterstyle{mychapter}
\begin{document}
\chapter{Sample Chapter}
\lipsum[1]
\end{document}
命令\makedoublerule
是主要部分:计算出所需宽度后,绘制两条规则。TeX 不会在规则之间添加行间粘连,因此我们可以确定它们之间的间距就是我们通过 指定的\vskip\chapterrulesep
。同样,与基线的偏移量也是通过 参数指定的。
该命令\doublerule
只是计算所需的宽度,然后调用\makedoublerule
,排版文本(由空格包围)并\makedoublerule
再次调用。
如果我将参数改为
\newcommand{\upperchapterrule}{0.5pt} % upper rule
\newcommand{\lowerchapterrule}{1pt} % lower rule
\newcommand{\chapterrulesep}{2.5pt} % space between the rules
\newcommand{\chapterruleoffset}{0pt} % distance of the bottom rule from the baseline