moodle.sty 不会在 xml 输出文件中插入图形

moodle.sty 不会在 xml 输出文件中插入图形

我需要生成测验以导入到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:

相关内容