重写 makechapterhead 以包含上一页的内容

重写 makechapterhead 以包含上一页的内容

我正在使用 memoir 类来排版一本书,其中我想在左页以图片开始章节,然后在右页以“第 1 章:Hello World”开头,后面跟着文字。所以我正在玩弄这个测试文档,但我不知道如何让额外的参数显示在我想要的位置。一旦我搞清楚了,我想我可以替换\includegraphics{blah.png}“Foo Bar Baz”的内容。

\documentclass[openleft]{memoir}
\usepackage{lipsum}
\parindent=0pt

\title{Test}
\author{Joe Blow}

\makeatletter
\renewcommand{\@makechapterhead}[3]{%
  Foo: #1\\
  Bar: #2\\
  Baz: #3
  \newpage
  {
  \chapterheadstart
    \printchaptername \chapternamenum \printchapternum\\
    \printchaptertitle{\Huge #1}\\
    \afterchaptertitle
  }
}
\makeatother

\begin{document}
\maketitle
\tableofcontents

\chapter[hello world]{Hello\
World}{Tree}
\lipsum[1-5]

\chapter[hello plants]{Hello\
Plants}{Flowerpot}
\lipsum[6-10]
\end{document}

相反,我在左侧看到了这个(第一章):

Foo: Hello World
Bar:
Baz:

然后在右侧,我按预期获得了章节标题。章节名称也按预期显示在目录中。但是在正文中,第一个单词是花括号中的第二个参数。对于此示例,我会看到第一章的第一个单词是“Tree”,第二章的第一个单词是“Flowerpot”。为什么该参数出现在那里?我如何才能使第二个参数出现在上一页的“Bar:”旁边?

根据@peter-wilson 的要求添加此 MWE

\documentclass[12pt]{memoir}
\usepackage{graphicx}
\usepackage{libertine}
\usepackage{lipsum}
\usepackage{hyperxmp}
\usepackage[pdfusetitle,colorlinks]{hyperref}

\parindent=0pt

\title{Test}
\author{Joe Blow}

\makeatletter 
\hypersetup{%
  pdftitle={Test},
  pdfauthor={Joe Blow},
  bookmarksnumbered,
  pdfstartview={FitH},
  allcolors=black,
  pdfcopyright={Copyright 2020 by Joe Blow.  All rights deserved.},
  pdfinfo={
    {Copyright 2020 by Joe Blow.  All rights deserved.}
  }
}%
\makeatother

\makeatletter
\newcommand\chapimage[2]{
  \cleartoverso
  \thispagestyle{empty}
  \begin{center}
  \vspace*{\fill}
  \includegraphics[keepaspectratio=true,height=0.85\textheight]{#1}\par%
  \huge #2
  \vspace*{\fill}
  \end{center}
%  \clearpage
}
\makeatother

\makeatletter
\def\@makechapterhead#1{%
  {
  \chapterheadstart
    \printchaptername \chapternamenum \printchapternum\\
    \printchaptertitle{\Huge #1}\\
    \afterchaptertitle
  }
}
\makeatother

\begin{document}

\maketitle
\tableofcontents

\chapimage{tree}{The Tree}
\chapter[hello world]{Hello\
World}
\lipsum[1-15]

\chapimage{flowerpot}{The Flowerpot}
\chapter[hello plants]{Hello\
Plants}
\lipsum[16-20]
\end{document}

当使用 构建为 PDF 时pdflatex,这对于打印来说没问题。当以带有超链接的 PDF 呈现时,单击目录中的章节不会将我带到主图片,而是会显示“第 1 章”、“第 2 章”等。当我使用 将其制作成 epub 时tex4ebook -xs -f epub -c test.cfg test.tex,这种效果更糟:标题单独出现在页面上,位于图像之后和章节开始之前。

这是一个test.cfg与我迄今为止使用的文件相同的文件:

\Preamble{xhtml}
\Css{div.caption{text-align:center;}}
\Configure{float}{\csname par\endcsname\ShowPar}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="float">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar}
\ConfigureEnv{figure}
{\IgnorePar\EndP\HCode{<div class="figure">\Hnewline}%
\bgroup \Configure{float}{\ShowPar}{}{}%
}
{\egroup\IgnorePar\EndP\HCode{</div>}\par}
{}{}

\Css{div.float, div.figure{margin-left:auto;margin-right:auto;}}

\Configure{writetoc}{\let\\\space}
\Configure{UniqueIdentifier}{Foo Bar Press}
\DeclareGraphicsExtensions{.png,.jpg,.gif}

\begin{document}
\EndPreamble

现在查看 epub 中的文件,我在底部看到了这个testli1.html,这里就是目录:

<div class="center" 
>
<!--l. 57--><p class="noindent" >
</p><!--l. 57--><p class="noindent" ><img 
src="tree.png" alt="PIC"  
width="265" height="466"  />
</p><!--l. 57--><p class="noindent" ><span 
class="rm-lmr-17x-x-143">The Tree</span> </p></div>
<!--l. 58--><div class="crosslinks"><p class="noindent"></p></div>

</body></html>

包含的内容tree.png应该位于 的开头附近testch1.htmltestch1.html我在底部看到了以下内容:

<div class="center" 
>
<!--l. 62--><p class="noindent" >
</p><!--l. 62--><p class="noindent" ><img 
src="flowerpot.png" alt="PIC"  
width="360" height="466"  />
</p><!--l. 62--><p class="noindent" ><span 
class="rm-lmr-17x-x-143">The Flowerpot</span> </p></div>
<!--l. 63--><div class="crosslinks"><p class="noindent"></p></div> 

那应该出现在 的开头附近testch2.html

现在这里是的顶部testch1.html

<head><title>1 Hello World</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta name="generator" content="TeX4ht (http://www.tug.org/tex4ht/)" /> 
<meta name="originator" content="TeX4ht (http://www.tug.org/tex4ht/)" /> 
<!-- charset=utf-8,epub,uni-html4,html,xhtml --> 
<meta name="src" content="test.tex" /> 
<link rel="stylesheet" type="text/css" href="test.css" /> 
</head><body 
>
<!--l. 59--><div class="crosslinks"><p class="noindent"></p></div>
<h2 class="chapterHead"><span class="titlemark">Chapter 1</span><br /><a 
 id="x3-20001"></a>Hello World</h2>

图像和标题应出现在 之前的某个位置<h2></h2>

答案1

问题是,tex4ebook在每章开头将文档拆分为独立的 HTML 文件,因此将\chapterimage放置在上一章的末尾。我将重新定义此命令以仅保存图像地址和标题。此信息可以在命令中重复使用\chapter。这可确保将图像放置在正确的文件中并与章节标题一起显示。

尝试以下配置:

\Preamble{xhtml}
\makeatletter
\renewcommand\chapimage[2]{\def\chapimagesrc{#1}\def\chapimagedesc{#2}}
\Configure{chapter}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="chapter-header">}% insert container element that will be used for 
% linking from TOC
\ifdefined\chapimagesrc%
  \begin{center}%
  \includegraphics[keepaspectratio=true,height=0.85\textheight]{\chapimagesrc}\par%
  \HCode{<span class="chapimagedesc">}\chapimagedesc\HCode{</span>}% 
  \end{center}%
\global\let\chapimagesrc\@undefined%
\global\let\chapimagedesc\@undefined%
\fi%
}{}
   {\IgnorePar\EndP\HCode{<h2 class="chapterHead"\csname a:LRdir\endcsname>}%
    \if@mainmatter \TitleMark{\HCode{<br />}}\fi }
   {\HCode{</h2></div>}\IgnoreIndent\par}
\Css{.chapimagedesc{font-size:2em;}}
\Css{h2.chapterHead{page-break-before:always;}}
\makeatother
\Configure{UniqueIdentifier}{Foo Bar Press}
\Css{div.caption{text-align:center;}}
\Configure{float}{\csname par\endcsname\ShowPar}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="float">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\ShowPar}
\ConfigureEnv{figure}
{\IgnorePar\EndP\HCode{<div class="figure">\Hnewline}%
\bgroup \Configure{float}{\ShowPar}{}{}%
}
{\egroup\IgnorePar\EndP\HCode{</div>}\par}
{}{}

\Css{div.float, div.figure{margin-left:auto;margin-right:auto;}}

\Configure{writetoc}{\let\\\space}
\Configure{UniqueIdentifier}{Foo Bar Press}
\DeclareGraphicsExtensions{.png,.jpg,.gif}

\begin{document}
\EndPreamble

重要的部分是这样的:

\renewcommand\chapimage[2]{\def\chapimagesrc{#1}\def\chapimagedesc{#2}}
\Configure{chapter}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="chapter-header">}% insert container element that will be used for 
% linking from TOC
\ifdefined\chapimagesrc%
  \begin{center}%
  \includegraphics[keepaspectratio=true,height=0.85\textheight]{\chapimagesrc}\par%
  \HCode{<span class="chapimagedesc">}\chapimagedesc\HCode{</span>}% 
  \end{center}%
\global\let\chapimagesrc\@undefined%
\global\let\chapimagedesc\@undefined%
\fi%
}{}
   {\IgnorePar\EndP\HCode{<h2 class="chapterHead"\csname a:LRdir\endcsname>}%
    \if@mainmatter \TitleMark{\HCode{<br />}}\fi }
   {\HCode{</h2></div>}\IgnoreIndent\par}
\Css{.chapimagedesc{font-size:2em;}}
    \renewcommand\chapimage[2]{\def\chapimagesrc{#1}\def\chapimagedesc{#2}}
\Configure{chapter}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="chapter-header">}% insert container element that will be used for 
% linking from TOC
\ifdefined\chapimagesrc%
  \begin{center}%
  \includegraphics[keepaspectratio=true,height=0.85\textheight]{\chapimagesrc}\par%
  \HCode{<span class="chapimagedesc">}\chapimagedesc\HCode{</span>}% 
  \end{center}%
\global\let\chapimagesrc\@undefined%
\global\let\chapimagedesc\@undefined%
\fi%
}{}
   {\IgnorePar\EndP\HCode{<h2 class="chapterHead"\csname a:LRdir\endcsname>}%
    \if@mainmatter \TitleMark{\HCode{<br />}}\fi }
   {\HCode{</h2></div>}\IgnoreIndent\par}
\Css{.chapimagedesc{font-size:2em;}}
\Css{h2.chapterHead{page-break-before:always;}}

\chapterimage命令定义了两个宏,\chapimagesrc\chapimagedesc包含当前图像文件名和标题。此信息包含在本章开头使用\Configure{chapter}

由于 ,章节图像将被放置在单独的页面上\Css{h2.chapterHead{page-break-before:always;}}

由于目录直接链接到章节标题,因此需要将链接目标移到章节图像之前。这可以使用以下构建文件来实现:

local domfilter = require "make4ht-domfilter"

local process = domfilter { function(dom)
  -- process headers
  for _,  header in ipairs(dom:query_selector "div.chapter-header") do
    -- find chapter toc id
    for _, a in ipairs(header:query_selector "h2 a") do
      local id = a:get_attribute("id") 
      if id then
        -- move the 
        a:set_attribute("id", nil)
        header:set_attribute("id", id)
      end
    end
  end
  return dom
end}

Make:match("html$", process)

结果如下:

在此处输入图片描述

答案2

为左图片页创建一个宏并保持\chapter原样要简单得多,那么您不必担心 6 个参数的组织 --- 4 个必需的和 2 个可选的。

% prechapprob.tex  SE 525098 Picture before chapter
\documentclass{memoir}
\usepackage{lipsum}

\newcommand{\prechap}[3]{%  % put on the next even page
  \cleartoevenpage
  \thispagestyle{empty}
  Foo: #1 \\
  Bar: #2 \\
  Baz: #3}

\begin{document}
\tableofcontents

\prechap{Hello}{World}{Tree}
\chapter{Tree}
\lipsum[1-5]

\prechap{Hello}{Earth}{Plants}
\chapter{Flowerpot}
\lipsum[6-10]

\end{document}

相关内容