我以前从未见过这样的事情。我使用了一些只在 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
代码将会起作用。