我需要没有数字且忽略任何前导空格的章节和节标题(该文档由程序 - 生成dblatex
)。以下是示例:
\documentclass[12pt]{memoir}
\usepackage{lipsum}
\setcounter{chapter}{-1}
\setcounter{section}{-1}
\renewcommand{\chaptername}{}
\renewcommand{\thechapter}{}
\renewcommand{\thesection}{}
\begin{document}
\chapter{ mychapter }
\section{ mysection }
\lipsum
\end{document}
不幸的是,虽然章节标题很完美,但节标题缩进,我猜,
- 缺失章节编号与标题文本之间的差距(
\quad
?),以及 - 前导空格
虽然我可以尝试通过 来“删除”缩进的第一部分\setsechook{\hangsecnum}
,但前导空格必须通过手动编辑来处理。我如何才能实现与章节标题相同的行为(无缩进,忽略前导空格)?
答案1
首先,如果您不想要数字,那么为什么不直接要求回忆录不要打印它们呢?\setsecnumdepth{none}
其次我同意,删除标题中的前导空格,但memoir
可以重新编码以忽略它
\makeatletter
\def\M@sect#1#2#3#4#5#6[#7][#8]#9{%
\ifheadnameref\M@gettitle{#8}\else\M@gettitle{#7}\fi%
\ifnum #2>\c@secnumdepth%
\let\@svsec\@empty%
\memsecinfo{#1}{}{#7}{#8}{#9}%
\else%
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\memsecinfo{#1}{\@nameuse{the#1}}{#7}{#8}{#9}%
\fi%
\@tempskipa #5\relax%
\ifdim \@tempskipa>\z@%
\begingroup%
#6{%
\@hangfrom{\hskip #3\relax\@svsec}%
\interlinepenalty\@M\ignorespaces #9\@@par}%
\endgroup%
\csname #1mark\endcsname{#8}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else%
\protect\numberline{\csname the#1\endcsname}%
\fi%
#7}%
\else%
\def\@svsechd{%
#6{\hskip #3\relax%
\@svsec #9}%
\csname #1mark\endcsname{#8}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else%
\protect\numberline{\csname the#1\endcsname}%
\fi%
#7}}%
\fi%
\@xsect{#5}}
\makeatother
答案2
memoir
提供\setsecnumformat
设置章节编号的命令。这包括章节编号和标题之间的空格/间隙。添加
\setsecnumformat{}
添加到文档序言中。同时删除章节标题中的空格:
\section{mysection}
或者,如果这是自动输出的一部分,您可以修补\M@sect
宏以自动删除章节标题前面的空格。 通过在文档序言中添加以下内容来执行此操作:
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter
\patchcmd{\M@sect}{\@M #9}{\@M \ignorespaces #9}{}{}
\makeatother
参见章节6 文件部门(特别是第 107 页)memoir
文档有关章节格式的更多信息。
编辑: 在谈话中你提到你实际上也使用hyperref
包裹在您的实际文档中。尽管上述方法解决了问题没有 hyperref
,它不足以满足您的更广泛需求。以下是如何解决由 引入的问题hyperref
,以及关于如何解决此类问题的一些调查分析:
可以使用in进行\patchcmd{<command>}{<search>}{<replace>}{<success>}{<failure>}
搜索和替换。为了完整起见,您可以使用for和for ,这样在编译后您将看到单词或in 。这将指示修补是否成功。这样做的原因是,有时修补程序无法执行任何操作,因为您修补了命令的错误部分(由于相似性 -仅替换第一个出现的内容),或者它无法执行任何操作,因为该命令不可修补。<search>
<replace>
<command>
\typeout{success}
<success>
\typeout{failure}
<failure>
success
failure
<jobname>.log
\patchcmd
我将序言修改如下:
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\makeatletter \show\M@sect \makeatother % \M@sect as defined in memoir
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\makeatletter \show\M@sect \makeatother % \M@sect as redefined by hyperref
在每次发出 之后,中的输出<jobname>.log
显示了 的含义。 其定义如下(当然,由于这是 的一部分,因此删除了间距/对齐):\M@sect
\show\M@sect
\M@sect
memoir
<jobname>.log
> \M@sect=macro:
#1#2#3#4#5#6[#7][#8]#9->\ifheadnameref \M@gettitle {#8}\else \M@gettitle {#7}\f
i \ifnum #2>\c@secnumdepth \let \@svsec \@empty \memsecinfo {#1}{}{#7}{#8}{#9}\
else \refstepcounter {#1}\protected@edef \@svsec {\@seccntformat {#1}\relax }\m
emsecinfo {#1}{\@nameuse {the#1}}{#7}{#8}{#9}\fi \@tempskipa #5\relax \ifdim \@
tempskipa >\z@ \begingroup #6{\@hangfrom {\hskip #3\relax \@svsec }\interlinepe
* nalty \@M #9\@@par }\endgroup \csname #1mark\endcsname {#8}\addcontentsline {to
c}{#1}{\ifnum #2>\c@secnumdepth \else \protect \numberline {\csname the#1\endcs
name }\fi #7}\else \def \@svsechd {#6{\hskip #3\relax \@svsec #9}\csname #1mark
\endcsname {#8}\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \prote
ct \numberline {\csname the#1\endcsname }\fi #7}}\fi \@xsect {#5}.
上一个\patchcmd
更正了标有 的行*
。这是\M@sect
后 hyperref
介绍:
> \M@sect=macro:
#1#2#3#4#5#6[#7][#8]#9->\ifnum #2>\c@secnumdepth \expandafter \@firstoftwo \els
e \expandafter \@secondoftwo \fi {\Hy@MakeCurrentHrefAuto {section*}\setlength
{\Hy@SectionHShift }{#3}\begingroup \toks@ {\H@old@sectm@m {#1}{#2}{#3}{#4}{#5}
{#6}[{#7}][{#8}]}\toks \tw@ \expandafter {\expandafter \Hy@SectionAnchorHref \e
xpandafter {\@currentHref }#9}\edef \x {\endgroup \the \toks@ {\the \toks \tw@
* }}\x }{\H@old@sectm@m {#1}{#2}{#3}{#4}{#5}{#6}[{#7}][{#8}]{#9}}.
\@M #9
由于在 之后没有更多的hyperref
重新定义,补丁找不到匹配项,因此不执行任何操作。我们需要在上面的重新定义\ignorespaces
之前插入- 再次用 标记。因此,我们发出#9
hyperref
\M@sect
*
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage{hyperref}% http://ctan.org/pkg/hyperref
\makeatletter
\patchcmd{\M@sect}{{#9}}{{\ignorespaces#9}}{}{}%
\makeatother
为新宏提供{\ignorespaces#9}
(而不是) 。这样补丁就可以正常工作,并且删除了节标题前面的空格。{#9}
\H@old@sectm@m