背景
使用 KOMA Script 编写手册。默认字体很完美,不需要更改。
问题
KOMA Script 生成以下部分大纲:
所需的轮廓类似于以下内容(渐变扩展到左边距和右边距):
我遇到的困扰:
- 数字和文字的字体发生了变化。
- 保留文本间距。
- 将渐变框扩展或延伸至:
- 左边距和右边距(
\textwidth
?);以及 - 比部分(或小节)文本的顶部和底部边距稍大。
- 左边距和右边距(
源代码
我的第一次尝试类似于:
\let\oldsection\section
\renewcommand{\section}[1]{%
\oldsection[#1]{
\setlength\fboxrule{0pt}%
\setlength\fboxsep{0pt}%
\tikz[background rectangle/.style={left color=blue!20,right color=white},
show background rectangle]
\node [inner sep=0pt] (0,0) {#1};%
}
}
得出的结果为:
更新
更改节点的文本宽度有助于:
\node [text width=\textwidth, inner sep=0pt] (0,0) {#1};%
得出的结果为:
有关的
问题
如何实现比文本稍大的边距到边距渐变(最好使用 TikZ)?
答案1
使用这个包可以相对容易地实现titlesec
:
\documentclass{scrbook}
\usepackage{tikz,titlesec}
\usepackage[english]{babel}
\usepackage{blindtext} % for a test document
\titleformat{\section}[block]%
{\usekomafont{sectioning}\usekomafont{section}%
\tikz[overlay] \shade[left color=blue!20,right color=white] (0,-1ex) rectangle (\textwidth,1em);}%
{\thesection}%
{1em}%
{}
\begin{document}
\blinddocument
\end{document}
请注意以下几点:
\usekomafont{sectioning}\usekomafont{section}
使用 KOMA Script 样式机制将字体设置为所选的字体。该
[overlay]
选项\tikz
意味着 TikZ 不会占用任何空间。如果标题长度超过一行,则会中断。
编辑:这是第二个版本,它适用于长行,并且不会忽略上升部和下降部。不过,代码更复杂。它使用 TikZ 绘制整个节标题。
\documentclass{scrbook}
\usepackage{tikz,titlesec}
\usetikzlibrary{calc}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\newcommand\boxedsection[1]{{%
\usekomafont{sectioning}\usekomafont{section}%
\begin{tikzpicture}[inner sep=0pt, inner ysep=0.3ex]
\node[anchor=base west] at (0,0) (counter) {\thesection};
\path let \p1 = (counter.base east) in node[anchor=base west, text width={\textwidth-\x1-0.33em}] (content) at ($(counter.base east)+(0.33em,0)$) {#1};
\begin{pgfonlayer}{background}
\shade[left color=blue!20,right color=white] let \p1=(counter.north), \p2=(content.north) in
(0,{max(\y1,\y2)}) rectangle (content.south east);
\end{pgfonlayer}
\end{tikzpicture}%
}}
\titleformat{\section}%
{}%
{}%
{0pt}%
{\boxedsection}%
\begin{document}
\chapter{test}
\section{Overview}
\section{Implementation}
\section{a very long section entry a very long section entry a very long section entry a very long section entry a very long section entry}
\end{document}
答案2
不建议titlesec
与 KOMA-Script 类一起使用。但使用 KOMA-Script 3.19 或更新版本,您可以重新定义\sectionlinesformat
以获得所需的部分标题布局。
\usepackage{tikz}
\makeatletter
\renewcommand\sectionlinesformat[4]{%
\ifstr{#1}{section}
{\tikz\node[inner xsep=0pt,inner ysep=0.3ex,left color=blue!20,right color=white]
{\parbox{\textwidth}{\raggedsection\@hangfrom{\hspace*{#2}#3}{#4}}};}
{\@hangfrom{\hspace*{#2}#3}{#4}}%
}
\makeatother
请注意,这也适用于\addsec
和\section*
。
代码:
\documentclass{scrbook}
%\providecommand*\Ifstr{\ifstr}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage{tikz}
\makeatletter
\renewcommand\sectionlinesformat[4]{%
\Ifstr{#1}{section}
{\tikz\node[inner xsep=0pt,inner ysep=0.3ex,left color=blue!20,right color=white]
{\parbox{\textwidth}{\raggedsection\@hangfrom{\hspace*{#2}#3}{#4}}};}
{\@hangfrom{\hspace*{#2}#3}{#4}}%
}
\makeatother
\usepackage{blindtext} %dummy text
\begin{document}
\tableofcontents
\chapter{test}
\section{Overview}
\addsec{Section without number}
\section*{Second section without number}
\section{Implementation}
\section{a very long section entry a very long section entry a very long section entry a very long section entry a very long section entry}
\Blindtext
\end{document}