![在 KOMA 脚本上下文中,在寄存器的节标题周围添加空格](https://linux22.com/image/364617/%E5%9C%A8%20KOMA%20%E8%84%9A%E6%9C%AC%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%AD%EF%BC%8C%E5%9C%A8%E5%AF%84%E5%AD%98%E5%99%A8%E7%9A%84%E8%8A%82%E6%A0%87%E9%A2%98%E5%91%A8%E5%9B%B4%E6%B7%BB%E5%8A%A0%E7%A9%BA%E6%A0%BC.png)
我看到了来自以下答案的回复
这个问题,我可以不用标题安全, 只有韩国科玛工具,fe 通过 \RedeclareSectionCommand[afterskip=<amount>,beforeskip=<amount>]{section}
?
标题安全很好,但它重新定义了一些 KOMA 的功能。
我的 MWE:
\documentclass{scrbook}
\usepackage{blindtext}
\usepackage{atbegshi,picture,xcolor}
%\usepackage{gridset}
% baseline grid
\newcommand{\printbaselines}{%
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
\color{red}%
\put(\dimexpr 1in+\oddsidemargin,
-\dimexpr 1in+\topmargin+\headheight+\headsep+\topskip)%
{%
\vtop to\dimexpr\vsize+\baselineskip{
\hrule
\leaders\vbox to\baselineskip{\hrule width\hsize\vfill}\vfill
}%
}%
}%
}%
}%
\printbaselines
\begin{document}
\chapter{First}
\section{Lorem I}
\Blindtext[1]
\section{Lorem II}
\Blindtext[1]
\section{Lorem III}
\Blindtext[1]
\end{document}
我尝试设置
\RedeclareSectionCommand[
beforeskip=-2\baselineskip,
afterskip=1\baselineskip]{section}
但它只对第一段起作用(并且没有\chapter
),-第二段同步丢失。
我尝试\vskipnextgrid
从gridset
之后 使用但它在某些页面上\section
不起作用。 \chapter
\section
有可能吗?(pdflatex)
答案1
\normalsize
如果所有标题都在,并且标题前后的垂直空间是的整数倍\baselineskip
,那么您想要的没有任何问题:
\documentclass[parskip=never]{scrbook}% never stretch the paragraph skips
\usepackage{blindtext}
\usepackage{atbegshi,picture,xcolor}
% baseline grid
\newcommand{\printbaselines}{%
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
\color{red}%
\put(\dimexpr 1in+\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi,
-\dimexpr 1in+\topmargin+\headheight+\headsep+\topskip)%
{%
\vtop to\dimexpr\vsize+\baselineskip{
\hrule
\leaders\vbox to\baselineskip{\hrule width\hsize\vfill}\vfill
}%
}%
}%
}%
}%
\printbaselines
\setkomafont{chapter}{\normalsize}
\setkomafont{section}{\normalsize}
\RedeclareSectionCommand[beforeskip=2\baselineskip,afterskip=1\baselineskip,afterindent=false]{chapter}
\RedeclareSectionCommand[beforeskip=2\baselineskip,afterskip=\baselineskip,runin=false,afterindent=false]{section}
\begin{document}
\chapter{First}
\section{Lorem I}
\Blindtext[1]
\section{Lorem II}
\Blindtext[1]
\section{Lorem III}
\Blindtext[2]
\section{Lorm IV}
\Blindtext[1]
\end{document}
但是,如果要允许使用其他字体大小的标题,则需要付出额外的努力才能使每个标题的高度\baselineskip
再次成为正常高度的整数倍。在这种情况下,您必须将每个标题放入一个框中,测量此框的高度和深度,如果不是正常的倍数,则更改高度和深度\baselineskip
,然后打印更改后的框。这可以通过重新定义\chapterlinesformat
和来完成\sectionlinesformat
,例如,
\documentclass[parskip=never]{scrbook}
\usepackage{blindtext}
\usepackage{atbegshi,picture,xcolor}
% baseline grid
\newcommand{\printbaselines}{%
\AtBeginShipout{%
\AtBeginShipoutUpperLeft{%
\color{red}%
\put(\dimexpr 1in+\ifodd\value{page}\oddsidemargin\else\evensidemargin\fi,
-\dimexpr 1in+\topmargin+\headheight+\headsep+\topskip)%
{%
\vtop to\dimexpr\vsize+\baselineskip{
\hrule
\leaders\vbox to\baselineskip{\hrule width\hsize\vfill}\vfill
}%
}%
}%
}%
}%
\printbaselines
\newlength{\gridbaselineskip}
\newlength{\gridstrutheight}
\newlength{\gridstrutdepth}
\AtBeginDocument{%
\setlength{\gridbaselineskip}{\baselineskip}
\setlength{\gridstrutheight}{\ht\strutbox}
\setlength{\gridstrutdepth}{\dp\strutbox}
\RedeclareSectionCommand[beforeskip=2\gridbaselineskip,afterskip=1\gridbaselineskip,afterindent=false]{chapter}
\RedeclareSectionCommand[beforeskip=2\gridbaselineskip,afterskip=1\gridbaselineskip,runin=false,afterindent=false]{section}
}
\newcommand*{\usegridbox}[1]{%
% independent from the real height and depth use the height an depth of one grid-line
\ht#1\gridstrutheight
\dp#1\gridstrutdepth
\normalsize\usebox#1\par
}
\makeatletter
\renewcommand*{\chapterlinesformat}[3]{%
\sbox\@tempboxa{\@hangfrom{#2}{#3}}%
\usegridbox\@tempboxa
}
\renewcommand*{\sectionlinesformat}[4]{%
\sbox\@tempboxa{\@hangfrom{\hskip#2#3}{#4}}%
\usegridbox\@tempboxa
}
\makeatother
\begin{document}
\chapter{First}
\section{Lorem I}
\Blindtext[1]
\section{Lorem II}
\Blindtext[1]
\section{Lorem III}
\Blindtext[2]
\section{Lorm IV}
\Blindtext[1]
\end{document}
注意,这里我使用了一个非常简单的框大小更改:始终将标题的高度和深度设置为一条网格线的高度和深度。如果标题有多行,则必须使用更智能的方法来平衡标题前后所需的额外空间。然后,您还必须考虑标题多行的网格设置。使用所示的简单解决方案,一行标题始终与网格对齐。