使用 tex4ht 设置 HTML 段落的样式

使用 tex4ht 设置 HTML 段落的样式

我在 LaTeX 中创建了一个简单的宏用于笔记:

\documentclass{book}
\usepackage{xcolor}
\definecolor{notecolor}{rgb}{1,0.2,0.2}
\newcommand\note[1]{{\textcolor{notecolor}{\textbf{Note: }}}#1}

\begin{document}
\chapter{Introduction}
\note{This is a sample note}
\end{document}

我希望能够通过 make4ht 在 HTML 输出中为其添加边框样式。转换后的 HTML 如下所示:

<p class="indent">   <span id="textcolor1"><span class="cmbx-10">Note: </span></span>This is a sample note
</p>

并且我已经创建了一个 tex4ht 自定义 cfg 文件,其中包含:

\Configure{note}{\HCode{<p class="note">}}{\HCode{</p>}}
\Css{note{border-style: solid;}}

但重新生成后,生成的 HTML 仍然相同。

我查看了使用 tex4ht 自定义 css 的各种示例,但无法使其正常工作。我见过这种配置似乎有效的示例,还有一些涉及 .4ht 文件的示例。我不清楚不同方法的用例。

有人能解释一下我在这里遗漏了什么以及正确的解决方案是什么吗?

答案1

您的代码不起作用的主要问题是您必须note先声明配置,然后重新定义\note命令以使用该配置。

我会将您的宏提取到自定义包中,因为该包的配置文件可以被自动调用tex4ht。假设该包名为mynote.sty

\ProvidesPackage{mynote}
\RequirePackage{xcolor}
\definecolor{notecolor}{rgb}{1,0.2,0.2}
\newcommand\notetitle{Note:~}
\newcommand\note[1]{{\textcolor{notecolor}{\textbf{\notetitle}}}#1}
\endinput

我已将Note:文本移至独立宏,以便使其更易于配置。在这种情况下,我将重新定义宏\note以插入三个可配置的钩子:第一个在开头,第二个在文本后Note:,最后一个在结尾。这将使配置具有高度的灵活性。

配置文件mynote.4ht

\NewConfigure{note}{3}

\renewcommand\note[1]{\a:note\notetitle\b:note#1\c:note}

\Configure{note}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="note">}\par\HCode{<span class="title">}}
{\HCode{</span>}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>}\par}

\AtBeginDocument{%
  \get:xcolorcss{notecolor}\note:color
  \Css{.note span.title{color:\note:color;font-weight:bold;}}
  \Css{div.note{border:1px solid \note:color;}}
}

如你所见,原来的\note命令被新的定义所取代,因为我们希望纯粹用 HTML 和 CSS 来定义格式,以避免出现如下丑陋的代码

 <span id="textcolor1"><span class="cmbx-10">Note: </span></span>

\a:note\b:note\c:note由命令创建\NewConfigure{note}{3}

\Configure{note}命令看起来可能有点复杂,我们来分析一下:

{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="note">}\par\HCode{<span class="title">}}

代码\ifvmode\IgnorePar\fi\EndP将结束当前段落,这是为了避免</p>在开始<div>标记后插入结束标记。\HCode{<div class="note">}\par插入<div>标记并打开一个新段落。 因为您可以在命令中使用多个段落\note,所以最好明确请求它。\HCode{<span class="title">}将插入在 之前\notetitle,此元素在第二个配置中由 关闭\HCode{</span>}

最后一部分关闭注释中的段落并关闭<div class="note">元素。可能还需要使用元素\par来解决命令后面的段落问题\note。如您所见,段落在 中可能是一件棘手的事情tex4ht

样式部分做了一些有趣的事情:

\AtBeginDocument{%
  \get:xcolorcss{notecolor}\note:color
  \Css{.note span.title{color:\note:color;font-weight:bold;}}
  \Css{div.note{border:1px solid \note:color;}}
}

\get:xcolorcsstex4ht是包配置提供的命令xcolor。它将颜色的 CSS 定义提取到宏中,然后可以在 CSS 定义中使用。此块必须包含在命令中\AtBeginDocumnt,因为它必须在配置后加载xcolor。该\Css命令仅定义标题和边框的颜色。

对于修改后的测试文件:

% https://tex.stackexchange.com/q/402271/2891
\documentclass{book}
\usepackage{mynote}

\begin{document}
\chapter{Introduction}
\note{This is a sample note}
Another text
\end{document}

你会得到这样的结果:

在此处输入图片描述

以及以下 HTML 代码:

   <h2 class="chapterHead"><span class="titlemark">Chapter 1</span><br /><a 
 id="x1-10001"></a>Introduction</h2>
   <div class="note">
<!--l. 8--><p class="indent" >   <span class="title">Note: </span>This is a sample note</p></div>
<!--l. 9--><p class="indent" >   Another text </p> 

相关内容