回忆录章节标题中的空格

回忆录章节标题中的空格

我需要没有数字且忽略任何前导空格的章节和节标题(该文档由程序 - 生成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}

不幸的是,虽然章节标题很完美,但节标题缩进,我猜,

  1. 缺失章节编号与标题文本之间的差距(\quad?),以及
  2. 前导空格

虽然我可以尝试通过 来“删除”缩进的第一部分\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>successfailure<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@sectmemoir<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之前插入- 再次用 标记。因此,我们发出#9hyperref\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

相关内容