此 MWE 在 pdf 中有效。它将框架放在图像周围。但在 HTML 中,我看到没有框架产生
\documentclass[12pt]{article}%
\usepackage{graphicx}
\usepackage[export]{adjustbox}%for frame option
\begin{document}
\includegraphics[width=0.5\textwidth,frame=0.1in]{A.png}
\end{document}
使用编译lualatex foo4.tex
给出
但使用编译时make4ht foo4.tex
会出现这种情况。没有框架,右下角有一些划痕线。
生成的源代码看起来有误
<!DOCTYPE html>
<html lang="en-US" xml:lang="en-US" >
<head><title></title>
<meta charset="iso-8859-1" />
<meta name="generator" content="TeX4ht (http://www.tug.org/tex4ht/)" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="stylesheet" type="text/css" href="foo4.css" />
<meta name="src" content="foo4.tex" />
</head><body
>
<!--l. 10--><p class="noindent" > <img
src="A.png" alt="PIC"
/>_
__
</p>
</body>
</html>
我知道我可以用来fbox
在图像周围放置一个框架,这在 tex4ht 中有效:
\fbox{\includegraphics[width=0.5\textwidth]{A.png}}
但我想将frame
其用于其他目的。我总是可以fbox
在 tex4ht 模式下使用,也可以frame
在 pdf 模式下使用。因此,我有一个解决方法,但希望避免这种复杂情况,并在可能的情况下对两者使用相同的代码。
有没有办法frame
也可以在 tex4ht 中工作?
附言:我无法使用 latex 附带的示例图像来进行上述 MWE,因为出于某种原因,这些图像不适用于 tex4ht。看起来是路径问题,所以我使用了我自己的图像。A.png
如果您需要使用它,这里是副本,或者可以使用任何其他图像。
答案1
您可以尝试这个版本adjustbox.4ht
:
\NewConfigure{AdjustboxValignTop}{1}
\NewConfigure{AdjustboxValignMiddle}{1}
\NewConfigure{AdjustboxValignCenter}{1}
\NewConfigure{AdjustboxValignBottom}{1}
\pend:def\adjbox@valign@t{\a:AdjustboxValignTop}
\pend:def\adjbox@valign@t{\a:AdjustboxValignTop}
\pend:def\adjbox@valign@T{\a:AdjustboxValignTop}
\pend:def\adjbox@valign@M{\a:AdjustboxValignMiddle}
\pend:def\adjbox@valign@m{\a:AdjustboxValignMiddle}
\pend:defI\adjbox@valign@c{\a:AdjustboxValignCenter}
\pend:def\adjbox@valign@b{\a:AdjustboxValignBottom}
\pend:def\adjbox@valign@B{\a:AdjustboxValignBottom}
% make an unique ID for each adjustbox environment
\newcounter{adjustbox@4ht}
\def\update:adjustbox:id{\stepcounter{adjustbox@4ht}\def\AdjustboxId{adjustbox-\arabic{adjustbox@4ht}}}
\NewConfigure{Adjustbox}{2}
\def\:tempa#1#2#3#4{\update:adjustbox:id\a:Adjustbox\o:adjbox@@frame:{#1}{#2}{#3}{#4}\b:Adjustbox}
\HLet\adjbox@@frame\:tempa
% suppress trying to draw the frame
\def\adjbox@boxframe#1#2#3{}
% we should redefine all adjustbox environments, they may produce unvanted artifacts, math mode, etc.
% keys are set, so it should be possible to extract colors or frame size in theory
% I just haven't found a working solution yet
\renewenvironment{adjustbox}[1]{\update:adjustbox:id\adjbox@setkeys{#1}\a:Adjustbox}{\b:Adjustbox}
% definitions for macros
% we don't save any colors and just use one configuration for all box types.
\def\@bgcolorbox#1{\update:adjustbox:id\a:Adjustbox\BOXCONTENT\b:Adjustbox}
\def\@foregroundbox#1#2#3{\update:adjustbox:id\leavevmode\a:Adjustbox\BOXCONTENT\b:Adjustbox}
\def\@backgroundbox#1#2#3{\update:adjustbox:id\leavevmode\a:Adjustbox\BOXCONTENT\b:Adjustbox}
\Hinput{adjustbox}
它为每个调整框生成唯一的 ID,因此可以使用 CSS 对其进行样式设置。配置如下所示:
\Preamble{xhtml}
\Configure{halignTR}{}
\Configure{AdjustboxValignTop}{\Css{\#TBL-\TableNo-\HRow-{vertical-align:top;}}}
\Configure{AdjustboxValignMiddle}{\Css{\#TBL-\TableNo-\HRow-{vertical-align:middle;}}}
\Configure{AdjustboxValignCenter}{\Css{\#TBL-\TableNo-\HRow-{vertical-align:middle;}}}
\Configure{AdjustboxValignBottom}{\Css{\#TBL-\TableNo-\HRow-{vertical-align:bottom;}}}
\makeatletter
\def\pttoem#1{\strip@pt\dimexpr#1/\f@size em}
\Configure{Adjustbox}
{\IgnorePar\EndP\IgnorePar\HCode{<div class="adjustbox" id="\AdjustboxId">}}
{\Css{\#\AdjustboxId{border: \pttoem{\fboxrule} solid black;padding: \pttoem{\fboxsep};}}\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}
\makeatother
\begin{document}
\EndPreamble
有趣的是:
\def\pttoem#1{\strip@pt\dimexpr#1/\f@size em}
\Configure{Adjustbox}
{\IgnorePar\EndP\IgnorePar\HCode{<div class="adjustbox" id="\AdjustboxId">}}
{\Css{\#\AdjustboxId{border: \pttoem{\fboxrule} solid black;padding: \pttoem{\fboxsep};}}\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}
它定义了\pttoem
将 TeX 尺寸转换为 的命令em
,因为在 CSS 中使用相对单位更好。为每个 adjustbox 构建<div class="adjustbox">
具有唯一 ID 的\AdjusboxID
。为每个框创建具有边框大小和填充的 CSS。
结果如下: