HTML 中的 longtable 在 tex4ht 中再编译一次后,行数变长

HTML 中的 longtable 在 tex4ht 中再编译一次后,行数变长

我已经看到这个问题很长时间了,但从来没有真正弄清楚为什么会发生这种情况。

鉴于此 MWE

\documentclass[12pt]{book}
\usepackage{longtable}
\begin{document}    

\begin{longtable}[c]{|p{1in}|p{.4in}|p{1.5in}|p{1.5in}|}
\caption{My nice table}\\ \hline  
Type of ODE& {\small Count} &Mathematica & Maple\\ \hline 
\endfirsthead
\multicolumn{4}{c}{\tablename \thetable{} Percentage solved per Maple ODE type -- continued from previous page}\\\hline 
Type of ODE& {\small Count} &Mathematica & Maple\\ \hline 
\endhead \hline 
\multicolumn{4}{|r|}{Continued on next page}\\\hline 
\endfoot \hline 
\endlastfoot         
A&429&100.00\%&100.00\%\\\hline 
C&127&100.00\%&100.00\%
\end{longtable}
\end{document}

使用 lualatex 进行编译

在此处输入图片描述

删除foo.*文件夹中的任何内容(当然除了 foo.tex)并使用进行make4ht编译

>rm foo.*
rm: remove regular file 'foo.4ct'? y
rm: remove regular file 'foo.4tc'? y
rm: remove regular file 'foo.aux'? y
rm: remove regular file 'foo.css'? y
rm: remove regular file 'foo.dvi'? y
rm: remove regular file 'foo.htm'? y
rm: remove regular file 'foo.idv'? y
rm: remove regular file 'foo.lg'? y
rm: remove regular file 'foo.log'? y
rm: remove regular file 'foo.pdf'? y
rm: remove regular file 'foo.tex'? n
rm: remove regular file 'foo.tmp'? y
rm: remove regular file 'foo.xref'? y
make4ht  -ulm default -a debug  foo.tex "htm,mathjax"

在此处输入图片描述

这很好。没有拉长的线条。

奇怪的是,无论编译多少次,只要不删除上述所有中间文件,现在都会出现拉长的行

make4ht  -ulm default -a debug  foo.tex "htm,mathjax"

在此处输入图片描述

无论文件夹中有什么中间文件,每次编译 latex 文件是否都应该产生相同的输出?我在 Firefox、Edge 和 Chrome 中检查了这一点。

如何确保编译后的输出与上面第一个 HTML 输出相同,而无需每次都删除所有中间文件? 这个问题不会出现在 中lualatex

附言:我知道如果上次编译的文件夹中存在某些中间文件(例如 .aux),则可以使用。那么为什么重复编译不能解决这个问题呢?只有当文件夹为空时,我才能第一次获得正确的输出。

TL 2022

答案1

这是一个编译次数很重要的例子。由于表格中有四列,因此需要四次编译才能使连接的单元格正确。在内部,\captionLongtable 将单元格连接成一行,因此它显示为一行。一旦单元格结构正确,就会执行在表格列周围绘制边框的 CSS 指令。

为了修复此问题,我们需要更改\caption在 Longtable 中创建的 HTML 代码。我将在 TeX4ht 源中修复它。同时,您可以使用以下配置文件:

\Preamble{xhtml}

\AddToHook{env/longtable/begin}{
\Configure{caption}{\ifvmode\IgnorePar\fi\EndP\HCode{<caption>}\par\ShowPar\HCode{<span class="id">}}{:\ }{\HCode{</span><span class="content">}}{\HCode{</span>}\ifvmode\IgnorePar\fi\EndP\HCode{</caption>}}
}
\Css{caption .id{font-weight:bold;}}
\makeatletter
\catcode`\:=11
\def\LT@makecaption#1#2#3{%
    \cptA: #1{\cap:ref{#2}}\if\relax\detokenize{#1}\relax\else\cptB:\fi\cptC:#3\cptD:
    \endgraf\vskip\baselineskip
}
\makeatother
\catcode`\:=12
\begin{document}
\EndPreamble

它做了两件事:它配置\caption为在内部生成<caption>标签longtable,而不是默认的<figcaption>。第二是重新定义,\LT@makecaption省略了生成虚假表格单元格的代码。

结果如下:

在此处输入图片描述

相关内容