我注意到有时 tex4ht 会删除“常规的“单词之间的空格。我理解 DVI 中的空格只是“间隙”,而不是字体符号。MWE:
\documentclass{article}
\usepackage{times}
\begin{document}
Normal text \texttt{In the Name} \texttt{of} \texttt{God}
\end{document}
结果是使用 htlatex 编译的 HTML,没有任何选项(上帝之名):
<!--l. 4--><p class="noindent" >Normal text <span
class="pcrr7t-">In the NameofGod</span>
以下是我在tex4ht
C 代码注释中发现的内容:
Characters are inserted into the html file as they are
encountered. Spaces are inserted when \`'x_val' is larger than
\`'max_x_val'.
static long int x_val = 0, max_x_val = -10000,
在 DVI 文件中,我看到单词之间有很小的空格:
(Name)
w3 163840
(of)
w0
(God)
当我更换 DVI 源时w3 163840到w3 263840出现空格。
问题有没有办法控制tex4ht
空格转换(从 DVI 到 HTML)?可能和字体空格字符有关?
我如何才能追踪被删除的空间?这是什么意思?追踪水平空间应该显示\special{t4ht@%X}...\special{t4ht@%x}
。我没有注意到任何事情。
答案1
这很有趣。当您查看示例生成的 dvi 代码时:
xxx: 't4ht=<!--l. 9--><p class="noindent" >'
set: 'Nomal'
w: 2.500000pt
set: 'te'
right: -0.149902pt
set: 'xt'
w0:
fnt: pcrr7t at 10pt
set: 'In'
w: 6pt
set: 'the'
w0:
set: 'Name'
w: 2.500000pt
set: 'of'
w0:
set: 'God'
您可以看到,空格的宽度设置为 2.5pt,因为使用了给定行的正常单词间距宽度。没有显示字体因空格而发生变化,这就是问题所在。
tex4ht
使用以下计算来确定是否应插入空格:
i = (INTEGER) ( (double) (dx = x_val - max_x_val)
/ (text_on? word_sp : margin_sp)
+ 0.5 );
如果我理解正确的话,x_val
是新字符的当前水平位置,max_x_val
是空格前的最后一个水平位置,也是dx
空格的宽度。因为我们在文本(text_on
)中,所以空间的宽度除以字体空间的大小。O.5
添加到它然后将其转换为整数。
当转换为整数后的结果为 1 时,将插入空格。您的示例的问题在于,虽然实际上使用了比例字体的空格,但在计算中使用了等宽字体的空格大小,导致值小于 1,因此不会插入空格。我不确定是否可以在源代码中修复此问题tex4ht
,从一些代码注释来看,Eitan 似乎意识到了这个问题,但没有提出解决方案。好消息是,这个问题应该只在您使用具有固定空格的字体(即等宽字体)并在此字体的两个文本实例之间插入正常空格时才会发生。
答案2
这是一个带有\texttt
配置的简单解决方案,如果 后面有空格,则会像 HTML 实体一样添加空格\texttt{}
。
\documentclass{article}
\usepackage{times}
\begin{document}
\makeatletter
%% add fixed space if next input token is space
\def\@add@texttt@space{%
\ifcat\@@temp\space
\ \ignorespaces
\fi}
\def\@fix@texttt@space{\futurelet\@@temp\@add@texttt@space}
\Configure{texttt}
{}
{\aftergroup\@fix@texttt@space}
\makeatother
Normal text \texttt{In the Name} \texttt{of} \texttt{God}.
\end{document}
现在输出将是...Name of God.