我正在使用 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.html
。testch1.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}