![includegraphics 不会在电子书转换时剪辑图片](https://linux22.com/image/414540/includegraphics%20%E4%B8%8D%E4%BC%9A%E5%9C%A8%E7%94%B5%E5%AD%90%E4%B9%A6%E8%BD%AC%E6%8D%A2%E6%97%B6%E5%89%AA%E8%BE%91%E5%9B%BE%E7%89%87.png)
这是我使用 LaTeX 创建电子书的延续,之前的部分在这里:tex4ht 标题问题:未定义控制序列
当我将文档转换为电子书时,命令
\includegraphics[trim=0 0 {.5\wd0} 0,width=\dimexpr\paperwidth\relax,clip]{#1}
不会剪辑我的图片,而普通(pdf)转换会剪辑。
有什么建议吗?
第二个问题,为什么电子书转换后会重复我的文档两次?
文件代码:
\documentclass[12pt, twodise]{book}
\usepackage[polish, russian, english]{babel}
\usepackage[babel,autostyle=true]{csquotes}
\MakeOuterQuote{"}
\selectlanguage{english}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage{indentfirst}
\usepackage{needspace}
\usepackage{comment}
\usepackage[inner=0.75in, outer=0.75in, top=0.75in, bottom=0.75in, paperwidth=6in, paperheight=9in]{geometry}% inner=0.875in
%\usepackage{changepage}
\usepackage{caption}
\usepackage{graphicx}
\usepackage{anyfontsize}
\usepackage{xargs}
\usepackage{epigraph}
\usepackage{afterpage}
\usepackage[figuresright]{rotating}
\usepackage{lettrine}
\usepackage{yfonts}
\usepackage{dpfloat}
\usepackage{nopageno}
\usepackage{fancyhdr}
\usepackage{lipsum}
\usepackage[font=Large,labelfont=Large]{caption}
\graphicspath{{"graphics/"}}
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\setlength{\parskip}{1em}
\newcommandx{\spic}[3][1=0,2]{
\clearpage
\noindent\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\centering\includegraphics[angle=#1, width=\textwidth]{#3}
%\caption*{#2}
\end{minipage}
\clearpage
}
\newcommandx{\pic}[3][1=0,2]{
\begingroup
\clearpage
\newpage
\vspace*{3in}
\centering{\Large #2}
\newpage
\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\center{\includegraphics[angle=#1, width=\textwidth]{#3}}
%\caption*{#2}
\end{minipage}
\clearpage
\endgroup
}
\newcommandx{\lpic}[3][1=0, 2=]{
\newpage
% \clearpage
% \thispagestyle{empty}
\begin{sidewaysfigure}[ht]
\center{\includegraphics[angle=#1, width=0.8\textheight]{#3}}
\caption*{#2}
\end{sidewaysfigure}
}
\newcommand\blankpage{
\null
%\thispagestyle{empty}
%\addtocounter{page}{-1}
\newpage
}
\newcommand{\tmpx}{}
\newcommand\tmp[1]{\renewcommand{\tmpx}{#1}}
\fancypagestyle{capt}{\fancyfoot[R]{\tmpx}}
\newcommandx{\twosidepic}[2][2]{
\clearpage
\begingroup
\sbox0{\includegraphics{#1}}
\begin{figure}[p]% will be the left-side figure
\begin{leftfullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim=0 0 {.5\wd0} 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, justification=raggedleft, labelsep=space}
% \caption*{}
\end{minipage}
\end{leftfullpage}
\end{figure}
\begin{figure}[p]
\begin{fullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim={.5\wd0} 0 0 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, labelsep=space, justification=centering} %justification=justified
% \caption*{#2}
%
\end{minipage}
\end{fullpage}
\end{figure}
\endgroup
}
% \pagestyle{fancy}
\fancyhf{}
\fancypagestyle{alim}{\fancyhf{}\renewcommand{\headrulewidth}{0pt}\fancyfoot[C]{\arabic{page}}}
\addto\captionsenglish{\renewcommand{\figurename}{}}
\begin{document}
\pic{_SDC2222}
\blankpage
\twosidepic{_SDC3333}
%\end{comment}
\end{document}
根据评论,这是我使用的配置文件:
\Preamble{xhtml}
\Configure{@TITLE}{\let\titlefont\relax}
\Configure{graphics*}
{pdf}
{\Needs{"convert '\csname Gin@base\endcsname.pdf'
'\csname Gin@base\endcsname.jpg'"}%
\Picture[pict]{\csname Gin@base\endcsname.jpg}%
\special{t4ht+@File: \csname Gin@base\endcsname.jpg}
}
\begin{document}
\EndPreamble
按照以下说明,我将我的文件编辑为 mypic.sty、mypic.4ht 和 mydocument.tex:
mypic.sty:
\ProvidesPackage{mypic}
\usepackage{graphicx}
\usepackage{dpfloat}
\usepackage{xargs}
\usepackage[font=Large,labelfont=Large]{caption}
\graphicspath{{"graphics/"}}
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\newcommandx{\spic}[3][1=0,2]{
\clearpage
\noindent\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\centering\includegraphics[angle=#1, width=\textwidth]{#3}
%\caption*{#2}
\end{minipage}
\clearpage
}
\newcommandx{\pic}[3][1=0,2]{
\begingroup
\clearpage
\newpage
\vspace*{3in}
\centering{\Large #2}
\newpage
\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\center{\includegraphics[angle=#1, width=\textwidth]{#3}}
%\caption*{#2}
\end{minipage}
\clearpage
\endgroup
}
\newcommandx{\lpic}[3][1=0, 2=]{
\newpage
% \clearpage
\begin{sidewaysfigure}[ht]
\center{\includegraphics[angle=#1, width=0.8\textheight]{#3}}
\caption*{#2}
\end{sidewaysfigure}
}
\newcommandx{\twosidepic}[2][2]{
\clearpage
\begingroup
\sbox0{\includegraphics{#1}}
\begin{figure}[p]% will be the left-side figure
\begin{leftfullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim=0 0 {.5\wd0} 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, justification=raggedleft, labelsep=space}
\caption*{}
\end{minipage}
\end{leftfullpage}
\end{figure}
\begin{figure}[p]
\begin{fullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim={.5\wd0} 0 0 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, labelsep=space, justification=centering} %justification=justified
\caption*{#2}
\end{minipage}
\end{fullpage}
\end{figure}
\endgroup
}
\addto\captionsenglish{\renewcommand{\figurename}{}}
\newcommand\trimimage[1]{%
}
\endinput
mypic.4ht
\NewConfigure{twosidepic}{2}
\renewcommandx\twosidepic[2][2]{%
\ifvmode\IgnorePar\fi\EndP%
\a:twosidepic%
\begin{figure}%
\openin15=#1-01.jpg
\ifeof15
\Needs{"convert "#1.jpg" -crop 50\%x100\% +repage "#1-\%02d.jpg""}
\else
\includegraphics{#1-00.jpg}%
\includegraphics{#1-01.jpg}%
\fi
\caption*{#2}%
\end{figure}%
\b:twosidepic\par%
}
我的文档.tex:
\documentclass[12pt, twodise]{book}
\usepackage[polish, russian, english]{babel}
\usepackage[babel,autostyle=true]{csquotes}
\MakeOuterQuote{"}
\selectlanguage{english}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage{indentfirst}
\usepackage{needspace}
\usepackage{comment}
\usepackage[inner=0.75in, outer=0.75in, top=0.75in, bottom=0.75in, paperwidth=6in, paperheight=9in]{geometry}% inner=0.875in
%\usepackage{changepage}
\usepackage{anyfontsize}
\usepackage{epigraph}
\usepackage{afterpage}
\usepackage[figuresright]{rotating}
\usepackage{lettrine}
\usepackage{yfonts}
\usepackage{nopageno}
\usepackage{fancyhdr}
\usepackage{lipsum}
\usepackage{mypic}
\setlength{\parskip}{1em} % changes vertical space between paragraphs
\setlength\parindent{0pt} % sets indent to zero
\newcommand\blankpage{
\null
%\thispagestyle{empty}
%\addtocounter{page}{-1}
\newpage
}
\newcommand{\tmpx}{}
\newcommand\tmp[1]{\renewcommand{\tmpx}{#1}}
\fancypagestyle{capt}{\fancyfoot[R]{\tmpx}}
% \pagestyle{fancy}
\fancyhf{}
\fancypagestyle{alim}{\fancyhf{}\renewcommand{\headrulewidth}{0pt}\fancyfoot[C]{\arabic{page}}}
\begin{document}
\pic{1}
\blankpage
\twosidepic{2}
%\end{comment}
\end{document}
答案1
如果我理解正确的话,您的命令\twosdepic
会将图像分割成两个相对的面,以占据打开的书的整个尺寸。我的第一反应是,此功能在电子书中没什么用,因为您通常一次只查看一页,因此如果将其分割成两页,您将看不到全尺寸的图像。因此,真正的解决方案是重新定义 TeX4ht 的宏,使其仅包含一次全尺寸图像。
如果你真的想剪辑图像(我真的认为这对你来说不是一个好主意),你有两个选择:
- 准备两张图片,每张图片是原始图片的一半,并将它们包含在内。这可以使用 Imagemagick 自动完成。这个解决方案的好处是它应该适用于任何电子书阅读器。
- 使用 CSS 剪辑图像。请注意,电子书阅读器因 CSS 支持不佳而臭名昭著,因此您最终可能会得到阅读器呈现的两张全尺寸图像。
无论如何,我要做的第一件事就是将你的自定义命令从 TeX 文件提取到独立包中。例如mypackages.sty
:
\ProvidesPackage{mypackages}
\RequirePackage{graphicx}
\RequirePackage{caption}
\RequirePackage{xargs}
\RequirePackage{fancyhdr}
\RequirePackage{dpfloat}
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\setlength{\parskip}{1em}
\newcommandx{\spic}[3][1=0,2]{
\clearpage
\noindent\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\centering\includegraphics[angle=#1, width=\textwidth]{#3}
%\caption*{#2}
\end{minipage}
\clearpage
}
\newcommandx{\pic}[3][1=0,2]{
\begingroup
\clearpage
\newpage
\vspace*{3in}
\centering{\Large #2}
\newpage
\begin{minipage}[t][\dimexpr\textheight-6pt\relax][c]{\textwidth}
\center{\includegraphics[angle=#1, width=\textwidth]{#3}}
%\caption*{#2}
\end{minipage}
\clearpage
\endgroup
}
\newcommandx{\lpic}[3][1=0, 2=]{
\newpage
% \clearpage
% \thispagestyle{empty}
\begin{sidewaysfigure}[ht]
\center{\includegraphics[angle=#1, width=0.8\textheight]{#3}}
\caption*{#2}
\end{sidewaysfigure}
}
\newcommand\blankpage{
\null
%\thispagestyle{empty}
%\addtocounter{page}{-1}
\newpage
}
\newcommand{\tmpx}{}
\newcommand\tmp[1]{\renewcommand{\tmpx}{#1}}
\fancypagestyle{capt}{\fancyfoot[R]{\tmpx}}
\newcommandx{\twosidepic}[2][2]{
\clearpage
\begingroup
\sbox0{\includegraphics{#1}}
\begin{figure}[p]% will be the left-side figure
\begin{leftfullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim=0 0 {.5\wd0} 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, justification=raggedleft, labelsep=space}
% \caption*{}
\end{minipage}
\end{leftfullpage}
\end{figure}
\begin{figure}[p]
\begin{fullpage}
\noindent\begin{minipage}[t][\textheight][c]{\paperwidth}
\hspace*{-2\leftmargin}
\includegraphics[trim={.5\wd0} 0 0 0,width=\dimexpr\paperwidth\relax,clip]{#1}
\captionsetup{font = Large, labelfont=Large, singlelinecheck = false, format= hang, labelsep=space, justification=centering} %justification=justified
% \caption*{#2}
%
\end{minipage}
\end{fullpage}
\end{figure}
\endgroup
}
% \pagestyle{fancy}
\fancyhf{}
\fancypagestyle{alim}{\fancyhf{}\renewcommand{\headrulewidth}{0pt}\fancyfoot[C]{\arabic{page}}}
\addto\captionsenglish{\renewcommand{\figurename}{}}
\newcommand\trimimage[1]{%
}
\endinput
这使得您的 TeX 文件更易于处理,更重要的是,它使我们能够为其编写 TeX4ht 配置。mypackages.4ht
每次使用包时都会使用该文件。基本格式如下:
\NewConfigure{twosidepic}{2}
\renewcommandx\twosidepic[2][2]{%
\ifvmode\IgnorePar\fi\EndP%
\a:twosidepic%
\begin{figure}%
\includegraphics{#1}%
\caption*{#2}%
\end{figure}%
\b:twosidepic\par%
}
它只是简化了\twosidepic
命令以仅包含最低限度的内容,因为大多数原始代码在转换过程中根本没有用,它只是处理 PDF 文件中的视觉外观。它包括全尺寸的图像。定义了\NewConfigure{twosidepic}{2}
两个新命令,\a:twosidepic
和\b:twosidepic
。它们可用于从 TeX4ht 配置文件插入特定的 HTML 代码。我们尚未在此版本中使用它们,但在需要时可以使用它们会很好。
以下是示例文件:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{mypackages}
\begin{document}
\twosidepic{example-image}
\end{document}
这是 PDF 版本:
HTML 内容如下:
这是图像分割方法的配置文件:
\NewConfigure{twosidepic}{2}
\renewcommandx\twosidepic[2][2]{%
\ifvmode\IgnorePar\fi\EndP%
\a:twosidepic%
\begin{figure}%
\openin15=#1-01.png
\ifeof15
\Needs{"convert "#1.png" -crop 50\%x100\% +repage "#1-\%02d.png""}
\else
\includegraphics{#1-00.png}%
\includegraphics{#1-01.png}%
\fi
\caption*{#2}%
\end{figure}%
\b:twosidepic\par%
}
它使用 Imagemagick 将图像分割成两部分。使用以下命令进行请求:
\Needs{"convert "#1.png" -crop 50\%x100\% +repage "#1-\%02d.png""}
仅当裁剪的图像不存在时才请求图像转换,使用以下方法检查:
\openin15=#1-01.png
\ifeof15
请注意,我们希望图像采用 PNG 格式,您可以根据使用情况将其更改为其他格式。
当图像存在时,将插入左侧和右侧的图像。
请注意,此方法需要两个编译步骤tex4ebook
。第一次调用将生成图像,它们只能在第二次运行中被包含。
结果如下:
最后一种方法,使用 CSS,会更复杂,我已经尝试过了,所以我可能会稍后再尝试。
编辑:
以下是mypic.4ht
支持以下版本的版本\graphicspath
:
\NewConfigure{twosidepic}{2}
\renewcommandx\twosidepic[2][2]{%
\ifvmode\IgnorePar\fi\EndP%
\a:twosidepic%
\begin{figure}%
\def\my@ext{.jpg}
\ifx\Ginput@path\@undefined
\let\Ginput@path\input@path
\fi
\let\input@path\Ginput@path%
\@iffileonpath{#1\my@ext}{
\typeout{file found: \@filef@und}%
\expandafter\filename@parse\expandafter{\@filef@und}
\edef\base@name{\filename@area\filename@base}
\openin15=\base@name-00\my@ext\relax
\ifeof15
\Needs{"convert \base@name\my@ext" -crop 50\%x100\% +repage \base@name-\%02d\my@ext""}
\else
\includegraphics{\base@name-00\my@ext}%
\includegraphics{\base@name-01\my@ext}%
\fi
}{\typeout{Image not found}}
\caption*{#2}%
\end{figure}%
\b:twosidepic\par%
}
答案2
从您的MWE
,希望您使用的图像是 .pdf 和 .png 格式,如果是,请尝试以下操作:
\Preamble{xhtml}
\Configure{graphics*}
{pdf}
{\Needs{"convert '\csname Gin@base\endcsname.pdf'
'\csname Gin@base\endcsname.png'"}%
\Picture[pict]{\csname Gin@base\endcsname.png}%
\special{t4ht+@File: \csname Gin@base\endcsname.png}
}
\begin{document}
\EndPreamble