有人会构建以下样式的章节标题(用于较长的报告和书籍)吗?(虚线表示实线。)
|
1.1 | SECTION HEADING (IT WOULD EXTEND AT MOST TO ABOUT
| HERE, I.E., APPROX. 2/3 OF THE PAGE)
|
以下参数应该是可调整的,以便人们可以根据自己的需要调整模板:
- 线的粗细
- 节标题文本上方和下方的行的长度
- 节标题块上方和下方的空间
- 行左右两侧的空格
- 文本框换行前的长度。
编辑。有一个小问题:垂直线在文本上方和下方的延伸量不一样(当只有一行时),如下所示。
还:这没有包含在原始问题中,但如果可以选择对数字和章节标题使用单独的字体就更好了(例如,章节编号可以是粗体,但章节标题不能,就像我正在使用的章节标题一样)。
谢谢您的解决方案,看起来非常棒。
答案1
改良版
这是使用xkeyval
包和键值方法:
代码(解释如下):
\documentclass{article}
\usepackage[explicit]{titlesec}
\usepackage{xkeyval}
\usepackage{tikz}
\usetikzlibrary{tikzmark,calc}
\usepackage{lipsum}
\newlength\LeftSep
\newlength\RightSep
\newlength\TitleWd
\newlength\VertLineWd
\newlength\SpaceBefore
\newlength\SpaceAfter
\newlength\RuleAddition
\newcommand\SectionFont{\normalfont\Large\bfseries}
\newsavebox\TitleBox
\newcounter{tmp}
\setlength\LeftSep{\marginparsep}
\setlength\RightSep{\marginparsep}
\setlength\TitleWd{0.6666\textwidth}
\setlength\VertLineWd{1pt}
\setlength\SpaceBefore{3.5ex plus 1ex minus .2ex}
\setlength\SpaceAfter{2.3ex plus .2ex}
\setlength\RuleAddition{0pt}
\makeatletter
\define@key{fctaylor}{leftsep}{\setlength\LeftSep{#1}}
\define@key{fctaylor}{rightsep}{\setlength\RightSep{#1}}
\define@key{fctaylor}{titlewidth}{\setlength\TitleWd{#1}}
\define@key{fctaylor}{verticalrulewidth}{\setlength\VertLineWd{#1}}
\define@key{fctaylor}{spacebefore}{\setlength\SpaceBefore{#1}}
\define@key{fctaylor}{spaceafter}{\setlength\SpaceAfter{#1}}
\define@key{fctaylor}{sectionfont}{\renewcommand\SectionFont{#1}}
\define@key{fctaylor}{ruleaddition}{\setlength\RuleAddition{#1}}
\newcommand\FCsectionformat[1][]{%
\setkeys{fctaylor}{#1}
\titleformat{\section}
{\SectionFont}{}{0em}
{%
\parbox[t]{1em}{\thesection}\hspace{\LeftSep}%
\stepcounter{tmp}%
\tikz[remember picture]
\draw[overlay,line width=\VertLineWd]
([xshift=-\RightSep,yshift=\dimexpr\ht\strutbox+\RuleAddition\relax]pic cs:start-\thetmp) --
( $ ({pic cs:start-\thetmp}|-{pic cs:end-\thetmp}) + (-\RightSep,\dimexpr+\ht\strutbox-\baselineskip-\RuleAddition\relax)$ );%
\hspace{\RightSep}%
\parbox[t]{\TitleWd}{%
\SectionFont\raggedright\strut%
\tikzmark{start-\thetmp}##1\tikzmark{end-\thetmp}\strut}%
}
\titleformat{name=\section,numberless}
{\SectionFont}{}{0em}
{%
\hspace*{\dimexpr1em+\LeftSep\relax}%
\stepcounter{tmp}%
\tikz[remember picture]
\draw[overlay,line width=\VertLineWd]
([xshift=-\RightSep,yshift=\dimexpr\ht\strutbox+\RuleAddition\relax]pic cs:start-\thetmp) --
( $ ({pic cs:start-\thetmp}|-{pic cs:end-\thetmp}) + (-\RightSep,\dimexpr+\ht\strutbox-\baselineskip-\RuleAddition\relax)$ );%
\hspace{\RightSep}%
\parbox[t]{\TitleWd}{%
\SectionFont\raggedright\strut%
\tikzmark{start-\thetmp}##1\tikzmark{end-\thetmp}\strut}%
}
}
\titlespacing*{\section}
{0pt}{\SpaceBefore}{\SpaceAfter}
\titlespacing*{name=\section,numberless}
{0pt}{\SpaceBefore}{\SpaceAfter}
\makeatother
\FCsectionformat
\begin{document}
\section{This is a test numbered section with a long title}
\lipsum[4]
\section*{This is a test unnumbered section with a long title}
\lipsum[4]
\section{This is a test numbered section}
\lipsum[4]
\section*{This is a test unnumbered section}
\lipsum[4]
\FCsectionformat[
leftsep=30pt,
rightsep=20pt,
verticalrulewidth=4pt,
titlewidth=\dimexpr\textwidth-2.5em-\RightSep-\LeftSep-\VertLineWd\relax,
spacebefore=1cm,
spaceafter=0.5cm,
sectionfont=\normalfont\LARGE\itshape,
ruleaddition=10pt
]
\section{This is a test numbered section with a long title}
\lipsum[4]
\section*{This is a test unnumbered section with a long title}
\lipsum[4]
\section{This is a test numbered section}
\lipsum[4]
\section*{This is a test unnumbered section}
\lipsum[4]
\end{document}
解释:
主命令是,\FCsectionformat
它可以在文档中的任何位置(在序言中或在文档正文中)根据需要多次使用;该命令有一个可选参数,可以使用逗号分隔的<key>=<value>
选项列表来更改标题属性。
可用的键有:
leftsep=<length>
,数字和垂直规则之间的分隔;默认值:\marginparsep
。rightsep=<length>
,垂直规则和标题之间的分隔;默认值:\marginparsep
。verticalrulewidth=<length>
,垂直规则的粗细;默认值:1pt
。titlewidth=<length>
,排版标题的框的宽度;默认值:0.6666\textwidth
。spacebefore=<length>
,标题前的空格;默认:3.5ex plus 1ex minus .2ex
。spaceafter==<length>
,标题后的空格;默认:2.3ex plus .2ex
。sectionfont=
,标题的字体规范;默认值:\normalfont\LARGE\itshape
。ruleaddition=<length>
,在垂直规则上方和下方添加的额外长度;默认值:0pt
。