我需要生成测验以导入到moodle平台中。测验包含图表。
我尝试了 texlive 版本 2018.20190227-2 中的 moodle 包。当我运行 pdflatex 时,会生成 .pdf 和 .xml 文件,没有任何错误消息,但 base64 编码的图像不包含在 xml 输出文件中。moodle.sty 所需的所有命令都已安装(ghostscript、openssl 和 imagemagick)。这是一个示例文件 .tex
\documentclass[12pt]{article}
\usepackage{moodle}
\usepackage{graphicx}
\graphicspath{{../figures/}}
\begin{document}
\begin{quiz}{Newton laws}
\begin{multi}[shuffle=true, points=1]{Newton laws - 1}
blablabla
\includegraphics{fig3}
\item* 1
\item 2
\end{multi}
\end{quiz}
\end{document}
我运行pdflatex --shell-escape=true file.tex
pdflatex 的相关(我认为)输出是,
...
(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd)
moodle.sty: Processing \includegraphics[]{fig3} for HTML...
moodle.sty: Converting 'fig3' to PNG...
moodle.sty: Converting 'fig3.png' to base64...
moodle.sty: Reading base64 file 'fig3.enc'...
moodle.sty: <IMG> tag inserted.
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./fig3.png (PNG copy)>]
...
但是在 xml 输出文件中不包含解码的 base64 图像,我只得到应该插入图像的以下位置:
... <IMG SRC="data:image/png;base64,"> ...
我最终在上一行的逗号后手动粘贴了 base64 解码的图像,但这很繁琐,因为我必须生成一个包含大量图像的问题库。
提前致谢。
答案1
确实内部moodle.sty
没有使用\graphicspath
转换为base64。转换命令定义如下:
\openssl\otherspace enc -base64 -in #2.png -out #2.enc
定义\openssl
为运行 openssl 的命令,\otherspace
默认情况下为空。但是,您可以使用包动态修改此命令xpatch
。
假设您定义了一个\moodleimgpath
包含路径的命令。转换命令在宏中使用\moodle@includegraphics@int@int
,因此这是需要修补的宏。
@
因为名称中有一个符号,通常只在包源代码中使用,所以您需要在补丁之前和之后指定要@
在文档中用作普通符号。\makeatletter
\makeatother
修补需要五个参数:首先是修补的宏,然后是需要修改的字符串,然后是替换字符串,然后是修补成功时运行的代码,然后是修补失败时运行的代码。在本例中:
\makeatletter
\xpatchcmd{\moodle@includegraphics@int@int}%
{\openssl\otherspace enc -base64 -in #2.png -out #2.enc}%
{\openssl\otherspace enc -base64 -in \moodleimgpath#2.png -out #2.enc}%
{\typeout{patch ok}}%
{\typeout{patch failed}}
\makeatother
\moodleimgpath
那么从派生出来就很好了\graphicspath
。\graphicspath
宏有一个非常简单的定义,它是内部宏 的包装器\Ginput@path
。因此,我们可以使用完整的重新定义来定义原始内部宏,也可以为 Moodle 定义我们的新宏。但是,由于图形路径可以用额外的括号(\graphicspath{{mypath}}
)给出,因此在设置新宏时应将其删除。可以使用 来删除括号\@firstofone
。
完整 MWE:
\documentclass[12pt]{article}
\usepackage{moodle}
\usepackage{graphicx}
\usepackage{xpatch}
\makeatletter
\def\graphicspath#1{\def\Ginput@path{#1}\edef\moodleimgpath{\@firstofone#1}}
\xpatchcmd{\moodle@includegraphics@int@int}%
{\openssl\otherspace enc -base64 -in #2.png -out #2.enc}%
{\openssl\otherspace enc -base64 -in \moodleimgpath#2.png -out #2.enc}%
{\typeout{patch ok}}%
{\typeout{patch failed}}
\makeatother
\graphicspath{{./newton/}}
\begin{document}
\begin{quiz}{Newton laws}
\begin{multi}[shuffle=true, points=1]{Newton laws - 1}
blablabla
\includegraphics[width=6cm]{newtons-law}
\item* 1
\item 2
\end{multi}
\end{quiz}
\end{document}
XML 输出:
<IMG width=243 SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwQAAAE5CAIAAACh4nDvAACAAElEQVR42uydBXQU etc">
在 Moodle 上:
请注意,这要求所有图像都位于该文件夹中,或者,如果您想要修改路径,则需要在文档中的某个位置重新修补该命令。此外,这可能会干扰 TikZ 图像的处理,在这种情况下很可能需要进行一些额外的调整。
答案2
Moodle 将图形转换为 XML 文件的 base64 的流程如下:
Input graphics -> Imagemagick -> openssl -> base64 Output
Marijn 的解决方案似乎在假设人们处理 PNG 图形并使用\includegraphics
而不写入图形文件扩展名 (.png) 的情况下工作。 imagemagick 步骤失败(如果您不想不必要地调整原始 PNG 文件的大小,这可能是一件好事),而不会影响其余过程。
ASarkar 的改编是在假设人们处理 PDF 图形并使用而不写入图形文件扩展名 (.pdf) 的情况下进行的\includegraphics
。imagemagick 步骤成功(前提是您的系统策略允许 Ghostscript将 PDF 转换为 PNG)。
两个都Marijn 的和
阿萨卡的\graphicspath
如果不调用该命令,解决方案将会失败。
这是为处理不同图形文件格式的人提供的解决方案。需要付出的代价是始终在调用中指定文件扩展名\includegraphics
:
\documentclass{article}
\usepackage{graphicx,moodle}
\makeatletter
\def\moodle@graphicspath{\@ifundefined{Ginput@path}{}{\xa\@firstofone\Ginput@path}}
\xpatchcmd{\moodle@includegraphics@int@int}%
{#2 -resize}%
{\moodle@graphicspath#2 -resize}%
{\typeout{patch ok}}%
{\typeout{patch failed}}
\makeatother
\begin{document}
\begin{quiz}{Newton laws}
\begin{multi}[shuffle=true, points=1]{Newton laws - 1}
blablabla
\includegraphics{folder1/fig3.png} % the path is specified here
\item* 1
\item 2
\end{multi}
\graphicspath{{folder2/}} % path specified with \graphicspath
\begin{multi}[shuffle=true, points=1]{Newton laws - 1}
blablabla
\includegraphics{fig4.pdf}
\item* 1
\item 2
\end{multi}
\end{quiz}
\end{document}
请注意,加载该包是多余的,xpatch
因为moodle
无论如何都需要它。
正在开发的 moodle 软件包版本使用了这种方法。请参阅此已修复问题
答案3
看来 moodle.sty 要求图像文件与 latex 源文件位于同一目录中。我将所有图像文件复制到 latex 源所在的目录,现在 xml 文件已嵌入解码的 base64 文件。因此看来 \graphicspath 不能与 moodle.sty 一起使用
答案4
所有文件都在同一个文件夹中。它存在配置外部程序的问题,不知道该怎么办。
magick’ 不是内部或外部命令,也不是可运行程序或批处理文件。moodle.sty: 将 './robot.png.png' 转换为 base64...'openssl' 不是内部或外部命令,也不是可运行程序或批处理文件。moodle.sty: