网格排版的分段命令间距

网格排版的分段命令间距

我知道关于网格排版的问题之前问过,还有一些包(gridgridpos)。我目前遇到的情况比这更简单,主要是关于弹性长度的问题。我并不是说结果是优秀的排版,但我很好奇是否可以以及如何做到这一点:)

在排版我的论文时,我有一页是\textheight的倍数\baselineskip,所以我可以在页面中恰好放入 34 行文本。样式文件将部分和子部分命令定义为

\renewcommand\section{\@startsection {section}{1}{\z@}%
       {-3.5ex \@plus -1ex \@minus -.2ex}%
       {2.3ex \@plus.2ex}%
       {\def\baselinestretch{1.0}\reset@font\normalsize\bfseries\slshape}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
       {-3.25ex\@plus -1ex \@minus -.2ex}%
       {1.5ex \@plus .2ex}%
       {\reset@font\normalsize\mdseries\itshape}}

(据我所知,这些都是从网上其他地方复制粘贴的,没有任何特别的韵律或理由。为什么章节标题周围的空间与字体的 x 高度有关?)

在有 0 个或 2 个以上节标题的页面上,标题周围有足够的可拉伸性来解释其非整数倍高度\baselineskip。在有 1 个节标题的页面上在页面中间,标题前后的可伸缩性再次足够。但在页面中以节标题为第一项的页面上,标题前的空间及其可伸缩性被省略,因此我得到的是欠完整的\vboxes。

我的问题是,有没有办法改变这些定义中的空格,以便当节标题开始一页时,它会跳过一整行,但当它位于页面中间时,它会使用这些较小的可拉伸性?手动解决方案是\vspace*{0pt plus 0.5\baselineskip}在每个有问题的节标题处插入,这让 TeX “向上舍入”到下一个最近的行,但如果我只是在任何地方插入该间距,那么 TeX 会在不需要时使用该拉伸...我尝试查看和的内部定义\@startsection\@ssect但我没有看到任何方法让它们检测何时从页面中省略了前空格。

答案1

正如您所说,ex(和em)长度是相对于当前使用的字体的。 原因取决于应用程序。 在您的例子中,使用特定于字体大小的长度是有意义的,因为排版部分标题可能会有所不同,具体取决于文档是使用10pt11pt还是12pt(或就此而言,任何其他字体大小)作为 进行处理\normalfont。 例如,如果更改字体大小,使用绝对长度(例如ptbppc)可能会导致部分标题和文本之间的间隙看起来太小或太大。 下面的示例在伪部分标题之间基于字体的 跳过被固定宽度跳过(以或大致 为,请参阅 TeX Book,第 60 页)1em替换):11.5pt10pt1em11.5pt

在此处输入图片描述

\documentclass{article}
\begin{document}
\bfseries% For bold font

{\normalfont Font-based skip of \verb!1em!} \par \medskip

\newcommand{\myskip}{\unskip\rule[0.5ex]{1em}{1pt}\ignorespaces}
{\normalsize 1 \myskip A section \par}%
{\large 1 \myskip A section \par}%
{\Large 1 \myskip A section \par}%
{\LARGE 1 \myskip A section \par}%
{\Huge 1 \myskip A section \par}%

\bigskip \hrulefill \bigskip

{\normalfont Fixed-width skip of \verb!11.5pt!} \par \medskip

\renewcommand{\myskip}{\unskip\rule[0.5ex]{11.5pt}{1pt}\ignorespaces}
{\normalsize 1 \myskip A section \par}%
{\large 1 \myskip A section \par}%
{\Large 1 \myskip A section \par}%
{\LARGE 1 \myskip A section \par}%
{\Huge 1 \myskip A section \par}%
\end{document}

由于我不是完全不确定你的分节意图(差点出错),这里有一个关于分页问题的建议。needspace包裹\needspace{<len>}规定\break如果页面上的可用空间不足,则发出<len>一个。而且,代码并不复杂。这是一个修改后的版本,现在为了便于讨论,它采用了 3 个参数:

\makeatletter
% \needspace{<len>}{<NOT enough space>}{<enough space>}
\newcommand{\needspace}[3]{\par \penalty-100\begingroup
  \setlength{\dimen@}{#1}%
  \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
  \ifdim \dimen@>\dimen@ii% execute the following if there IS NOT enough space on page
    \ifdim \dimen@ii>\z@
      \vfil
    \fi
    \break
    #2% <NOT enough space>
  \else% execute the following if there IS enough space on page
    #3% <enough space>
  \fi\endgroup}
\makeatother

可以重新定义\section以便使用上述内容并确定应该调用\needspace的类型。\@startsection

答案2

看一下ConTeXt,它有一个网格选项,或者尝试一下 KOMA-Script 的实验包http://www.komascript.de/gridset

答案3

您是否尝试过类似这样的事情(未经测试):

\vspace{0pt plus -0.5\baselineskip}
\vspace*{0pt plus 0.5\baselineskip}

这样,在页面的开始处第一个\vspace消失并且你得到第二个,但是在其他地方它们互相抵消。

相关内容