部分标题渐变

部分标题渐变

背景

使用 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}

相关内容