我已经设法生成一个可以完美运行的 latex 文件,并且我希望在同一个文件上使用 tex4ht 实现相同的功能。
基本上,我有几个自定义\item
标签,用于为项目符号图标和后面的内容提供自定义格式,无论它们位于哪个级别。如果是编号列表,则编号将取决于级别,而不是格式。以下代码检测环境是否为itemize
或enumerate
。然后它提供适当的格式。
\documentclass{article}
\begin{document}
\begin{itemize}
\items This is items
\itemi This is itemi
\end{itemize}
\begin{enumerate}
\items This is items
\itemi This is itemi
\end{enumerate}
\end{document}
在我的序言中,我有以下内容:
\makeatletter
\def\specialenvironment{itemize}
\def\formatitems{\color{Black}\,}
\def\items{%
\ifx\@currenvir\specialenvironment
\item[\normalfont{}{\color{Black}\textbullet}]
\else
\expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname
\expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
\expandafter\formatitems\originallabel}%
\item
\expandafter\let\csname labelenum\romannumeral\@enumdepth\endcsname\originallabel
\fi
\color{Black}
}
\def\formatitemi{\color{OliveGreen}\,}
\def\itemi{%
\ifx\@currenvir\specialenvironment
\item[\normalfont{}{\color{OliveGreen}\textit{{i}}}]
\else
\expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname
\expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
\expandafter\formatitemi\originallabel}%
\item
\expandafter\let\csname labelenum\romannumeral\@enumdepth\endcsname\originallabel
\fi
\color{OliveGreen}
}
\makeatother
这在 tex4ht 中运行没有错误,但没有提供适当的格式。我尝试在 tex4ht 配置文件中使用\ConfigureEnv
、\ConfigureList
和\NewConfigure
命令,但没有成功。
有人能给我指出正确的方向吗?
答案1
在您的案例中,您想要自定义项目标签和颜色。默认情况下,tex4ht
删除 itemize 和 enumerate 标签并使用CSS
来显示它们,我们可以使用\ConfigureList
来解决这个问题,同时使用一些CSS
来隐藏浏览器添加的标签。我们还可以使用在元素上\ConfigureList
添加class
属性li
,这样我们就可以为它们分配颜色。
首先,将宏的定义移至独立包items.sty
:
\ProvidesPackage{items}
\RequirePackage{xcolor}
\definecolor{Black}{rgb}{0,0,0}
\definecolor{OliveGreen}{rgb}{0.3,0.4,0.2}
\def\specialenvironment{itemize}
\def\formatitems{\color{Black}\,}
\def\items{%
\ifx\@currenvir\specialenvironment
\item[\normalfont{}{\color{Black}\textbullet}]
\else
\expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname
\expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
\expandafter\formatitems\originallabel}%
\item
\expandafter\let\csname labelenum\romannumeral\@enumdepth\endcsname\originallabel
\fi
\color{Black}
}
\def\formatitemi{\color{OliveGreen}\,}
\def\itemi{%
\ifx\@currenvir\specialenvironment
\item[\normalfont{}{\color{OliveGreen}\textit{{i}}}]
\else
\expandafter\let\expandafter\originallabel\csname labelenum\romannumeral\@enumdepth\endcsname
\expandafter\def\csname labelenum\romannumeral\@enumdepth\expandafter\endcsname\expandafter{%
\expandafter\formatitemi\originallabel}%
\item
\expandafter\let\csname labelenum\romannumeral\@enumdepth\endcsname\originallabel
\fi
\color{OliveGreen}
}
\endinput
以及的配置文件tex4ht
:items.4ht
\def\ItemsType{items}
\newcommand\ConfigureMyList[2]{%
\ConfigureList{#1}
{\ifvmode\IgnorePar\fi\EndP\HCode{<#2 class="#1">\Hnewline}\ShowPar%
\bgroup
\def\EndDefItem{}
}
{\EndDefItem\egroup%
\ifvmode\IgnorePar\fi\EndP\HCode{</#2>\Hnewline}\ShowPar%
\par}{\EndDefItem\HCode{<li class="\ItemsType" >}\def\EndDefItem{\HCode{</li>\Hnewline}}}{}
}
\ConfigureMyList{itemize}{ul}
\ConfigureMyList{enumerate}{ol}
\newcommand\ConfigureMyItems[2]{%
\pend:def#1{\def\ItemsType{#2}}%
}
\ConfigureMyItems\items{items}
\ConfigureMyItems\itemi{itemi}
\Css{ul, ol{list-style-type: none;}}
\newcommand\tsf@getColor[1][.]{
% colorname `.` holds current color
\extractcolorspec{#1} {\tsf@color}
\expandafter\convertcolorspec\tsf@color{HTML}\tsf@color
}
\newcommand\MyItemColor[2]{%
\tsf@getColor[#2]%
\Css{.#1{color:\#\tsf@color;}}
}
\MyItemColor{items}{Black}
\MyItemColor{itemi}{OliveGreen}
我们定义了一些命令,以简化配置。使用\ConfigureMyList
,您可以配置环境#1
以使用列表元素#2
。默认支持的环境有:
\ConfigureMyList{itemize}{ul}
\ConfigureMyList{enumerate}{ol}
您可以添加任何其他列表环境,
我们的有趣部分\ConfigureList
是:
{\EndDefItem\HCode{<li class="\ItemsType" >}\def\EndDefItem{\HCode{</li>\Hnewline}}}
ItemsType
\items
必须在和中定义\itemi
,并且必须扩展为类名,该类名将用于分配颜色。另请注意,枚举和项目化的默认配置\DeleteMark
在第三个参数的末尾使用\ConfigureList
,因此删除了 LaTeX 标签,而是CSS
用来生成标签。
Css 生成的标签被禁用:
\Css{ul, ol{list-style-type: none;}}
我们需要将 的定义插入\ItemsType
到我们的自定义\item
宏中。为了简化流程,我们可以创建一个辅助宏:
\newcommand\ConfigureMyItems[2]{%
\pend:def#1{\def\ItemsType{#2}}%
}
该\ConfigureMyItems
命令将在重新定义的命令的开头插入定义:
\ConfigureMyItems\items{items}
\ConfigureMyItems\itemi{itemi}
class
现在可以从列表配置中访问名称。我们只需声明用于类的颜色:
\MyItemColor{items}{Black}
\MyItemColor{itemi}{OliveGreen}
结果: