这个问题类似于我最近提出的问题. 其他问题涉及章节,这一个指的是部分。针对章节的解决方案似乎不适用于部分。
我正在写memoir
文档,我想使用以下方法自定义部分标题的外观蒂克兹1.到目前为止,这是有效的,如 MWE 2所示:
\documentclass[a4paper,11pt]{memoir}
\usepackage{lipsum}
\usepackage{tikz}
\usetikzlibrary{calc}
\renewcommand{\midpartskip}{}
\renewcommand{\printpartname}{}
\renewcommand{\partnamenum}{}
\renewcommand{\printpartnum}{}
\renewcommand{\printparttitle}[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) {\thepart};
\end{tikzpicture}}
\begin{document}
\part{First}
\lipsum[1-10]
\part*{Extra}
\lipsum[11-20]
\part{Last}
\lipsum[21-30]
\end{document}
这将在每个零件的开头输出零件名称和零件编号,以便将这两条信息嵌入到图形中。
不幸的是(尽管并不令人意外),中间未编号part( \part*
) 重复使用前一个部分的编号。我想隐藏该编号。因此,我的问题是:
我如何知道当前零件是否已编号?是否有任何函数可以返回这样的值,或者是否有一个函数仅在当前部分已编号时才打印其参数?
正如我已经问过的关于章节的类似问题,我首先尝试应用针对该问题建议的解决方案:
编号章节会调用该\printchapternum
命令,而未编号章节则会调用该\printchapternonum
命令。因此,这些命令中的每一个都可以替换,以设置一个标记,然后可以从 内部进行检查\printchaptertitle
。
不幸的是,虽然\printpartnum
存在零件命令,但\printpartnonum
似乎不存在类似的命令。memoir
手动的,也没有提到未编号部分,就像没有提到未编号章节和一样\printchapternonum
。因此,适用于章节的解决方案显然不适用于部分。
1:我的实际图形要复杂得多,也更吸引人。此处 MWE 中的简单图形部分标题仅用于演示目的。
2:与我的实际文档不同,此 MWE 的内容取自lipsum
包裹。
答案1
基于评论经过达莱夫,我可以通过修补来解决这个问题\@spart
:
\documentclass[a4paper,11pt]{memoir}
\usepackage{lipsum}
\newif\ifisstarredpart
\isstarredpartfalse
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{letltxmacro}
\makeatletter
\LetLtxMacro{\@oldspart}{\@spart}
\renewcommand{\@spart}[1]{\isstarredparttrue\@oldspart{#1}\isstarredpartfalse}
\makeatother
\renewcommand{\midpartskip}{}
\renewcommand{\printpartname}{}
\renewcommand{\partnamenum}{}
\renewcommand{\printpartnum}{}%{\isstarredpartfalse}
\renewcommand{\printparttitle}[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}};
\ifisstarredpart
\else
\node at (.1\textwidth, .5\baselineskip) {\thepart};
\fi
\end{tikzpicture}}
\begin{document}
\part{First}
\lipsum[1-10]
\part*{Extra}
\lipsum[11-20]
\part{Last}
\lipsum[21-30]
\end{document}
对于修补,我使用了letltxmacro
包裹,正如建议的那样另一个问题的答案。
补丁程序的工作原理是,在\@spart
评估原始版本之前,将带星号部分的标志设置为true
,之后再次设置为false
。