如何区分编号章节和未编号章节?

如何区分编号章节和未编号章节?

我正在写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}

在此处输入图片描述 在此处输入图片描述

相关内容