我正在写memoir
文档,我想使用以下方法自定义章节标题的外观蒂克兹1.到目前为止,这是有效的,如 MWE 2所示:
\documentclass[a4paper,11pt]{memoir}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}
\renewcommand{\chapterheadstart}{}
\renewcommand{\printchaptername}{}
\renewcommand{\chapternamenum}{}
\renewcommand{\printchapternum}{}
\renewcommand{\afterchapternum}{}
\renewcommand{\printchaptertitle}[1]{\noindent\Huge\begin{tikzpicture}
\clip (0,0) rectangle (\textwidth,\baselineskip);
\node (bottomleft) at (0,0) {};
\node (topright) at (\textwidth,\baselineskip) {};
\draw[red] (bottomleft.center) -- (topright.center);
\node at ($(bottomleft)!0.5!(topright)$) {\textbf{#1}};
\node at (.1\textwidth, .5\baselineskip) {\thechapter};
\end{tikzpicture}}
\begin{document}
\chapter{First}
\lipsum[1-10]
\chapter*{Extra}
\lipsum[11-20]
\chapter{Last}
\lipsum[21-30]
\end{document}
这将在每个章节的开头输出章节名称和章节编号,以便将这两条信息嵌入到图形中。
不幸的是(尽管并不令人意外),中间未编号chapter( \chapter*
) 重复使用上一章的编号。我想隐藏该编号。因此,我的问题是:
我如何才能知道当前章节是否已编号?是否有任何函数可以返回这样的值,或者是否有一个函数仅在当前章节已编号时才打印其参数?
1:我的实际图形要复杂得多,也更吸引人。此处 MWE 中的简单图形章节标题仅用于演示目的。
2:与我的实际文档不同,此 MWE 的内容取自lipsum
包裹。
答案1
以下是如何memoir
构建章节标题
编号:
\chapterheadstart % vert space
\printchaptername
\chapternamenum % space between chapter name and num
\printchapternum
\afterchapternum % mid space
\printchaptertitle{Title}
\afterchaptertitle % space below
未编号:
\chapterheadstart % vert space
\printchapternonum % empty by default
\printchaptertitle{Title}
\afterchaptertitle % space below
在构建章节样式时,完全可以放弃其中一些宏并将功能移至其他宏。例如,然后\printchapternonum
可用于运行开关,以便\printerchaptertitle
知道它在未编号的上下文中使用。
因此,使用 Christians 解决方案并内置测试\printchaptertitle
,只需添加
\renewcommand\printchapternonum{\isstarredchaptertrue}
该代码适用于编号和未编号的章节。
为了完整性,这里对 Christians 的代码进行了稍微修改,无需修补。
\documentclass[a4paper,11pt]{memoir}
\newif\ifisstarredchapter
% false by default
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}
\renewcommand{\chapterheadstart}{}
\renewcommand{\printchaptername}{}
\renewcommand{\chapternamenum}{}
\renewcommand{\printchapternum}{}
\renewcommand{\afterchapternum}{}
\renewcommand{\printchaptertitle}[1]{\Huge\begin{tikzpicture}
\node (bottomleft) at (0,0) {};
\node (topright) at (\textwidth,\baselineskip) {};
\draw[red] (bottomleft) -- (topright);
\node at ($(bottomleft)!0.5!(topright)$) {\textbf{#1}};
\ifisstarredchapter
\else
\node at (.1\textwidth, .5\baselineskip) {\thechapter};
\fi
\end{tikzpicture}}
\renewcommand\printchapternonum{\isstarredchaptertrue}
\begin{document}
\chapter{First}
\lipsum[1-10]
\chapter*{Extra}
\lipsum[11-20]
\chapter{Last}
\lipsum[21-30]
\end{document}
答案2
此解决方案挂接到\@makechapterhead
和\@makeschapterhead
命令,负责未加星号和加星号的章节包。它会\ifstarredchapter
相应地切换条件,然后在tikzpicture
环境中使用该条件来决定是否应打印章节号。
\documentclass[a4paper,11pt]{memoir}
\usepackage{xpatch}
\newif\ifisstarredchapter
\isstarredchapterfalse
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}
\renewcommand{\chapterheadstart}{}
\renewcommand{\printchaptername}{}
\renewcommand{\chapternamenum}{}
\renewcommand{\printchapternum}{}
\renewcommand{\afterchapternum}{}
\renewcommand{\printchaptertitle}[1]{\Huge\begin{tikzpicture}
\node (bottomleft) at (0,0) {};
\node (topright) at (\textwidth,\baselineskip) {};
\draw[red] (bottomleft) -- (topright);
\node at ($(bottomleft)!0.5!(topright)$) {\textbf{#1}};
\ifisstarredchapter
\else
\node at (.1\textwidth, .5\baselineskip) {\thechapter};
\fi
\end{tikzpicture}}
\makeatletter
\xpatchcmd{\@makechapterhead}{%
\chapterheadstart% \vspace*{50\p@}%
}{%
\isstarredchapterfalse% No, this is not a starred chapter
\chapterheadstart% \vspace*{50\p@}%
}{\typeout{success}}{}
\xpatchcmd{\@makeschapterhead}{%
\chapterheadstart%
}{%
\isstarredchaptertrue% Yes, this is starred chapter.
\chapterheadstart%
}{\typeout{Success}}{}
\begin{document}
\chapter{First}
\lipsum[1-10]
\chapter*{Extra}
\lipsum[11-20]
\chapter{Last}
\lipsum[21-30]
\end{document}