tex4ht 给出了一个错误,它不应该查看代码!垂直模式下的“\spacefactor”错误

tex4ht 给出了一个错误,它不应该查看代码!垂直模式下的“\spacefactor”错误

我以前从未见过这样的事情。我使用了一些只在 pdf 中工作的 Latex 代码。代码被包围

\ifdefined\HCode
\else
  .... latex code which tex4ht is not supposed to use
\fi

我刚刚发现 tex4ht 会因为不应该查看的代码而报错。这怎么可能呢?该代码只能在 pdf 模式下运行。当我删除下面的代码时\else,tex4ht 不会报错。

这是 MWE

\documentclass[11pt]{report}%          
\ifdefined\HCode
\else
%thanks to solution from
%http://tex.stackexchange.com/questions/309244/how-to-show-list-of-figures-and-list-of-tables-inside-chapters-only-and-not-also#309245
%this is meant only for pdf, not HTML.
\newif\ifshowlistof
\makeatletter
\def\@starttocbutdonotshowtoc#1{%
  \begingroup
    \makeatletter
    \setcounter{tocdepth}{\mytocdepth}
    \ifshowlistof
    \@input{\jobname.#1}%
    \fi
    \if@filesw
     \expandafter\newwrite\csname tf@#1\endcsname
     \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
     \fi
    \@nobreakfalse
    \endgroup}
\renewcommand{\listoftables}{%
  \@starttocbutdonotshowtoc{lot}%
}  
\makeatother
\fi        
\begin{document}           
test
\end{document}

现在pdflatex没有错误。因为我知道代码在 pdf 中有效。但使用 tex4ht 编译会出现非常奇怪的错误:

htlatex  foo.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) 
 (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
LaTeX2e <2015/10/01> patch level 2
Babel <3.9m> and hyphenation patterns for 79 languages loaded.
(./foo.tex (/usr/local/texlive/2015/texmf-dist/tex/latex/base/report.cls
Document Class: report 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size11.clo))
(/usr/local/texlive/2015/texmf-dist/tex/generic/tex4ht/tex4ht.sty)
! You can't use `\spacefactor' in vertical mode.
\@->\spacefactor 
                 \@m {}
l.19     \@
           nobreakfalse
? 

TL 2015,在 Linux 上。

答案1

当你使用 进行编译时tex4ht,测试\ifdefined\HCode返回 true,因此 TeX 想要丢弃 false 分支。因此它从上到下进行\else匹配\fi 没有扩展宏或执行命令,但匹配条件。

由于在扫描\ifshowlistof时 不是条件\else,因此它永远不会成为条件,因此匹配\fi是 主体中的匹配\def\@starttocbutdonotshowtoc。请注意,两者都未\makeatletter执行,因此@仍然是“其他字符”。测试\if@filesw返回 false(因为\if比较@f),最后 预期的\@位置\@nobreakspace引发错误。

解决方案:永远不要\newif输入条件文本。如果你这样做

\newif\ifshowlistof
\ifdefined\HCode
\else
  ...
\fi

代码将会起作用。

相关内容