hlatex 中的任务列表问题

hlatex 中的任务列表问题

我有一个 .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 网格声明列数。

结果如下:

在此处输入图片描述

相关内容