htlatex:将文本宽度的分数设置为小页面宽度的方法与 TikZ 不兼容

htlatex:将文本宽度的分数设置为小页面宽度的方法与 TikZ 不兼容

我正在使用make4ht来自的配置这个答案从 LaTeX 代码中提取宽度作为文本宽度的分数,并将其添加到 CSS 文件中。配置按预期工作,直到我在文档中的任何位置添加 TikZ 图片。来自那个问题编译正确,但以下代码会产生错误(即使我们从下面的代码中完全删除小页面,仍然会存在错误,我只是将它们保留在那里以确保任何提出的解决方案都能保持小页面宽度不变):

\documentclass{article}
\ifdefined\HCode
    \def\pgfsysdriver{pgfsys-dvisvgm4ht.def}
\fi 
\usepackage{tikz,amsmath,blindtext}
\begin{document}
    \noindent Text before.\medskip
    
    \noindent
    \begin{minipage}[t]{1.0\textwidth}
        \begin{minipage}[t]{0.4\textwidth}
            \blindtext
        \end{minipage}
        \hfill
        \begin{minipage}[t]{0.5\textwidth}
            \blindtext  
        \end{minipage}
    \end{minipage}
    \begin{center}
        \usetikzlibrary{arrows,positioning} 
        \begin{tikzpicture}[>=latex']
            \node [draw, text width=1.3cm,  text centered] (s) {system $y=u$};
            \draw [->]  node[coordinate,left=1cm of s](u){} (u) -- node [above, near start] {$u$} (s);
            \draw [->] (s)  node[coordinate,right=1cm of s](y){} -- node [above, near end] {$y$} (y); 
        \end{tikzpicture}
    \end{center}
\end{document}

错误信息是:

[ERROR]   htlatex: ?    21       Argument of \striptextwidth has an extra }.
[ERROR]   htlatex: ?    21       Paragraph ended before \striptextwidth was complete.
[ERROR]   htlatex: ?    21       Missing number, treated as zero.
[ERROR]   htlatex: ?    21       Illegal unit of measure (pt inserted).
[ERROR]   htlatex: ?    21       Missing ) inserted for expression.

对于冲突是什么以及如何解决它,您有什么想法吗?

更新:如果我text width = 1.3cm从上面的节点中删除该选项,错误就会消失,一切都会按预期工作,但对于某些图形,我需要多行节点文本,因此我需要限制文本宽度。

答案1

minipage此问题是由我在上一个答案中提供的 TeX4ht 配置文件中的配置引起的。它期望将minipage宽度指定为 的分数\textwidth。没问题,因为您在之前的 中使用了这种格式mwe。问题是当minipage您没有提供相对于 的宽度时\textwidth,使用 TikZtext width选项时会发生这种情况。

为了解决这个问题,我们需要更好地计算宽度。幸运的是,借助 LaTeX 3,我们现在可以轻松进行浮点计算,这简化了配置文件并解决了您的问题。

以下是更新后的cfg文件:

\Preamble{xhtml}

\makeatletter

% we must refer to minipage from the css file, because tags are beeing
% written before we know dimensions
\newcount\mini@count
\ExplSyntaxOn
% save original minipage
\let\oldiimini\@iiiminipage
% redefine minipage
\def\@iiiminipage#1#2[#3]#4{%
  % calculate minipage dimensions and save it to the CSS file
  \Css{\#minipage\the\mini@count{width:\fp_eval:n{#4/\textwidth*100}\%;}}%
  \global\advance\mini@count by 1\relax%
  \oldiimini{#1}{#2}[#3]{#4}%
}

\ExplSyntaxOff

\ConfigureEnv{minipage}{\ifvmode\IgnorePar\fi\EndP\HCode{<div class="minipage" align="center" id="minipage\the\mini@count" style="border:1px solid black;">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>\Hnewline}%
% we must write dimension here to the css file
}{}{}

\makeatother

\Css{div.minipage {
 float: left; 
 } 
}

\Css{div.minipage:last-child {
 clear: none; 
 float: right; 
 }
}

\Css{ div.minipage + :not(.minipage) {clear:both;overflow:auto;width:100\%;}}

\begin{document}
\EndPreamble

现在使用以下代码将 Minipage 宽度写入 CSS 文件:

\Css{\#minipage\the\mini@count{width:\fp_eval:n{#4/\textwidth*100}\%;}}%

#4参数包含传递给 minipage 环境的宽度。然后将其除以 100\textwidth并乘以 100,得到百分比尺寸。

结果如下:

在此处输入图片描述

答案2

\parbox不是一个确切的答案,而是一个解决方法。如果我们使用节点文本内部的 来设置文本宽度而不是选项,那么一切都会按预期工作。text width代码

\documentclass{article}
\ifdefined\HCode
    \def\pgfsysdriver{pgfsys-dvisvgm4ht.def}
\fi 
\usepackage{tikz,amsmath,blindtext}
\begin{document}
    \noindent Text before.\medskip
    
    \noindent
    \begin{minipage}[t]{1.0\textwidth}
        \begin{minipage}[t]{0.4\textwidth}
            \blindtext
        \end{minipage}
        \hfill
        \begin{minipage}[t]{0.5\textwidth}
            \blindtext  
        \end{minipage}
    \end{minipage}
    \begin{center}
        \usetikzlibrary{arrows,positioning} 
        \begin{tikzpicture}[>=latex']
            \node [draw] (s) {\parbox[t]{1.3cm}{\centering system $y=u$}};
            \draw [->]  node[coordinate,left=1cm of s](u){} (u) -- node [above, near start] {$u$} (s);
            \draw [->] (s)  node[coordinate,right=1cm of s](y){} -- node [above, near end] {$y$} (y); 
        \end{tikzpicture}
    \end{center}
\end{document}

使用配置文件编译得很好从这个答案

\Preamble{xhtml}
\makeatletter
% to strip fraction from \textwidth
\def\striptextwidth#1\textwidth{#1}
% we must refer to minipage from the css file, because tags are beeing
% written before we know dimensions
\newcount\mini@count
% save original minipage
\let\oldiimini\@iiiminipage
% redefine minipage
\def\@iiiminipage#1#2[#3]#4{%
% calculate dimensions and save it to macro
\edef\miniwidth{\strip@pt\dimexpr(\striptextwidth#4pt)*100\relax\%}
\Css{\#minipage\the\mini@count{width:\miniwidth;}}%
\oldiimini{#1}{#2}[#3]{#4}
}

\ConfigureEnv{minipage}{\advance\mini@count by 1\relax\ifvmode\IgnorePar\fi\EndP\HCode{<div class="minipage" align="center" id="minipage\the\mini@count" style="border:1px solid black;">}}
{\ifvmode\IgnorePar\fi\EndP\HCode{</div>\Hnewline}%
% we must write dimension here to the css file
}{}{}
\makeatother
\Css{div.minipage {
 float: left; 
 }
}
\Css{div.minipage:last-child {
 clear: none;
 float: right;
 }
}
\Css{ div.minipage + :not(.minipage) {clear:both;overflow:auto;width:100\%;}}
\begin{document}
\EndPreamble

这不是一个确切的答案,因为它涉及改变现有的 LaTeX 代码。

相关内容