我有一个 .tex 文件,如下所示
\documentclass[a4paper,12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{tasks}
\usepackage{xcolor}
\usepackage{float}
\begin{document}
\begin{enumerate}
\item Question 1
\begin{tasks}(1)
\task[\textbf{a.}]Option 1
\task[\textbf{b.}]Option 2
\task[\textbf{c.}]Option 3
\task[\textbf{d.}]Option 4
\end{tasks}
\item Question 2
\begin{tasks}(2)
\task[\textbf{a.}]Option A
\task[\textbf{b.}]Option B
\task[\textbf{c.}]Option C
\task[\textbf{d.}]Option D
\end{tasks}
\end{enumerate}
\end{document}
我正在尝试使用 make4ht 将我的 La-TeX 文档转换为 HTML。PDF 输出如下所示,但相应的 HTML 代码却产生了不同的东西。
<!DOCTYPE html>
<html lang="en-US">
<body>
<ol class="enumerate1">
<li class="enumerate" id="x1-3x1">Question 1 <a id="x1-4r1"></a> <!--l. 17-->
<p class="noindent"><!--l. 17--></p>
<p class="noindent">Option 1</p>
<!--l. 17-->
<p class="noindent"><span class="rm-lmbx-12">a.</span> <a id="x1-5r2"></a></p>
<!--l. 17-->
<p class="noindent"></p>
<!--l. 17-->
<p class="noindent">Option 2</p>
<!--l. 17-->
<p class="noindent"><span class="rm-lmbx-12">b.</span> <a id="x1-6r3"></a></p>
<!--l. 17-->
<p class="noindent"></p>
<!--l. 17-->
<p class="noindent">Option 3</p>
<!--l. 17-->
<p class="noindent"><span class="rm-lmbx-12">c.</span> <a id="x1-7r4"></a></p>
<!--l. 17-->
<p class="noindent"></p>
<!--l. 17-->
<p class="noindent">Option 4</p>
<!--l. 17-->
<p class="noindent"><span class="rm-lmbx-12">d.</span></p>
</li>
<li class="enumerate" id="x1-9x2">Question 2 <a id="x1-10r1"></a> <!--l. 26-->
<p class="noindent"><!--l. 26--></p>
<p class="noindent">Option A</p>
<!--l. 26-->
<p class="noindent"><span class="rm-lmbx-12">a.</span><a id="x1-11r2"></a></p>
<!--l. 26-->
<p class="noindent">Option B</p>
<!--l. 26-->
<p class="noindent"><span class="rm-lmbx-12">b.</span> <a id="x1-12r3"></a></p>
<!--l. 26-->
<p class="noindent"></p>
<!--l. 26-->
<p class="noindent">Option C</p>
<!--l. 26-->
<p class="noindent"><span class="rm-lmbx-12">c.</span><a id="x1-13r4"></a></p>
<!--l. 26-->
<p class="noindent">Option D</p>
<!--l. 26-->
<p class="noindent"><span class="rm-lmbx-12">d.</span></p>
</li>
</ol>
</body>
</html>
我不介意 make4ht 无法重现任务包的多列行为,但是有没有办法对齐选项标签和选项。哪个配置文件可以完成这项工作?
答案1
似乎该tasks
程序包使用 Xcoffins 来排版特定项目。由于所有格式都被删除,因此您可以按照发送的顺序获取项目。这就是任务文本位于标签之前的原因。
当tasks
环境启动列表时,我们可以将特定任务输出为\item
。然后我们可以使用标准 TeX4ht 命令来配置此列表的输出 HTML。
这是 Tasks 包的配置文件tasks.4ht
。将其放在与您的文档相同的目录中。
\ExplSyntaxOn
% generate normal \item for tasks instead of coffins
\cs_set_protected:Npn \__tasks_task_fourht:nnn #1#2#3
{\item[#1]{\__tasks_setup: #2 {#3}}}
\cs_generate_variant:Nn \__tasks_task_fourht:nnn {VVV}
\HLet\__tasks_task:nnn\__tasks_task_fourht:nnn
\HLet\__tasks_task:VVV\__tasks_task_fourht:VVV
\ExplSyntaxOff
\Hinput{tasks}
\endinput
重新定义了排版任务的命令来输出\item
。现在,你可以在配置文件中配置列表config.cfg
:
\Preamble{xhtml}
\begin{document}
\makeatletter
\ConfigureList{tasks}
{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="tasks">}\def\end@task{}}
{\ifvmode\IgnorePar\fi\EndP\end@task\HCode{</div>}}
{\end@task\HCode{<div class="task"><span class="label">}\def\end@task{\HCode{</div>}}}
{\HCode{</span>}\noindent}
\makeatother
\EndPreamble
该\ConfigureList
命令用于配置列表环境:
\ConfigureList.....................5
#1 type of list (e.g., itemize, description, enumerate,
list, trivlist)
#2 before list
#3 after list
#4 before label
#5 after label
\DeleteMark removes latex's label; to be placed at the end of #4
\AnchorLabel defines an anchor for \label in current item; to
be placed in #5
该\end@task
命令用于关闭当前任务,这就是为什么它在环境开始时被定义为空,并且仅在打开第一个任务后才初始化。
编译使用:
make4ht -c config.cfg filename.tex
我扩展了 MWE:
\documentclass[a4paper,12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{tasks}
\usepackage{xcolor}
\usepackage{float}
\begin{document}
\begin{enumerate}
\item Question 1
\begin{tasks}(1)
\task[\textbf{a.}]Option 1
\task[\textbf{b.}]Option 2
\task[\textbf{c.}]Option 3
\item[\textbf{d.}]Option 4
\task Without explicit label
\task! Full width
\task*(7) Starred task
\end{tasks}
\item Question 2
\begin{tasks}(2)
\task[\textbf{a.}]Option A
\task[\textbf{b.}]Option B
\task[\textbf{c.}]Option C
\task[\textbf{d.}]Option D
\end{tasks}
\end{enumerate}
\end{document}
结果如下:
HTML 代码如下:
<ol class='enumerate1'>
<li class='enumerate' id='x1-3x1'>
<!-- l. 10 --><p class='noindent'>Question 1
</p><div class='tasks'><div class='task'><span class='label'>
</span>
</div><div class='task'><span class='label'>
<span class='cmbx-12'>a.</span> </span>Option 1
</div><div class='task'><span class='label'>
<span class='cmbx-12'>b.</span> </span>Option 2
</div><div class='task'><span class='label'>
<span class='cmbx-12'>c.</span> </span>Option 3
</div><div class='task'><span class='label'>
<span class='cmbx-12'>d.</span> </span>Option 4<a id='x1-4r1'></a>
</div><div class='task'><span class='label'>
a) </span>Without explicit label<a id='x1-5r2'></a>
</div><div class='task'><span class='label'>
b) </span>Full width<a id='x1-6r3'></a>
</div><div class='task'><span class='label'>
c) </span>Starred task</div></div>
</li>
<li class='enumerate' id='x1-8x2'>
<!-- l. 21 --><p class='noindent'>Question 2
</p><div class='tasks'><div class='task'><span class='label'>
</span>
</div><div class='task'><span class='label'>
<span class='cmbx-12'>a.</span> </span>Option A
</div><div class='task'><span class='label'>
<span class='cmbx-12'>b.</span> </span>Option B
</div><div class='task'><span class='label'>
<span class='cmbx-12'>c.</span> </span>Option C
</div><div class='task'><span class='label'>
<span class='cmbx-12'>d.</span> </span>Option D
</div></div>
</li></ol>
编辑:
要获得多列支持,请尝试此配置文件:
\Preamble{xhtml}
\begin{document}
\makeatletter
\newcounter{taskid}
\ExplSyntaxOn
\ConfigureList{tasks}
{\stepcounter{taskid}\ifvmode\IgnorePar\fi\EndP\HCode{<div~class="tasks"~id="tasks-\arabic{taskid}">}\def\end@task{}}
{\ifvmode\IgnorePar\fi\EndP\end@task\HCode{</div>}
\Css{\#tasks-\arabic{taskid}{%
display:grid;
grid-template-columns: repeat(\int_use:N \l__tasks_columns_int, 1fr);
}}
}
{\end@task\HCode{<div~class="task" ><span~class="label">}\def\end@task{\HCode{</div>}}}
{\HCode{</span>}\noindent}
\ExplSyntaxOff
\Css{.task:first-child{display: none;}}
\makeatother
\EndPreamble
它为每个任务环境声明唯一的 ID,并使用 CSS 网格声明列数。
结果如下: