summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-01-05 22:05:39 +0000
committerKarl Berry <karl@freefriends.org>2021-01-05 22:05:39 +0000
commit17b165bb23c1130b25b0d82e6eb22e9323e2a5a4 (patch)
tree043e9a925408b6b8c9efb46366957a57b3a17941
parentc835c59abef4c26ab3c03d6e9a0bc1a0f4d1c202 (diff)
moodle (5jan21)
git-svn-id: svn://tug.org/texlive/trunk@57334 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/moodle/LICENSE13
-rw-r--r--Master/texmf-dist/doc/latex/moodle/README.md117
-rw-r--r--Master/texmf-dist/doc/latex/moodle/moodle.pdfbin306019 -> 241634 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/11.PNGbin0 -> 228 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/22.pdfbin0 -> 4323 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/3.gifbin0 -> 1888 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/4.jpgbin0 -> 318 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/5.jpegbin0 -> 353 bytes
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/fig/MoodlE_logo.SVG12
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_autopoints-moodle.ref117
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_calculated_python-moodle.ref57
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_categories-moodle.ref200
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_circuitikz-moodle.ref124
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_multi-moodle.ref24
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_numerical-moodle.ref24
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_shortanswer-moodle.ref24
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_commands-moodle.ref57
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_description-moodle.ref29
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_environments-moodle.ref35
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_escaping_right_braces_in_cloze-moodle.ref24
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_essay-moodle.ref40
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_expandnewcommands-moodle.ref48
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fancyvrb-moodle.ref39
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fractions-moodle.ref45
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_french-moodle.ref36
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_generalfeedback-moodle.ref158
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_handout-moodle.ref336
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics-moodle.ref523
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz-moodle.ref112
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz_and_svg-moodle.ref246
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_with_svg-moodle.ref313
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_macros-moodle.ref60
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_matching-moodle.ref70
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_mathenv-moodle.ref52
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_minted-moodle.ref66
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multi-moodle.ref99
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multiple_categories-moodle.ref61
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_penalty-moodle.ref35
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_point_points-moodle.ref69
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_special_characters-moodle.ref58
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tags-moodle.ref161
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz-moodle.ref230
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz_with_svg-moodle.ref376
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tolerance-moodle.ref84
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_truefalse-moodle.ref96
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_verbatim-moodle.ref33
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/makefile62
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_autopoints.tex51
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_calculated_lua.tex77
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_calculated_python.tex52
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_categories.tex77
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_circuitikz.tex38
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_cloze_multi.tex117
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_cloze_numerical.tex34
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_cloze_shortanswer.tex38
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_commands.tex37
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_description.tex30
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_environments.tex51
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_escaping_right_braces_in_cloze.tex53
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_essay.tex29
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_expandnewcommands.tex49
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_fancyvrb.tex72
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_fractions.tex31
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_french.tex62
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_generalfeedback.tex103
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_handout.tex159
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_includegraphics.tex45
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz.tex41
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz_and_svg.tex5
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_with_svg.tex46
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_macros.tex39
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_matching.tex39
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_mathenv.tex39
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_minted.tex128
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_multi.tex55
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_multiple_categories.tex27
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_penalty.tex21
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_point_points.tex27
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_special_characters.tex88
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_tags.tex100
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_tikz.tex68
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_tikz_with_svg.tex5
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_tolerance.tex56
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_truefalse.tex51
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/test_verbatim.tex48
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_autopoints-moodle.ref117
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_lua-moodle.ref57
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_python-moodle.ref57
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_categories-moodle.ref200
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_circuitikz-moodle.ref124
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_multi-moodle.ref23
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_numerical-moodle.ref23
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_shortanswer-moodle.ref23
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_commands-moodle.ref57
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_description-moodle.ref29
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_environments-moodle.ref35
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_escaping_right_braces_in_cloze-moodle.ref24
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_essay-moodle.ref40
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_expandnewcommands-moodle.ref48
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fancyvrb-moodle.ref39
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fractions-moodle.ref45
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_french-moodle.ref36
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_generalfeedback-moodle.ref157
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_handout-moodle.ref336
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics-moodle.ref523
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz-moodle.ref112
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz_and_svg-moodle.ref247
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_with_svg-moodle.ref313
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_macros-moodle.ref60
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_matching-moodle.ref70
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_mathenv-moodle.ref52
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_minted-moodle.ref66
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multi-moodle.ref99
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multiple_categories-moodle.ref60
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_penalty-moodle.ref34
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_point_points-moodle.ref68
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_special_characters-moodle.ref58
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tags-moodle.ref160
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz-moodle.ref234
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz_with_svg-moodle.ref388
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tolerance-moodle.ref84
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_truefalse-moodle.ref95
-rw-r--r--Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_verbatim-moodle.ref33
-rw-r--r--Master/texmf-dist/source/latex/moodle/makefile90
-rw-r--r--Master/texmf-dist/source/latex/moodle/moodle.dtx3975
-rw-r--r--Master/texmf-dist/source/latex/moodle/moodle.ins8
-rw-r--r--Master/texmf-dist/tex/latex/moodle/moodle.sty2368
127 files changed, 16187 insertions, 933 deletions
diff --git a/Master/texmf-dist/doc/latex/moodle/LICENSE b/Master/texmf-dist/doc/latex/moodle/LICENSE
new file mode 100644
index 00000000000..e5bf08acc04
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
+This work may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version.
+
+The latest version of this license is in http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX version
+2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Matthieu Guerquin-Kern.
diff --git a/Master/texmf-dist/doc/latex/moodle/README.md b/Master/texmf-dist/doc/latex/moodle/README.md
index e2ab4cd420b..83eb22b4bf8 100644
--- a/Master/texmf-dist/doc/latex/moodle/README.md
+++ b/Master/texmf-dist/doc/latex/moodle/README.md
@@ -1,50 +1,67 @@
-==============================================================================
-
-The `moodle' package v0.5
-Copyright (C) 2016 Anders Hendrickson (anders.hendrickson@snc.edu)
-
-This package allows dramatic highlighting of words and phrases
-by painting shapes around them. It is chiefly intended for
-use in Beamer presentations, but it can be used in other
-document classes as well.
-
-Changes:
-- 2016/01/11 Initial version
-
-==============================================================================
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in
- http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-
-==============================================================================
-
- This work consists of the files:
-README (this file)
-moodle.dtx
-moodle.ins
- and the derived file:
-moodle.sty
-
- The distribution consists of the files:
-README (this file)
-moodle.dtx
-moodle.ins
-moodle.pdf (the user manual)
-
------------------------------------------------------------------
-
- To install the package:
-- run: latex moodle.ins (which will generate moodle.sty)
-- Move moodle.sty to a location where LaTeX will find it (typically
- in a local texmf tree at tex/latex/moodle) and refresh the
- file database. See the FAQ on CTAN at help/uk-tex-faq or
- http://www.tug.ac.uk/faq for more information on this.
- To process the user manual
-- run: pdflatex moodle.dtx
-- run: pdflatex moodle.dtx
+# License
+
+This work may be distributed and/or modified under the conditions of the
+LaTeX Project Public License, either version 1.3 of this license or
+(at your option) any later version. The latest version of this license
+is in http://www.latex-project.org/lppl.txt and version 1.3 or later is
+part of all distributions of LaTeX version 2005/12/01 or later.
+
+# Authors
+
+Original contents (2016): [Anders O.F. Hendrickson](/author/hendrickson) ([contact](mailto:anders.o.f.hendricksonATgmail.com))
+
+2019-2021: [Matthieu Guerquin-Kern](author/guerquin-kern) ([contact](mailto:guerquin-kernATcrans.org))
+
+# Contents
+
+This work, under version number 0.8, consists of the files
+[`moodle.dtx`](/tex-archive/macros/latex/contrib/moodle/moodle.dtx),
+[`moodle.ins`](/tex-archive/macros/latex/contrib/moodle/moodle.ins), and the derived documentation
+file [`moodle.pdf`](/tex-archive/macros/latex/contrib/moodle/moodle.pdf).
+
+A TDS archive [moodle.tds.zip](http://mirrors.ctan.org/install/macros/latex/contrib/moodle.tds.zip) is
+also available to be conveniently expanded in your local texmf directory.
+It contains the derived file `moodle.sty` and a set of test files.
+
+# Requirements
+
+This package (`moodle.sty`) requires the following packages:
+- [`environ`](/pkg/environ),
+- [`xkeyval`](/pkg/xkeyval),
+- [`amssymb`](/pkg/amssymb),
+- [`trimspaces`](/pkg/trimspaces),
+- [`etex`](pkg/etex),
+- [`etoolbox`](pkg/etoolbox),
+- [`xpatch`](pkg/xpatch),
+- [`array`](pkg/array),
+- [`ifplatform`](/pkg/ifplatform),
+- [`fancybox`](pkg/fancybox), and
+- [`getitems`](pkg/getitems).
+
+In order to manipulate images, the package relies on the following external tools:
+- [GhostScript](www.ghostscript.com),
+- [ImageMagick](www.imagemagick.org), and
+- [optipng](http://optipng.sourceforge.net/).
+
+In addition, to compile the documentation, the following LaTeX packages are
+necessary:
+- [`amssymb`](pkg/amssymb),
+- [`metalogo`](pkg/metalogo),
+- [`multirow`](pkg/multirow),
+- [`threeparttable`](pkg/threeparttable),
+- [`booktabs`](pkg/booktabs),
+- [`hyperref`](pkg/hyperref),
+- [`tikz`](pkg/tikz),
+- [`minted`](pkg/minted), and
+- [`microtype`](pkg/microtype).
+
+# Building
+
+The file `moodle.sty` can be generated using the command
+```bash
+latex moodle.ins
+````
+The documentation file `moodle.pdf` can be generated by running twice the command
+```bash
+lualatex -shell-escape moodle.dtx
+```
diff --git a/Master/texmf-dist/doc/latex/moodle/moodle.pdf b/Master/texmf-dist/doc/latex/moodle/moodle.pdf
index f5dd6cae3c4..1c047103cd7 100644
--- a/Master/texmf-dist/doc/latex/moodle/moodle.pdf
+++ b/Master/texmf-dist/doc/latex/moodle/moodle.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/11.PNG b/Master/texmf-dist/doc/latex/moodle/test/fig/11.PNG
new file mode 100644
index 00000000000..59e8b31548b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/11.PNG
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/22.pdf b/Master/texmf-dist/doc/latex/moodle/test/fig/22.pdf
new file mode 100644
index 00000000000..1a0a18bf66d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/22.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/3.gif b/Master/texmf-dist/doc/latex/moodle/test/fig/3.gif
new file mode 100644
index 00000000000..575eb3c1226
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/3.gif
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/4.jpg b/Master/texmf-dist/doc/latex/moodle/test/fig/4.jpg
new file mode 100644
index 00000000000..87648692792
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/4.jpg
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/5.jpeg b/Master/texmf-dist/doc/latex/moodle/test/fig/5.jpeg
new file mode 100644
index 00000000000..e7d96e0d645
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/5.jpeg
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/moodle/test/fig/MoodlE_logo.SVG b/Master/texmf-dist/doc/latex/moodle/test/fig/MoodlE_logo.SVG
new file mode 100644
index 00000000000..ea629f46ceb
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/fig/MoodlE_logo.SVG
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 327 100" xmlns="http://www.w3.org/2000/svg">
+<g fill="#f98012">
+<path d="m72.4 77.45v-27.07c0-5.65-2.35-8.5-7-8.5-4.674 0-7.024 2.826-7.024 8.5v27.07h-13.77v-27.07c0-5.65-2.301-8.5-6.899-8.5-4.676 0-7 2.826-7 8.5v27.07h-13.78v-28.68c0-5.9 2.051-10.37 6.151-13.4 3.599-2.701 8.5-4.076 14.65-4.076 6.225 0 10.82 1.6 13.77 4.801 2.549-3.201 7.174-4.801 13.9-4.801 6.15 0 11.02 1.35 14.62 4.076 4.1 3.025 6.15 7.5 6.15 13.4v28.68z"/>
+<path d="m136.1 22.75-3.094-2.117-7.492 12.05c-5.375-1.792-10.59-1.792-11.56-1.792-17.1 0-26.55 10.59-26.55 24.43 0 6.351 2.443 14.98 11.73 19.87l-7.328 11.89 3.095 1.954 7.653-12.21c5.212 1.792 10.1 1.792 11.4 1.792 17.43 0 26.55-10.59 26.55-23.29 0-7.98-3.421-16.45-11.73-20.85zm-33.71 47.23c-3.095-3.746-3.095-9.609-3.095-14.82 0-7.817 0-20.52 14.66-20.52 3.095 0 6.189 0.651 8.794 2.443zm23.13-30.29c2.932 4.072 3.095 9.772 3.095 15.47 0 7.816 0 19.71-14.66 19.71-1.302 0-5.211 0-8.631-2.28z"/>
+<path d="m165.6 78.55c-6.975 0-12.75-2.224-17.3-6.65-4.551-4.424-6.826-10.12-6.826-17.12 0-6.975 2.275-12.67 6.826-17.1 4.549-4.424 10.32-6.65 17.3-6.65s12.77 2.225 17.35 6.65c4.6 4.426 6.899 10.15 6.899 17.1 0 6.975-2.299 12.68-6.899 17.12-4.6 4.426-10.37 6.65-17.35 6.65zm0-36.45c-3.324 0-5.875 1.25-7.674 3.775-1.775 2.525-2.676 5.5-2.676 8.975 0 3.475 0.8256 6.4 2.5 8.774 1.901 2.725 4.526 4.076 7.85 4.076 3.326 0 5.926-1.35 7.85-4.076 1.75-2.4 2.625-5.326 2.625-8.774 0-3.475-0.8256-6.4-2.5-8.774-1.924-2.651-4.576-3.975-7.975-3.975z"/>
+<path d="m227.2 77.32v-4.551c-1.225 1.65-3.326 2.951-6.276 3.951-2.625 0.8996-5.125 1.35-7.5 1.35-6.574 0-11.85-2.25-15.82-6.776-3.975-4.5-5.975-10.1-5.975-16.75 0-6.574 1.951-12.07 5.85-16.5 3.449-3.924 9.1-6.65 15.57-6.65 7.301 0 11.58 2.75 14.15 5.9v-37.3h13.42v77.32zm0-25.75c0-2.451-1.176-4.826-3.5-7.075-2.326-2.25-4.75-3.375-7.2-3.375-3.525 0-6.326 1.451-8.375 4.299-1.799 2.551-2.701 5.676-2.701 9.35 0 3.625 0.9013 6.7 2.701 9.225 2.049 2.951 4.85 4.424 8.375 4.424 2.125 0 4.451-1 6.95-3.025 2.5-2 3.75-4.074 3.75-6.225z"/>
+<path d="m244.8 0h13.8v77.32h-13.8z"/>
+<path d="m327 73.83h-2.774c-2.772 15.57-5.324 23-24.29 23h-14.64c-5.212 0-5.435-0.712-5.435-4.07v-27.07h9.872c10.76 0 11.98 3.257 11.98 11.91h2.773v-26.87h-2.773c0 8.649-1.22 11.8-11.98 11.8h-9.872v-24.32c0-3.358 0.2227-4.072 5.435-4.072h14.2c16.97 0 19.85 5.598 21.63 19.74h2.773l-3.105-22.8h-62.11v3.053h2.552c8.539 0 8.762 1.12 8.762 4.783v53.12c0 3.663-0.2216 4.782-8.762 4.782h-2.552v3.155h63.67l4.659-26.15z"/>
+</g>
+<path d="m43.67 29.22 13.68-10-0.176-0.6003c-24.67 3.025-35.9 5.174-57.17 17.5l0.2007 0.5493 1.699 0.0263c-0.1497 1.699-0.4243 5.9-0.074 12.25-2.35 6.824-0.051 11.47 2.099 16.52 0.3503-5.25 0.301-11-1.299-16.72-0.3257-6.275-0.0493-10.42 0.1003-12.02l14.1 0.125s-0.1003 4.25 0.4243 8.274c12.6 4.424 25.27-0.0247 32-10.92-1.9-2.125-5.576-4.975-5.576-4.975z" fill="#333"/>
+</svg>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_autopoints-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_autopoints-moodle.ref
new file mode 100644
index 00000000000..e562720d20b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_autopoints-moodle.ref
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[All correct]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>100\% is distributed uniformly. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Auto sanction]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Without the star, an error shall be issued because correct answers should sum up to 100\%. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[All correct but sum \(\geq 100\)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A warning shall be issued because correct answers must sum up to 100\%. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="20" format="html">
+ <text><![CDATA[<p>2</p>]]></text>
+ </answer>
+ <answer fraction="40" format="html">
+ <text><![CDATA[<p>5</p>]]></text>
+ </answer>
+ <answer fraction="40" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>1</p>]]></text>
+ </answer>
+ <answer fraction="-25" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="-25" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_calculated_python-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_calculated_python-moodle.ref
new file mode 100644
index 00000000000..c3f6cb45560
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_calculated_python-moodle.ref
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (3, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(3 + 2 =\){1:NUMERICAL:=5:0}\(3 - 2 =\){1:NUMERICAL:=1:0}\(3 * 2 =\){1:NUMERICAL:=6:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 2 =\){1:NUMERICAL:=6:0}\(4 - 2 =\){1:NUMERICAL:=2:0}\(4 * 2 =\){1:NUMERICAL:=8:0}\(4 : 2 =\){1:NUMERICAL:=2:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>4</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 3)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 3 =\){1:NUMERICAL:=7:0}\(4 - 3 =\){1:NUMERICAL:=1:0}\(4 * 3 =\){1:NUMERICAL:=12:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_categories-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_categories-moodle.ref
new file mode 100644
index 00000000000..bc8c3da3440
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_categories-moodle.ref
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples</text>
+ </category>
+</question>
+
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples/Generic</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples/Very Specific</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Other Category</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Other Category/Other Subcategory</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_circuitikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_circuitikz-moodle.ref
new file mode 100644
index 00000000000..200a8be637a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_circuitikz-moodle.ref
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Circuitikz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>toast</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"></p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_multi-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_multi-moodle.ref
new file mode 100644
index 00000000000..41e56f930bd
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_multi-moodle.ref
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Cloze Multi</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Regular, single, no shuffle {1:MULTICHOICE:=chip#yes~%10%<I>chop</I>~%-30%<B>chap</B>#no.}</P><P>Vertical, single, no shuffle {1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>Horizontal, single, no shuffle {1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P>Regular, single, shuffle {1:MULTICHOICE_S:=chip~chop#yes~chap#no.}</P><P>Vertical, single, shuffle {1:MULTICHOICE_VS:=chip#yes~%10%chop~chap#no.}</P><P>Horizontal, single, shuffle {1:MULTICHOICE_HS:=chip#yes~chop~chap#no.}</P><P>Regular, multiple, no shuffle {1:MULTIRESPONSE:=chip~=chop#yes~chap#no.}</P><P></P><P>Horizontal, multiple, no shuffle {1:MULTIRESPONSE_H:=chip#yes~=chop~chap#no.}</P><P>Regular, multiple, shuffle {1:MULTIRESPONSE_S:=chip~=chop#yes~chap#no.}Horizontal, multiple, shuffle {1:MULTIRESPONSE_HS:=chip#yes~=chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_numerical-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_numerical-moodle.ref
new file mode 100644
index 00000000000..857887aa2ab
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_numerical-moodle.ref
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Close Short Answer</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Enter an integer \(n\) such that \(0&lt; n\leq 2\). {1:NUMERICAL:%10%0:0.001#study difference between \(&lt;\) and \(\leq \)~=1:0.01#good!~=2:0.1#OK}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_shortanswer-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_shortanswer-moodle.ref
new file mode 100644
index 00000000000..e15cdf9c6a3
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_cloze_shortanswer-moodle.ref
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Close Short Answer</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Who? {1:SHORTANSWER_C:=chip~%10%chop#yes~%-30%chap#no.}what? {1:SHORTANSWER:=chip~%10%chop#yes~%-30%chap#no.}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_commands-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_commands-moodle.ref
new file mode 100644
index 00000000000..19055488acd
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_commands-moodle.ref
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Commands</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Commands]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Find the answer with small capitals </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><EM>emphasis</EM></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><B>bold</B></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><I>italic</I></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><CODE>typewriter</CODE></p>]]></text>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><SPAN STYLE=&#34;font-variant: small-caps;&#34;>Small Capitals</SPAN></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><SPAN STYLE=&#34;text-decoration: underline;&#34;>underlined</SPAN></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>M<SUP>me</SUP></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>H<SUB>2</SUB>O</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><A href=&#34;http://192.0.0.256&#34;>http://192.0.0.256</A></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><A href=&#34;mailto:name@server.com&#34;>Contact me</A></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_description-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_description-moodle.ref
new file mode 100644
index 00000000000..7a13bc0d253
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_description-moodle.ref
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="description">
+ <name format="html">
+ <text><![CDATA[Requirements]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is a description. Not really a question. We can include environments and math. <UL><LI>This</LI><LI>That</LI></UL> \[\mathrm {e}^{2\mathrm {i}\pi }+1=0.\]</p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>here is a feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[descr]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_environments-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_environments-moodle.ref
new file mode 100644
index 00000000000..4fa9cf95910
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_environments-moodle.ref
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Environments</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Environments]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><CENTER><SPAN STYLE=&#34;font-variant: small-caps;&#34;>This is a question</SPAN></CENTER> Select the numbered list </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><OL><LI>C</LI><LI>D <UL><LI>S</LI><LI>T</LI><LI>U</LI></UL></LI></OL></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>yes</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><UL><LI>E <OL><LI>X</LI><LI>Y</LI><LI>Z</LI></OL></LI><LI>F</LI></UL></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Example of numbered list:<BR/><OL><LI>first item</LI><LI>second item</LI></OL></p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_escaping_right_braces_in_cloze-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_escaping_right_braces_in_cloze-moodle.ref
new file mode 100644
index 00000000000..8903c9ce654
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_escaping_right_braces_in_cloze-moodle.ref
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Cloze: Escaping Characters</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>No escaping here: \(y=a\sqrt {x}/2+{b}\) </P><P>No escaping here: <CODE>text</CODE> \(y=a\sqrt {x}/2+{b}\) {4:MULTICHOICE_V:=\(\lbrace A\rbrace \)~{B\}}</P><P>{No escaping here: } \(y=a\sqrt {x}/2+{b}\) {1:SHORTANSWER:=chip#nip~%10%nop#that must be escaped: \(y=a\sqrt {x\}/2+{b\}\)}</P><P>{No escaping here: } \(y=a\sqrt {x}/2+{b}\) {1:NUMERICAL:=0:0#nip~%10%1:0#that must be escaped: \(y=a\sqrt {x\}/2+{b\}\)}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>2</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_essay-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_essay-moodle.ref
new file mode 100644
index 00000000000..7b025148644
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_essay-moodle.ref
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Essay Test</text>
+ </category>
+</question>
+
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>feedback for essay</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>B </li>
+ <li>C</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html">
+ <text><![CDATA[Type you answer here]]></text>
+ </responsetemplate>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_expandnewcommands-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_expandnewcommands-moodle.ref
new file mode 100644
index 00000000000..881c1d0db54
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_expandnewcommands-moodle.ref
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Recording New Commands for Expansion</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Sets]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Standard notation for the set of natural integers: </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\mathbb {N}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {Z}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {Q}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {C}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {R}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {V}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\vphantom {K}^\dagger \mathbb {K}^*_2\)</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fancyvrb-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fancyvrb-moodle.ref
new file mode 100644
index 00000000000..d9dbffce95c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fancyvrb-moodle.ref
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Fancy Verbatim</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Pick up the code decorated with line numbering on both sides. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark>% !TEX TS-program = xelatex</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><mark>\documentclass{article}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark>\usepackage[nostamp]{moodle}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark>\newif\iffvextra</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. Here, line numbers lie on the left side.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE>% !TEX TS-program = xelatex<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/><mark>\documentclass{article}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">8</span><BR/>\usepackage[nostamp]{moodle}<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">9</span><BR/>\newif\iffvextra<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">10</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. Here, line numbers lie on the right side.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark>\ifxetex % FOR XELATEX</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark> \usepackage{fontspec}</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span>\else %% FOR PDFLATEX<BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span> \usepackage[utf8]{inputenc} % necessary<BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">8</span><mark> \usepackage[T1]{fontenc} % necessary</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">9</span>\fi<BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>yes!</p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fractions-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fractions-moodle.ref
new file mode 100644
index 00000000000..0cf28aa397f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_fractions-moodle.ref
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="83.33333" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-66.66667" format="html">
+ <text><![CDATA[<p><B>68</B></p>]]></text>
+ </answer>
+ <answer fraction="16.66667" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><CODE>nothing</CODE></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_french-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_french-moodle.ref
new file mode 100644
index 00000000000..7a88aba6bda
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_french-moodle.ref
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/French Issues</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Test french]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p> <SPAN STYLE=&#34;text-decoration: underline;&#34;>Pangramme</SPAN> con&ccedil;u par Gilles <SPAN STYLE=&#34;font-variant: small-caps;&#34;>Esposito-Far&egrave;se</SPAN>&#8239;:</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>1<SUP>er</SUP>, M<SUP>me</SUP>, N<SUP>o</SUP><BR/> 1<SUP>er</SUP>, M<SUP>me</SUP>, N<SUP>o</SUP><BR/> H<SUB>2</SUB>O</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>D&egrave;s No&euml;l o&ugrave; un z&eacute;phyr ha&iuml; me v&ecirc;t de gla&ccedil;ons w&uuml;rmiens je d&icirc;ne d&rsquo;exquis r&ocirc;tis de b&oelig;uf au kir &agrave; l&rsquo;a&yuml; d&rsquo;&acirc;ge m&ucirc;r & c&aelig;tera&#8239;!</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>cit&eacute; dans &laquo;&#8239;&#8239;<A href=&#34;https://jacques-andre.fr/faqtypo/lessons.pdf&#34;>Petites le&ccedil;ons de typographie</A>&#8239;&#8239;&raquo; de Jacques <SPAN STYLE=&#34;font-variant: small-caps;&#34;>Andr&eacute;</SPAN>.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>Portez ce vieux whisky au juge blond qui fume.</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_generalfeedback-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_generalfeedback-moodle.ref
new file mode 100644
index 00000000000..61e9145d1cc
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_generalfeedback-moodle.ref
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/General Feedback Test</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>multi</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tic</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tac</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>shortanswer</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>B</text>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>C</text>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>numerical</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>2</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>matching</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <answer><text>oui</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <answer><text>non</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>Å</text></answer>
+ </subquestion>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>essay</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>&aelig;yo </li>
+ <li>&oelig;</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;&OElig;{1:MULTICHOICE:=chip~%10%chop#yes~chap#no.}&#8239;&raquo;&Aring;{1:SHORTANSWER:=B#toc~=C#&laquo;&#8239;&#8239;&raquo;~*}&laquo;&#8239;&Aring;{1:NUMERICAL:=1:0~=2:0#&laquo;&#8239;&#8239;&raquo;~3:0}&OElig;{1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>&OElig;{1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>54</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_handout-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_handout-moodle.ref
new file mode 100644
index 00000000000..47a62893013
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_handout-moodle.ref
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/ Option Handout</text>
+ </category>
+</question>
+
+<question type="description">
+ <name format="html">
+ <text><![CDATA[Description]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Description text</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Essay]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>A </li>
+ <li>B </li>
+ <li>C</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi Single]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>0</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="10" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>CCC</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi Multiple]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>CCC</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>DDD</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>false</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 3]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>1</tolerance>
+ <feedback format="html"><text><![CDATA[<p>1</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>1</tolerance>
+ <feedback format="html"><text><![CDATA[<p>3</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short Answer]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>aaa</text>
+ <feedback format="html"><text><![CDATA[<p>1</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>bbb</text>
+ <feedback format="html"><text><![CDATA[<p>3</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>1</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>2</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>3</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer format="html"><text><![CDATA[<p>4</p>]]></text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>0</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer><text>1</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer><text>2</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer><text>3</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>4</text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p></P><P>Question text {1:MULTICHOICE_H:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_V:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_HS:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_VS:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_S:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:NUMERICAL:=1:1#1~3:1#3}</P><P>Question text {1:SHORTANSWER:=aaa#1~bbb#3}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics-moodle.ref
new file mode 100644
index 00000000000..5ffd8a49e15
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics-moodle.ref
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG width=81 SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABhSURB
+VCiR7dIxDkVgFEThj6jsxhp0Wlt6jY1o1NbBAlQKveLVNH8EIdFpTHKamzNTXSjxQ4sJS6BwynLD
+QUxQo0cXGJGe167yv1qMnzQ/8QUxQoV8d8vCwIB5LzfuP2hjBTnvHcSzvuJGAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABhSURB
+VCiR7dIxDkVgFEThj6jsxhp0Wlt6jY1o1NbBAlQKveLVNH8EIdFpTHKamzNTXSjxQ4sJS6BwynLD
+QUxQo0cXGJGe167yv1qMnzQ/8QUxQoV8d8vCwIB5LzfuP2hjBTnvHcSzvuJGAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz-moodle.ref
new file mode 100644
index 00000000000..48f544b384e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz-moodle.ref
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics with TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAqCAMAAAAwLX3tAAAANlBMVEUAAAD///8AAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADl82K3AAAAEXRSTlMAABNESlN1
+hImlq7XM2+b1/Z9TPi4AAABXSURBVEjH7dPJAYAwDAPBcIM5gvtvFqmExD/hKWB/W4awEnCBu2ci
+E9qJud8NUgkP00vUdi9IJR5gYqS+zWQSJzAxUSaiiQ2YWOnniQWYOKgtsYOZySQ+ag86ObK16lIA
+AAAASUVORK5CYII=
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOCAYAAAD9lDaoAAAAcUlEQVQokcWPMRWAMAxEf0FBLWCh
+FrpiAy1FE0gACa0EkABDj0eXlpGbknc/yaXn1QBMwKg+FR4OWIALOICoOsoDIAhyxaDXwMaHgja6
+rgGdT9GCBoF7DfA6FWqAJQeuhi4B+xNgZDpgruRMhvxqS+sNlq0d/BTebEoAAAAASUVORK5CYII=
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAjAQMAAABFDwNYAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAADdJREFUCNdj+P+/gYGB/QEEM/6A4n9Q/AOBoWr4gcJgDNTHj00vQwUqRjHjHxj/
+//8AgoFcJAwAXTsqcaGGnVkAAAAASUVORK5CYII=
+"></p>]]></text>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAbCAYAAACa9mScAAAAdklEQVQ4jWNkYGAIZoAAQyhmQKIl
+GRDAG0pvY0ADTOgC5AAWBgaGNdQwZBmUfYGBgeE8lA2jHzEwMHARMoRq3omm1BCquGTUkFFDRg0Z
+NWRQGcLIwMDQCWU7Y5E3RLLoDpT+iK6IhYGBQQnKNiZgoQouCap4BwCPsgqJWVTJ7gAAAABJRU5E
+rkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAM1BMVEUAAAD///8AAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADW5/q5AAAAEHRSTlMAABEiM0RVZneI
+maq7zN3uf6QJ9gAAAKhJREFUOMu90sESwiAMRVGkVEpb4P7/17pQKJhAZ1yYJe8MyUDM46bMX4Ap
+5dbFyCrAhgSkMAIu8a5oVbBmyOcJcGjAZQjWmOUAvAJiPQ6QJPBQhrMZngIkch3teeEKXNcXzm8Q
+oHmhKMEOzUEgixbb1gHUp/4NLDfA46fAA+sEeGCf3PDJh6DkI1DzAbhyHTS5CtpcBW0+AGH+F93e
+CmBjv9cCGNst7QvN2wpURq09lgAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAjAQMAAABFDwNYAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAADdJREFUCNdj+P+/gYGB/QEEM/6A4n9Q/AOBoWr4gcJgDNTHj00vQwUqRjHjHxj/
+//8AgoFcJAwAXTsqcaGGnVkAAAAASUVORK5CYII=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAMAAAANmfvwAAAA0lBMVEX///8AAAABAQECAgIDAwME
+BAQFBQUJCQkLCwsNDQ0dHR0hISEiIiIoKCguLi41NTVJSUlMTExmZmZubm5zc3N1dXWLi4uQkJCS
+kpKbm5ucnJydnZ2fn5+goKCioqKkpKSlpaWmpqapqamqqqqrq6utra2urq6xsbGzs7O1tbW2tra6
+urq8vLzLy8vMzMzT09Pd3d3h4eHk5OTl5eXm5ubn5+fp6enr6+vs7Ozt7e3w8PDz8/P09PT29vb3
+9/f5+fn6+vr7+/v8/Pz9/f3+/v7/////o5MGAAAAAXRSTlMAQObYZgAAAbNJREFUOMuF1NlS6kAQ
+BuB0SEBlUWQ1BlyIARRZ4yBLwqR7/vd/pXPh2SoE6Mupr6Zrpv5uyzouWJcK2F8W+/OGGdjjXC+w
+1ohxxhyw1lriFNCnxAHrtQinqdb59xgDwBhmBoBJjhA5HCACMPPX12QyyXktcGBRCh/calWrE6Js
+F8znGHNTqcoHter16jVlTGAa83l5TM1mpdKlWb3uXROR/78IqNEol9tEd3fdLmYzzyMi3//3rpsb
+Irq9bbfbn5/f3wDe3n7E3z8kqtVoOt1u2wBgDN7f/4jfZrcjqr1MjdkKRJLEBFnBu8WC3JfAGAiE
+ORkGGbFnLBYbtxQEAJAyj4ZZsQew2axKpX4fiNN0NMoI/NRqtbLt19c4jo+EZSUJRLReRZFtDwbx
+eHwkLCthATRHy6XrDppj26anjLAsBgDGUim32CzatvckyOYOADRipfwiFYueB5GjZIpojTj2fYfo
+/h6A1rm5x3DoOM7VVb+fn24AYVgoOJ2O6/af83OLMCQqPHaiyKXnE+kPHaLeo44iRSdnyHF6PWit
+1JlJfHgAgPN7wRgYc2ErGJjLuyXn7BfJsGNGBciJRQAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAdCAAAAABtMQhgAAABDUlEQVQYGW3Bu2pUURQA0LX3OXPN
+o7GykBRaKggprFSCkEqxERTyF2JnZ6ddWv2A4CcIgl+gFoLBxmIg2KkIFpnJzH2YUjiuFXNX/ePQ
+U6lVB3HNHWm2MOku+a326gMvFHpFnNqSWnXLOhUrMdOzidSqgxwshI3JKAOpVRfGwdoPpXOZwZKT
+E3GuFKUcHHw8O5um1Iq53SeuuOj7B0fKkUdSK04N2wYpV956GL6IXlnpnBulw2deSq06Kh2WNsLk
+7to7qVVnlh06Uxhs8kudzMKoWFfFz3BdatVQRkVP+OM1j6VWfe7eDRdU4zevvNmzK/1XsLOzvy+C
++8fHwxCffP1s7r29m267tW2SWn8B1wBQQBxcN+IAAAAASUVORK5CYII=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAABHAQMAAABCjOfmAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAAEVJREFUGNOd0LENwCAMBdHrMjaMlrEoLF0KysQGUr3qyzqj2uEToEXO5b0mCvJd
+flYHOfaMOmWjiPaPMnN+4o1qsGJwzgPXwLGKCxz0xgAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAA2BAMAAAC/7D1CAAAAMFBMVEUAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaPxwLAAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAABBUlEQVQ4y62SMUoDURRFbyKIQQKzAIvUIsQVmCZFUiiW6XQHugSTBTh2diKphICm
+sFMwrsAlKFhaJIiKRjPHYj7j//OETJFbHu7j3X/fF3lNtEh04+sWeFKgNUg2A1J6gOd5pqVHY9qy
+pjHcG9NPtBDTjjEtY0wHBU1Jbh0FXze3J93Be0hWgP0Q7cFnSEpjOA9RBWZhTDXgLSS6MnNloGYi
+fOfmqianGjCRqWqYQzGc2AxHMjUUQPG/aCTT1qvXlCTVYfpHziJJq37N24zc7T8cWYcvl4KuJKkN
+sJueGi6azc4lwDRyt86UHEqSNjzUd5vjjFxn9R+nYNbzntAawMtp+lV+Afb0PN8sFBDMAAAAAElF
+TkSuQmCC
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz_and_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz_and_svg-moodle.ref
new file mode 100644
index 00000000000..702aad03932
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_via_tikz_and_svg-moodle.ref
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics with TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDIuNSIg
+aGVpZ2h0PSIyNi41NiIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNDIuNSAyNi41NiIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxu
+czp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sgaWQ9ImEi
+IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNwYWNlT25V
+c2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXpl
+U3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2Uv
+cG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQW9BQUFBUUNBQUFBQUFLRkxHY0FB
+QUFBWE5DU1ZRSTVncGJtUUFBQUVCSlJFRlVDSmxqQ0c3Wit1ei9meThHQmdhRy8vLy8vNGN3V1pa
+ZE9ILytFUmNEREh6OTc4WEF3TUFFNTlPRHlkanB6TUJneUhUbkl3TUR3K3IvTUFBQUdhd2R4Rjl4
+QWJZQUFBQUFTVVZPUks1Q1lJST0iLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4
+KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDI2LjU2KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTUu
+OTM4LDkuOTYpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTUuOTM4LC05Ljk2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMzEuODc1KSI+PGcgdHJhbnNmb3JtPSJyb3RhdGUoOTApIj48ZyB0
+cmFuc2Zvcm09InNjYWxlKDIuNDkwMykiPjxnIHRyYW5zZm9ybT0ic2NhbGUoOCwxMi44KSI+PGlt
+YWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIxIiBoZWlnaHQ9IjEi
+IGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNhKSIgcHJlc2VydmVB
+c3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9S
+dzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFRQ0FZQUFBQXZmKzVBQUFBQUJITkNTVlFJQ0FnSWZB
+aGtpQUFBQUJwSlJFRlVLSkZqWkdCZytNOUFCR0FpUnRHb3dsR0ZsQ2tFQUxVaUFSOUNRa1gyQUFB
+QUFFbEZUa1N1UW1DQyIvPjwvZz48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNS42MzA3
+IiBoZWlnaHQ9IjguNjg5MyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNS42MzA3IDguNjg5
+MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDguNjg5MykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMTEyLDMuMjU5KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIuMTEyLC0zLjI1OSkiPjxnIHRyYW5zZm9ybT0ic2Nh
+bGUoLjUpIj48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEgMCAw
+IC0xIDAgMTMuMDM0KSI+PHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS44Nzg5MSAxMy4wMzQp
+IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iJ09wZW4gU2FucyciIGZvbnQtc2l6ZT0iMThw
+eCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9n
+PjwvZz48L3N2Zz4K
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTQuNjY3
+IiBoZWlnaHQ9IjIyLjY2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTQuNjY3IDIyLjY2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDIyLjY2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNSw4LjUp
+Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNS41LC04LjUpIj48ZyB0cmFuc2Zvcm09InNjYWxl
+KDExLDE3KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIx
+IiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNh
+KSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7
+YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFSQ0FZQUFBQUw0VmJiQUFBQUJI
+TkNTVlFJQ0FnSWZBaGtpQUFBQUZoSlJFRlVLSkhGa3NFT3dDQUlROXRsLy8vTDlUSXpneFh4NUxz
+UkNsU0VBSVFFNlU5VFl6UkFjaXA0U2gyL3dxWFlUU3FMSmEzRnp2UHJrbEhVU1czRUJwZFdkK1E1
+Y3ZUQTBwNTdUR3l1RGpDZmtvbTJOaHdOWDdFckdXNWlRWVVBQUFBQVNVVk9SSzVDWUlJPSIvPjwv
+Zz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuNjY3
+IiBoZWlnaHQ9IjE3LjA2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTAuNjY3IDE3LjA2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQW9BQUFBUUNBQUFBQUFL
+RkxHY0FBQUFBWE5DU1ZRSTVncGJtUUFBQUVCSlJFRlVDSmxqQ0c3Wit1ei9meThHQmdhRy8vLy8v
+NGN3V1paZE9ILytFUmNEREh6OTc4WEF3TUFFNTlPRHlkanB6TUJneUhUbkl3TUR3K3IvTUFBQUdh
+d2R4Rjl4QWJZQUFBQUFTVVZPUks1Q1lJST0iLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0i
+bWF0cml4KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDE3LjA2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNs
+YXRlKDQsNi40KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsLTYuNCkiPjxnIHRyYW5zZm9y
+bT0ic2NhbGUoOCwxMi44KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSki
+IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFz
+az0idXJsKCNhKSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTpp
+bWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFRQ0FZQUFBQXZm
+KzVBQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUJwSlJFRlVLSkZqWkdCZytNOUFCR0FpUnRHb3ds
+R0ZsQ2tFQUxVaUFSOUNRa1gyQUFBQUFFbEZUa1N1UW1DQyIvPjwvZz48L2c+PC9nPjwvZz48L3N2
+Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjAuMjUy
+IiBoZWlnaHQ9IjIwLjI1MiIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjAuMjUyIDIwLjI1
+MiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDIwLjI1MikiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNTk0LDcuNTk0KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuNTk0LC03LjU5NCkiPjxnIHRyYW5zZm9ybT0idHJh
+bnNsYXRlKDkuMjE2KSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLjcwNzA5IC43MDcwOSAtLjcwNzA5
+IC43MDcwOSAwIDApIj48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxnIHRyYW5zZm9ybT0ibWF0cml4
+KDEgMCAwIC0xIDAgMTMuMDM0KSI+PHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS44Nzg5MSAx
+My4wMzQpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iJ09wZW4gU2FucyciIGZvbnQtc2l6
+ZT0iMThweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48
+L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTQuNjY3
+IiBoZWlnaHQ9IjIyLjY2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTQuNjY3IDIyLjY2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDIyLjY2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNSw4LjUp
+Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNS41LC04LjUpIj48ZyB0cmFuc2Zvcm09InNjYWxl
+KDExLDE3KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIx
+IiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNh
+KSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7
+YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFSQ0FZQUFBQUw0VmJiQUFBQUJI
+TkNTVlFJQ0FnSWZBaGtpQUFBQUZoSlJFRlVLSkhGa3NFT3dDQUlROXRsLy8vTDlUSXpneFh4NUxz
+UkNsU0VBSVFFNlU5VFl6UkFjaXA0U2gyL3dxWFlUU3FMSmEzRnp2UHJrbEhVU1czRUJwZFdkK1E1
+Y3ZUQTBwNTdUR3l1RGpDZmtvbTJOaHdOWDdFckdXNWlRWVVBQUFBQVNVVk9SSzVDWUlJPSIvPjwv
+Zz48L2c+PC9nPjwvZz48L3N2Zz4K
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjEuNTk5
+IiBoZWlnaHQ9IjIxLjU5OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjEuNTk5IDIxLjU5
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGcgdHJhbnNmb3Jt
+PSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMjEuNTk5KSI+PGcgdHJhbnNmb3JtPSJ0cmFu
+c2xhdGUoOC4wOTksOC4wOTkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOC4wOTksLTEuMTU3
+KSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLjcwNzA5IC0uNzA3MDkgLjcwNzA5IC43MDcwOSAwIDAp
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDkuODE4MiAxMy4wOTEpIj48aW1hZ2UgdHJhbnNmb3JtPSJt
+YXRyaXgoMSwwLDAsLTEsMCwxKSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgaW1hZ2UtcmVuZGVyaW5n
+PSJvcHRpbWl6ZVNwZWVkIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB4bGluazpocmVmPSJk
+YXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQVFDQVlB
+QUFBaVlaNEhBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBZEJKUkVGVUtKRmxrcnRLTTNFVXhILy8y
+OHF5eENMWjJrcXdDVlkrVFhyQklwV1BZY2oxQmZJRXRqYm1CYngwNlZJb2dnWWpTQW9OdSt5Nk94
+YVN3UGRsMm5QbXpEQnprS1R2NzI5dFVSU0ZKR2sybXdrUW9PbDB1cHRiZ0NSSnlMS01uNThmUWdp
+OHY3L1Q3WFpwTkJyOEQxdFZGV1ZaY25Cd2dER0dxcW9ZREFZY0h4OHpIQTczQ040NXgzcTlwdFZx
+WWEzbDl2YVdYcS9IZkQ1bnNWanNLeFJGUVpxbVNPTGo0NE9MaXdzbWt3bnRkcHM0anZjSklRU0tv
+a0FTVjFkWG5KeWMwT2wwa01SbXM5bTNKSWtvaXJpNXVhSGY3L1B3OEVDcjFTTFBjNklvMmxldzF2
+TDA5RVMzMjZYWDYzRjJka1pkMTRRUXNOYnVFeVF4SG85SjA1VHo4M1BxdXNaYWk2VGRVZ2lCdXE0
+cHl4Si9mWDNOWkRMaDhmR1J3OE5EakRFQWxHV0p0UlpqREhtZVk2M0ZXb3Uvdkx6azlQU1V4V0xC
+OC9NeldaYnRPcm03dThON3ovMzlQVkVVNFp5RGJmM2VlOFZ4TEdPTWpESHkzaXVFSUVCSmtzaDcv
+L2NxWDE5ZmVubDUwZWZucDk3ZTNyUmNMdlg2K3FyVmFxWHBkQ3JubkVhamtaYkxwVmFybFh3Y3h4
+d2RIZjNqMnpsSGxtVTBtMDBrMFdnMFNOUDBMN2s4endGMlVUcm5LTXVTT0k2cHFvcTZybkhPRVVK
+QUVqWkpFdkk4MzhXNGpYV0w3UUZKR0dQNEJhTGhDSGFvckgxYkFBQUFBRWxGVGtTdVFtQ0MiLz48
+L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIiIGhl
+aWdodD0iMTguNTQ1IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAxMiAxOC41NDUiIHhtbDpz
+cGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6
+eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIHRyYW5zZm9ybT0ibWF0cml4
+KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDE4LjU0NSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQu
+NSw2Ljk1NSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjUsLTYuOTU1KSI+PGcgdHJhbnNm
+b3JtPSJzY2FsZSg5IDEzLjkwOSkiPjxpbWFnZSB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSww
+LDEpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQi
+IHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jh
+c2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBWUFBQUFMNFZiYkFBQUFCSE5D
+U1ZRSUNBZ0lmQWhraUFBQUFkMUpSRUZVS0pGOWtMMUtiRXNVaEwvVmJXOVFFeU1ETVREVnlNQkla
+Ukl4TVRZUVgwSk1ESDBDOVNrbUYzTnp3Ujh3R0VSTU5vcVppb2cvZTJaNjk2b1RITGJjZTROYlVN
+bWlhbFZSMUhVdDRIOTVjbklpU1pvb3BXQm1MQzR1c3I2K1RnaUJsQkpOMHlDSnFxcVluWjNsL2Yw
+ZDd1L3ZsVkxTd2NHQjJyWlZoNXl6M0YyUzlQMzkvZmZ6MU5RVU9XZENDTVFZR1kvSG1Ca3BKZHEy
+QldCeWNoS0FVRW9oaEVBcGhhWnBjSGRTU2tqQzNRRXdNd0FtT2tFcGhad3pMeTh2eEJpcHFvcTV1
+VGtBU2lrTWgwTjRlbm9TSURPVG1TbkdLRUF4UnUzczdPanE2a3FqMFVpU1pIVmRhM2w1bWIyOVBS
+WVdGcGlabWVINStabkx5MHY2L1Q0eFJ2cjlQdHZiMi9Eejg2UFB6MCs1dTNMT0txVklra2Fqa1U1
+UFQzOVRCNE9CNk9icW9qcDBwdVBqWTZXVWRIUjBKTWJqOGI5RVRkTklrdHhkN3E2Ym14c0IydHpj
+VkVncE1Sd09jWGZjbmFxcWtJU1o0ZTYvRzcrOXZSRWtrVkxDekpCRUNJRzJiWkZFakpIWDExZk1q
+S1dsSmZodng1eXp1bW9mSHgvYTNkMlZtZW5zN0V3Y0hoN3E0dUpDWDE5Znlqbi9HaDhlSHJTL3Z5
+OUF2VjVQajQrUG9wc0cwUHo4dkRZMk52VFAyOWJXbGdhRGdVb3BzdXZyYTkzZDNYRjdlMHRkMTV5
+Zm45UHI5VmhaV1dGdGJZM1YxVldtcDZlUnhCLytqcHNTZnA2TFB3QUFBQUJKUlU1RXJrSmdnZz09
+Ii8+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjkuMzMz
+IiBoZWlnaHQ9IjQ1LjMzMyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjkuMzMzIDQ1LjMz
+MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDQ1LjMzMykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLDE3KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExLC0xNykiPjxnIHRyYW5zZm9ybT0ic2NhbGUoMiki
+PjxnIHRyYW5zZm9ybT0ic2NhbGUoMTEsMTcpIj48aW1hZ2UgdHJhbnNmb3JtPSJtYXRyaXgoMSww
+LDAsLTEsMCwxKSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6
+ZVNwZWVkIiBtYXNrPSJ1cmwoI2EpIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB4bGluazpo
+cmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFzQUFB
+QVJDQVlBQUFBTDRWYmJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBRmhKUkVGVUtKSEZrc0VPd0NB
+SVE5dGwvLy9MOVRJemd4WHg1THNSQ2xTRUFJUUU2VTlUWXpSQWNpcDRTaDIvd3FYWVRTcUxKYTNG
+enZQcmtsSFVTVzNFQnBkV2QrUTVjdlRBMHA1N1RHeXVEakNma29tMk5od05YN0VyR1c1aVFZVUFB
+QUFBU1VWT1JLNUNZSUk9Ii8+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjIuNTIz
+IiBoZWlnaHQ9IjM0Ljc1NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjIuNTIzIDM0Ljc1
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDM0Ljc1NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguNDQ2LDEzLjAzNCki
+PjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04LjQ0NiwxMy4wMzQpIj48ZyB0cmFuc2Zvcm09Im1h
+dHJpeCgyLDAsMCwyLDE2Ljg5MiwwKSI+PGcgdHJhbnNmb3JtPSJzY2FsZSgtMSkiPjxnIGNsaXAt
+cGF0aD0idXJsKCNhKSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAxMy4wMzQpIj48
+dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjg3ODkxIDEzLjAzNCkiIGZpbGw9IiMwMDAwMDAi
+IGZvbnQtZmFtaWx5PSInT3BlbiBTYW5zJyIgZm9udC1zaXplPSIxOHB4Ij48dHNwYW4geD0iMCIg
+eT0iMCI+MjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_with_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_with_svg-moodle.ref
new file mode 100644
index 00000000000..5dababd8200
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_includegraphics_with_svg-moodle.ref
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Scalable Vector Graphics</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEi
+IHZpZXdCb3g9IjAgMCAzMjcgMTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmci
+Pgo8ZyBmaWxsPSIjZjk4MDEyIj4KPHBhdGggZD0ibTcyLjQgNzcuNDV2LTI3LjA3YzAtNS42NS0y
+LjM1LTguNS03LTguNS00LjY3NCAwLTcuMDI0IDIuODI2LTcuMDI0IDguNXYyNy4wN2gtMTMuNzd2
+LTI3LjA3YzAtNS42NS0yLjMwMS04LjUtNi44OTktOC41LTQuNjc2IDAtNyAyLjgyNi03IDguNXYy
+Ny4wN2gtMTMuNzh2LTI4LjY4YzAtNS45IDIuMDUxLTEwLjM3IDYuMTUxLTEzLjQgMy41OTktMi43
+MDEgOC41LTQuMDc2IDE0LjY1LTQuMDc2IDYuMjI1IDAgMTAuODIgMS42IDEzLjc3IDQuODAxIDIu
+NTQ5LTMuMjAxIDcuMTc0LTQuODAxIDEzLjktNC44MDEgNi4xNSAwIDExLjAyIDEuMzUgMTQuNjIg
+NC4wNzYgNC4xIDMuMDI1IDYuMTUgNy41IDYuMTUgMTMuNHYyOC42OHoiLz4KPHBhdGggZD0ibTEz
+Ni4xIDIyLjc1LTMuMDk0LTIuMTE3LTcuNDkyIDEyLjA1Yy01LjM3NS0xLjc5Mi0xMC41OS0xLjc5
+Mi0xMS41Ni0xLjc5Mi0xNy4xIDAtMjYuNTUgMTAuNTktMjYuNTUgMjQuNDMgMCA2LjM1MSAyLjQ0
+MyAxNC45OCAxMS43MyAxOS44N2wtNy4zMjggMTEuODkgMy4wOTUgMS45NTQgNy42NTMtMTIuMjFj
+NS4yMTIgMS43OTIgMTAuMSAxLjc5MiAxMS40IDEuNzkyIDE3LjQzIDAgMjYuNTUtMTAuNTkgMjYu
+NTUtMjMuMjkgMC03Ljk4LTMuNDIxLTE2LjQ1LTExLjczLTIwLjg1em0tMzMuNzEgNDcuMjNjLTMu
+MDk1LTMuNzQ2LTMuMDk1LTkuNjA5LTMuMDk1LTE0LjgyIDAtNy44MTcgMC0yMC41MiAxNC42Ni0y
+MC41MiAzLjA5NSAwIDYuMTg5IDAuNjUxIDguNzk0IDIuNDQzem0yMy4xMy0zMC4yOWMyLjkzMiA0
+LjA3MiAzLjA5NSA5Ljc3MiAzLjA5NSAxNS40NyAwIDcuODE2IDAgMTkuNzEtMTQuNjYgMTkuNzEt
+MS4zMDIgMC01LjIxMSAwLTguNjMxLTIuMjh6Ii8+CjxwYXRoIGQ9Im0xNjUuNiA3OC41NWMtNi45
+NzUgMC0xMi43NS0yLjIyNC0xNy4zLTYuNjUtNC41NTEtNC40MjQtNi44MjYtMTAuMTItNi44MjYt
+MTcuMTIgMC02Ljk3NSAyLjI3NS0xMi42NyA2LjgyNi0xNy4xIDQuNTQ5LTQuNDI0IDEwLjMyLTYu
+NjUgMTcuMy02LjY1czEyLjc3IDIuMjI1IDE3LjM1IDYuNjVjNC42IDQuNDI2IDYuODk5IDEwLjE1
+IDYuODk5IDE3LjEgMCA2Ljk3NS0yLjI5OSAxMi42OC02Ljg5OSAxNy4xMi00LjYgNC40MjYtMTAu
+MzcgNi42NS0xNy4zNSA2LjY1em0wLTM2LjQ1Yy0zLjMyNCAwLTUuODc1IDEuMjUtNy42NzQgMy43
+NzUtMS43NzUgMi41MjUtMi42NzYgNS41LTIuNjc2IDguOTc1IDAgMy40NzUgMC44MjU2IDYuNCAy
+LjUgOC43NzQgMS45MDEgMi43MjUgNC41MjYgNC4wNzYgNy44NSA0LjA3NiAzLjMyNiAwIDUuOTI2
+LTEuMzUgNy44NS00LjA3NiAxLjc1LTIuNCAyLjYyNS01LjMyNiAyLjYyNS04Ljc3NCAwLTMuNDc1
+LTAuODI1Ni02LjQtMi41LTguNzc0LTEuOTI0LTIuNjUxLTQuNTc2LTMuOTc1LTcuOTc1LTMuOTc1
+eiIvPgo8cGF0aCBkPSJtMjI3LjIgNzcuMzJ2LTQuNTUxYy0xLjIyNSAxLjY1LTMuMzI2IDIuOTUx
+LTYuMjc2IDMuOTUxLTIuNjI1IDAuODk5Ni01LjEyNSAxLjM1LTcuNSAxLjM1LTYuNTc0IDAtMTEu
+ODUtMi4yNS0xNS44Mi02Ljc3Ni0zLjk3NS00LjUtNS45NzUtMTAuMS01Ljk3NS0xNi43NSAwLTYu
+NTc0IDEuOTUxLTEyLjA3IDUuODUtMTYuNSAzLjQ0OS0zLjkyNCA5LjEtNi42NSAxNS41Ny02LjY1
+IDcuMzAxIDAgMTEuNTggMi43NSAxNC4xNSA1Ljl2LTM3LjNoMTMuNDJ2NzcuMzJ6bTAtMjUuNzVj
+MC0yLjQ1MS0xLjE3Ni00LjgyNi0zLjUtNy4wNzUtMi4zMjYtMi4yNS00Ljc1LTMuMzc1LTcuMi0z
+LjM3NS0zLjUyNSAwLTYuMzI2IDEuNDUxLTguMzc1IDQuMjk5LTEuNzk5IDIuNTUxLTIuNzAxIDUu
+Njc2LTIuNzAxIDkuMzUgMCAzLjYyNSAwLjkwMTMgNi43IDIuNzAxIDkuMjI1IDIuMDQ5IDIuOTUx
+IDQuODUgNC40MjQgOC4zNzUgNC40MjQgMi4xMjUgMCA0LjQ1MS0xIDYuOTUtMy4wMjUgMi41LTIg
+My43NS00LjA3NCAzLjc1LTYuMjI1eiIvPgo8cGF0aCBkPSJtMjQ0LjggMGgxMy44djc3LjMyaC0x
+My44eiIvPgo8cGF0aCBkPSJtMzI3IDczLjgzaC0yLjc3NGMtMi43NzIgMTUuNTctNS4zMjQgMjMt
+MjQuMjkgMjNoLTE0LjY0Yy01LjIxMiAwLTUuNDM1LTAuNzEyLTUuNDM1LTQuMDd2LTI3LjA3aDku
+ODcyYzEwLjc2IDAgMTEuOTggMy4yNTcgMTEuOTggMTEuOTFoMi43NzN2LTI2Ljg3aC0yLjc3M2Mw
+IDguNjQ5LTEuMjIgMTEuOC0xMS45OCAxMS44aC05Ljg3MnYtMjQuMzJjMC0zLjM1OCAwLjIyMjct
+NC4wNzIgNS40MzUtNC4wNzJoMTQuMmMxNi45NyAwIDE5Ljg1IDUuNTk4IDIxLjYzIDE5Ljc0aDIu
+NzczbC0zLjEwNS0yMi44aC02Mi4xMXYzLjA1M2gyLjU1MmM4LjUzOSAwIDguNzYyIDEuMTIgOC43
+NjIgNC43ODN2NTMuMTJjMCAzLjY2My0wLjIyMTYgNC43ODItOC43NjIgNC43ODJoLTIuNTUydjMu
+MTU1aDYzLjY3bDQuNjU5LTI2LjE1eiIvPgo8L2c+CjxwYXRoIGQ9Im00My42NyAyOS4yMiAxMy42
+OC0xMC0wLjE3Ni0wLjYwMDNjLTI0LjY3IDMuMDI1LTM1LjkgNS4xNzQtNTcuMTcgMTcuNWwwLjIw
+MDcgMC41NDkzIDEuNjk5IDAuMDI2M2MtMC4xNDk3IDEuNjk5LTAuNDI0MyA1LjktMC4wNzQgMTIu
+MjUtMi4zNSA2LjgyNC0wLjA1MSAxMS40NyAyLjA5OSAxNi41MiAwLjM1MDMtNS4yNSAwLjMwMS0x
+MS0xLjI5OS0xNi43Mi0wLjMyNTctNi4yNzUtMC4wNDkzLTEwLjQyIDAuMTAwMy0xMi4wMmwxNC4x
+IDAuMTI1cy0wLjEwMDMgNC4yNSAwLjQyNDMgOC4yNzRjMTIuNiA0LjQyNCAyNS4yNy0wLjAyNDcg
+MzItMTAuOTItMS45LTIuMTI1LTUuNTc2LTQuOTc1LTUuNTc2LTQuOTc1eiIgZmlsbD0iIzMzMyIv
+Pgo8L3N2Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG width=81 SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEi
+IHZpZXdCb3g9IjAgMCAzMjcgMTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmci
+Pgo8ZyBmaWxsPSIjZjk4MDEyIj4KPHBhdGggZD0ibTcyLjQgNzcuNDV2LTI3LjA3YzAtNS42NS0y
+LjM1LTguNS03LTguNS00LjY3NCAwLTcuMDI0IDIuODI2LTcuMDI0IDguNXYyNy4wN2gtMTMuNzd2
+LTI3LjA3YzAtNS42NS0yLjMwMS04LjUtNi44OTktOC41LTQuNjc2IDAtNyAyLjgyNi03IDguNXYy
+Ny4wN2gtMTMuNzh2LTI4LjY4YzAtNS45IDIuMDUxLTEwLjM3IDYuMTUxLTEzLjQgMy41OTktMi43
+MDEgOC41LTQuMDc2IDE0LjY1LTQuMDc2IDYuMjI1IDAgMTAuODIgMS42IDEzLjc3IDQuODAxIDIu
+NTQ5LTMuMjAxIDcuMTc0LTQuODAxIDEzLjktNC44MDEgNi4xNSAwIDExLjAyIDEuMzUgMTQuNjIg
+NC4wNzYgNC4xIDMuMDI1IDYuMTUgNy41IDYuMTUgMTMuNHYyOC42OHoiLz4KPHBhdGggZD0ibTEz
+Ni4xIDIyLjc1LTMuMDk0LTIuMTE3LTcuNDkyIDEyLjA1Yy01LjM3NS0xLjc5Mi0xMC41OS0xLjc5
+Mi0xMS41Ni0xLjc5Mi0xNy4xIDAtMjYuNTUgMTAuNTktMjYuNTUgMjQuNDMgMCA2LjM1MSAyLjQ0
+MyAxNC45OCAxMS43MyAxOS44N2wtNy4zMjggMTEuODkgMy4wOTUgMS45NTQgNy42NTMtMTIuMjFj
+NS4yMTIgMS43OTIgMTAuMSAxLjc5MiAxMS40IDEuNzkyIDE3LjQzIDAgMjYuNTUtMTAuNTkgMjYu
+NTUtMjMuMjkgMC03Ljk4LTMuNDIxLTE2LjQ1LTExLjczLTIwLjg1em0tMzMuNzEgNDcuMjNjLTMu
+MDk1LTMuNzQ2LTMuMDk1LTkuNjA5LTMuMDk1LTE0LjgyIDAtNy44MTcgMC0yMC41MiAxNC42Ni0y
+MC41MiAzLjA5NSAwIDYuMTg5IDAuNjUxIDguNzk0IDIuNDQzem0yMy4xMy0zMC4yOWMyLjkzMiA0
+LjA3MiAzLjA5NSA5Ljc3MiAzLjA5NSAxNS40NyAwIDcuODE2IDAgMTkuNzEtMTQuNjYgMTkuNzEt
+MS4zMDIgMC01LjIxMSAwLTguNjMxLTIuMjh6Ii8+CjxwYXRoIGQ9Im0xNjUuNiA3OC41NWMtNi45
+NzUgMC0xMi43NS0yLjIyNC0xNy4zLTYuNjUtNC41NTEtNC40MjQtNi44MjYtMTAuMTItNi44MjYt
+MTcuMTIgMC02Ljk3NSAyLjI3NS0xMi42NyA2LjgyNi0xNy4xIDQuNTQ5LTQuNDI0IDEwLjMyLTYu
+NjUgMTcuMy02LjY1czEyLjc3IDIuMjI1IDE3LjM1IDYuNjVjNC42IDQuNDI2IDYuODk5IDEwLjE1
+IDYuODk5IDE3LjEgMCA2Ljk3NS0yLjI5OSAxMi42OC02Ljg5OSAxNy4xMi00LjYgNC40MjYtMTAu
+MzcgNi42NS0xNy4zNSA2LjY1em0wLTM2LjQ1Yy0zLjMyNCAwLTUuODc1IDEuMjUtNy42NzQgMy43
+NzUtMS43NzUgMi41MjUtMi42NzYgNS41LTIuNjc2IDguOTc1IDAgMy40NzUgMC44MjU2IDYuNCAy
+LjUgOC43NzQgMS45MDEgMi43MjUgNC41MjYgNC4wNzYgNy44NSA0LjA3NiAzLjMyNiAwIDUuOTI2
+LTEuMzUgNy44NS00LjA3NiAxLjc1LTIuNCAyLjYyNS01LjMyNiAyLjYyNS04Ljc3NCAwLTMuNDc1
+LTAuODI1Ni02LjQtMi41LTguNzc0LTEuOTI0LTIuNjUxLTQuNTc2LTMuOTc1LTcuOTc1LTMuOTc1
+eiIvPgo8cGF0aCBkPSJtMjI3LjIgNzcuMzJ2LTQuNTUxYy0xLjIyNSAxLjY1LTMuMzI2IDIuOTUx
+LTYuMjc2IDMuOTUxLTIuNjI1IDAuODk5Ni01LjEyNSAxLjM1LTcuNSAxLjM1LTYuNTc0IDAtMTEu
+ODUtMi4yNS0xNS44Mi02Ljc3Ni0zLjk3NS00LjUtNS45NzUtMTAuMS01Ljk3NS0xNi43NSAwLTYu
+NTc0IDEuOTUxLTEyLjA3IDUuODUtMTYuNSAzLjQ0OS0zLjkyNCA5LjEtNi42NSAxNS41Ny02LjY1
+IDcuMzAxIDAgMTEuNTggMi43NSAxNC4xNSA1Ljl2LTM3LjNoMTMuNDJ2NzcuMzJ6bTAtMjUuNzVj
+MC0yLjQ1MS0xLjE3Ni00LjgyNi0zLjUtNy4wNzUtMi4zMjYtMi4yNS00Ljc1LTMuMzc1LTcuMi0z
+LjM3NS0zLjUyNSAwLTYuMzI2IDEuNDUxLTguMzc1IDQuMjk5LTEuNzk5IDIuNTUxLTIuNzAxIDUu
+Njc2LTIuNzAxIDkuMzUgMCAzLjYyNSAwLjkwMTMgNi43IDIuNzAxIDkuMjI1IDIuMDQ5IDIuOTUx
+IDQuODUgNC40MjQgOC4zNzUgNC40MjQgMi4xMjUgMCA0LjQ1MS0xIDYuOTUtMy4wMjUgMi41LTIg
+My43NS00LjA3NCAzLjc1LTYuMjI1eiIvPgo8cGF0aCBkPSJtMjQ0LjggMGgxMy44djc3LjMyaC0x
+My44eiIvPgo8cGF0aCBkPSJtMzI3IDczLjgzaC0yLjc3NGMtMi43NzIgMTUuNTctNS4zMjQgMjMt
+MjQuMjkgMjNoLTE0LjY0Yy01LjIxMiAwLTUuNDM1LTAuNzEyLTUuNDM1LTQuMDd2LTI3LjA3aDku
+ODcyYzEwLjc2IDAgMTEuOTggMy4yNTcgMTEuOTggMTEuOTFoMi43NzN2LTI2Ljg3aC0yLjc3M2Mw
+IDguNjQ5LTEuMjIgMTEuOC0xMS45OCAxMS44aC05Ljg3MnYtMjQuMzJjMC0zLjM1OCAwLjIyMjct
+NC4wNzIgNS40MzUtNC4wNzJoMTQuMmMxNi45NyAwIDE5Ljg1IDUuNTk4IDIxLjYzIDE5Ljc0aDIu
+NzczbC0zLjEwNS0yMi44aC02Mi4xMXYzLjA1M2gyLjU1MmM4LjUzOSAwIDguNzYyIDEuMTIgOC43
+NjIgNC43ODN2NTMuMTJjMCAzLjY2My0wLjIyMTYgNC43ODItOC43NjIgNC43ODJoLTIuNTUydjMu
+MTU1aDYzLjY3bDQuNjU5LTI2LjE1eiIvPgo8L2c+CjxwYXRoIGQ9Im00My42NyAyOS4yMiAxMy42
+OC0xMC0wLjE3Ni0wLjYwMDNjLTI0LjY3IDMuMDI1LTM1LjkgNS4xNzQtNTcuMTcgMTcuNWwwLjIw
+MDcgMC41NDkzIDEuNjk5IDAuMDI2M2MtMC4xNDk3IDEuNjk5LTAuNDI0MyA1LjktMC4wNzQgMTIu
+MjUtMi4zNSA2LjgyNC0wLjA1MSAxMS40NyAyLjA5OSAxNi41MiAwLjM1MDMtNS4yNSAwLjMwMS0x
+MS0xLjI5OS0xNi43Mi0wLjMyNTctNi4yNzUtMC4wNDkzLTEwLjQyIDAuMTAwMy0xMi4wMmwxNC4x
+IDAuMTI1cy0wLjEwMDMgNC4yNSAwLjQyNDMgOC4yNzRjMTIuNiA0LjQyNCAyNS4yNy0wLjAyNDcg
+MzItMTAuOTItMS45LTIuMTI1LTUuNTc2LTQuOTc1LTUuNTc2LTQuOTc1eiIgZmlsbD0iIzMzMyIv
+Pgo8L3N2Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG width=28 SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_macros-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_macros-moodle.ref
new file mode 100644
index 00000000000..a67df4abbc7
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_macros-moodle.ref
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Macros</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Macros]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>The following commands should not be placed in items: <BR/> and </P><P>Find the \(\rm\LaTeX\) logo </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\rm\TeX\) and \(\rm\LaTeX\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(tilde)&nbsp;and #</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>$ and &</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>& and &sect;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>{ and }</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(space) and (relax)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(space)&#8239;and&#8239;(thinspace)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&hellip; and &hellip;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&euro; and &euro;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\rm\TeX\) and \(\rm\LaTeX\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&#95; and &#92;</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_matching-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_matching-moodle.ref
new file mode 100644
index 00000000000..f54c800daeb
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_matching-moodle.ref
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Matching</text>
+ </category>
+</question>
+
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>1</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>2</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>3</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer format="html"><text><![CDATA[<p>4</p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>0</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer><text>1</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer><text>2</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer><text>3</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>4</text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_mathenv-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_mathenv-moodle.ref
new file mode 100644
index 00000000000..0f2fc15de0d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_mathenv-moodle.ref
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\(\begin {array}{c}$1\\2\end {array}\) </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\($\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\[$\sqrt {25}\]</p>]]></text></feedback>
+ </answer>
+ <answer fraction="10" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\(\begin {array}{c}$1\\2\end {array}\) {1:MULTICHOICE_VS:=\($\sqrt {25\}\)~6~=7#\[$\sqrt {25\}\]~%10%8}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_minted-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_minted-moodle.ref
new file mode 100644
index 00000000000..d10218899bc
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_minted-moodle.ref
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Minted</text>
+ </category>
+</question>
+
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[LaTeX Classes]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>In the following \(\rm\LaTeX\) code excerpt, on which line is the class loaded? <PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><span style="color: #177500">% !TEX TS-program = xelatex</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><span style="color: #A90D91">\documentclass{</span>article<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><span style="color: #A90D91">\usepackage</span><span style="color: #836C28">[nostamp]</span><span style="color: #A90D91">{</span>moodle<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #A90D91">\newif\iffvextra</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span><span style="color: #A90D91">\fvextratrue</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><span style="color: #A90D91">\ifxetex</span> <span style="color: #177500">% FOR XELATEX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/></CODE></PRE> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>4</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>yes! <PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><span style="color: #177500">% !TEX TS-program = xelatex</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><mark><span style="color: #A90D91">\documentclass{</span>article<span style="color: #A90D91">}</span></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><span style="color: #A90D91">\usepackage</span><span style="color: #836C28">[nostamp]</span><span style="color: #A90D91">{</span>moodle<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #A90D91">\newif\iffvextra</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span><span style="color: #A90D91">\fvextratrue</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><span style="color: #A90D91">\ifxetex</span> <span style="color: #177500">% FOR XELATEX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/></CODE></PRE></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>No. On line 3, there is only a comment.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>No. On line 5, the package <CODE>moodle</CODE> is loaded.</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Languages]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the code written in the Python language. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark><span style="color: #A90D91">if</span> <span style="color: #000000">n</span> <span style="color: #000000">&lt;</span> <span style="color: #1C01CE">0</span>:</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span> <span style="color: #A90D91">raise</span> <span style="color: #000000">ValueError</span>(<span style="color: #C41A16">&#39;non negative integer expected&#39;</span>)<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark><span style="color: #000000">fact</span> <span style="color: #000000">=</span> <span style="color: #1C01CE">1</span></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark><span style="color: #A90D91">for</span> <span style="color: #000000">i</span> <span style="color: #000000">in</span> <span style="color: #A90D91">range</span>(<span style="color: #1C01CE">2</span>, <span style="color: #000000">n</span> <span style="color: #000000">+</span> <span style="color: #1C01CE">1</span>):</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span> <span style="color: #000000">fact</span> <span style="color: #000000">*=</span> <span style="color: #000000">i</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Indeed, this is Python code.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="color: #888888">#!/usr/bin/XXXX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">1</span><BR/><mark><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">strict</span>;</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">warnings</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><mark><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">IO::Handle</span>;</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><mark><span style="color: #008800; font-weight: bold">my</span> ( <span style="color: #996633">$remaining</span>, <span style="color: #996633">$tot</span> );</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #996633">$remaining</span> <span style="color: #333333">=</span> <span style="color: #996633">$tot</span> <span style="color: #333333">=</span> <span style="color: #007020">shift</span>(<span style="color: #996633">@ARGV</span>);<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #007020">STDOUT</span><span style="color: #333333">-&gt;</span>autoflush(<span style="color: #0000DD; font-weight: bold">1</span>);<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #008800; font-weight: bold">while</span> ( <span style="color: #996633">$remaining</span> ) {<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">8</span><BR/> <span style="color: #007020">printf</span> ( <span style="background-color: #fff0f0">&quot;Remaining %s/%s \r&quot;</span>, <span style="color: #996633">$remaining</span><span style="color: #333333">--</span>, <span style="color: #996633">$tot</span> );<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">9</span><BR/> <span style="color: #007020">sleep</span> <span style="color: #0000DD; font-weight: bold">1</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">10</span><BR/>}<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">11</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #008800; font-weight: bold">print</span> <span style="background-color: #fff0f0">&quot;\n&quot;</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">12</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. This is Perl code.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">1</span><span style="color: #204a87; font-weight: bold">long</span> <span style="color: #000000">some_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark><span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">other_function</span><span style="color: #000000; font-weight: bold">();</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark><span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">calling_function</span><span style="color: #000000; font-weight: bold">()</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #000000; font-weight: bold">{</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span> <span style="color: #204a87; font-weight: bold">long</span> <span style="color: #000000">test1</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><mark> <span style="color: #204a87; font-weight: bold">register</span> <span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">test2</span><span style="color: #000000; font-weight: bold">;</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">8</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">9</span> <span style="color: #000000">test1</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #000000">some_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">10</span> <span style="color: #204a87; font-weight: bold">if</span> <span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">test1</span> <span style="color: #ce5c00; font-weight: bold">&gt;</span> <span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">)</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">11</span> <span style="color: #000000">test2</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">12</span> <span style="color: #204a87; font-weight: bold">else</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">13</span> <span style="color: #000000">test2</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #000000">other_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">14</span> <span style="color: #204a87; font-weight: bold">return</span> <span style="color: #000000">test2</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">15</span><span style="color: #000000; font-weight: bold">}</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. This is C code.</p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multi-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multi-moodle.ref
new file mode 100644
index 00000000000..78238875885
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multi-moodle.ref
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="70" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-10" format="html">
+ <text><![CDATA[<p><B>68</B></p>]]></text>
+ </answer>
+ <answer fraction="30" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-70" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+ <answer fraction="-20" format="html">
+ <text><![CDATA[<p><CODE>nothing</CODE></p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-30" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="-30" format="html">
+ <text><![CDATA[<p>9</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-70" format="html">
+ <text><![CDATA[<p><OL><LI>False</LI><LI>Wrong</LI></OL></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multiple_categories-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multiple_categories-moodle.ref
new file mode 100644
index 00000000000..4df2ca1968f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_multiple_categories-moodle.ref
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Category 1</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Q1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text 1 </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Category 2</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Q2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text 2 </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_penalty-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_penalty-moodle.ref
new file mode 100644
index 00000000000..9d6712c5497
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_penalty-moodle.ref
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>abc: def </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc: def</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>abc: def</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_point_points-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_point_points-moodle.ref
new file mode 100644
index 00000000000..3306aaa56bb
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_point_points-moodle.ref
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Ifnum</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>.5</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>3.2</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_special_characters-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_special_characters-moodle.ref
new file mode 100644
index 00000000000..71ad7010c69
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_special_characters-moodle.ref
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Diacritical marks and ligatures</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Å À Â Ã É È Ë Ê Î Ï Ñ Õ Ô Ö Ù Ü Û Ç ]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>å à â ã é è ë ê î ï ñ õ ô ö ù ü û ç <BR/> Å À Â Ã É È Ë Ê Î Ï Ñ Õ Ô Ö Ù Ü Û Ç <BR/> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>å à â ã é è ë ê î ï ñ õ ô ö ù ü û ç </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Å À Â Ã É È Ë Ê Î Ï Ñ Õ Ô Ö Ù Ü Û Ç </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>Å À Â Ã É È Ë Ê Î Ï Ñ Õ Ô Ö Ù Ü Û Ç </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>å à â ã é è ë ê î ï ñ õ ô ö ù ü û ç </p>]]></text></feedback>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; ]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; <BR/> &Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; <BR/> &oelig; &aelig; &szlig; &OElig; &AElig; &#7838; &Oslash; &Lstrok; &laquo;&#8239; &oslash; &lstrok; &#8239;&raquo; &iquest; &iexcl; </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; </p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tags-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tags-moodle.ref
new file mode 100644
index 00000000000..6e42286d332
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tags-moodle.ref
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Moodle Tags</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tic</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tac</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[multiéàî]]></text></tag>
+ </tags>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>B</text>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>C</text>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[quizz-level]]></text></tag>
+ </tags>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>2</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <answer><text>oui</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <answer><text>non</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>Å</text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[m&aring;tch&iuml;ng]]></text></tag>
+ </tags>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>&aelig;yo </li>
+ <li>&oelig;</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+ <tags>
+ <tag><text><![CDATA[essay]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;&OElig;{1:MULTICHOICE:=chip~%10%chop#yes~chap#no.}&#8239;&raquo;&Aring;{1:SHORTANSWER:=B#toc~=C#&laquo;&#8239;&#8239;&raquo;~*}&laquo;&#8239;&Aring;{1:NUMERICAL:=1:0~=2:0#&laquo;&#8239;&#8239;&raquo;~3:0}&OElig;{1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>&OElig;{1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[cloze]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz-moodle.ref
new file mode 100644
index 00000000000..bd76f582f93
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz-moodle.ref
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvM3Uwh
+kGcAAABYSURBVAjXY2DABBIdkxgYmCYy9AUwcDxlkDvAwP6Mge8CSMavAUSuEWBgYOleAGIyrRYA
+UUA1QMD9lIHnIgP3Cwa+RyA2twGD3gYGxmUup4FqmMsNsNgEAJkrErcirjVRAAAAAElFTkSuQmCC
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAESIzRFVmd4iqu8zuDY55BwAA
+AFNJREFUCNdjYMAE01w8AhgY7t69AWTvaFcAkgvA4hBySUchkDzG4AOUMGDgBgtyXGJgCWDguMLA
+cwFEchUwcB1g4DBg0E1gYGh3XQ5UwVQqgMUmALNqEhN3PGWqAAAAAElFTkSuQmCC
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAESIzRGaImaq7zN3uKN6begAA
+AFVJREFUCNdjYMAEYplJDAxMkxhrDBg4FBhkNjDwHmLguMzAdYiB7QpInusiiPRNAJGrBIAE+0QQ
+MxxEsBYwGDMwmDEwBDEwn0ibeYCB++7duxMYcAAA6VQQhImgcD0AAAAASUVORK5CYII=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvM3Uwh
+kGcAAABYSURBVAjXY2DABBIdkxgYmCYy9AUwcDxlkDvAwP6Mge8CSMavAUSuEWBgYOleAGIyrRYA
+UUA1QMD9lIHnIgP3Cwa+RyA2twGD3gYGxmUup4FqmMsNsNgEAJkrErcirjVRAAAAAElFTkSuQmCC
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAJFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAADHJj5lAAAAC3RSTlMAESIzRGZ3iLvM3aXhim4AAAA+SURBVAjX
+Y2DABjxABOMKEMk+A0SadYDIAhDJpgAizRhAZAGIZFMAkWoMINK9vHxXKUjpDgY42bm7nQEHAADc
+tQymVD9SLAAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAESIzRFVmd4iqu8zuDY55BwAA
+AFNJREFUCNdjYMAE01w8AhgY7t69AWTvaFcAkgvA4hBySUchkDzG4AOUMGDgBgtyXGJgCWDguMLA
+cwFEchUwcB1g4DBg0E1gYGh3XQ5UwVQqgMUmALNqEhN3PGWqAAAAAElFTkSuQmCC
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvM3Uwh
+kGcAAABYSURBVAjXY2DABBIdkxgYmCYy9AUwcDxlkDvAwP6Mge8CSMavAUSuEWBgYOleAGIyrRYA
+UUA1QMD9lIHnIgP3Cwa+RyA2twGD3gYGxmUup4FqmMsNsNgEAJkrErcirjVRAAAAAElFTkSuQmCC
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAESIzRGaImaq7zN3uKN6begAA
+AFVJREFUCNdjYMAEYplJDAxMkxhrDBg4FBhkNjDwHmLguMzAdYiB7QpInusiiPRNAJGrBIAE+0QQ
+MxxEsBYwGDMwmDEwBDEwn0ibeYCB++7duxMYcAAA6VQQhImgcD0AAAAASUVORK5CYII=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> {1:MULTICHOICE_HS:=<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvM3Uwh
+kGcAAABYSURBVAjXY2DABBIdkxgYmCYy9AUwcDxlkDvAwP6Mge8CSMavAUSuEWBgYOleAGIyrRYA
+UUA1QMD9lIHnIgP3Cwa+RyA2twGD3gYGxmUup4FqmMsNsNgEAJkrErcirjVRAAAAAElFTkSuQmCC
+">#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+">~<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAKlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmU0mKAAAADXRSTlMAESIzRFVmd4iqu8zuDY55BwAA
+AFNJREFUCNdjYMAE01w8AhgY7t69AWTvaFcAkgvA4hBySUchkDzG4AOUMGDgBgtyXGJgCWDguMLA
+cwFEchUwcB1g4DBg0E1gYGh3XQ5UwVQqgMUmALNqEhN3PGWqAAAAAElFTkSuQmCC
+">#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+">}</P><P><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> {1:SHORTANSWER:=3#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+">~=5#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+">}</P><P><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAIVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAADdcGRXAAAACnRSTlMAESIziJm7zN3u5dSV+AAAACNJREFUCNdjYMAC
+RIGYybUKSDIaeIFFyCQVgETarDYHBhwAAGGpBhwPdrFnAAAAAElFTkSuQmCC
+"> {1:NUMERICAL:=3:0#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEhNaABRrAENrECKg6mA8wKQ185gVwDSwHwN
+rC/KAERqJYCFNjIwBDAwSAswsAH5M1oVYgQYGDdov7vCwMBkwOCugN1mABiqEeALUM2PAAAAAElF
+TkSuQmCC
+">~=5:0#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAU0lEQVQI12NgQIAICLUTTDJ+BVNsD8AUVwOY0lcAU50QFZfAFCdEypsDRDNu5EsA
+UtIG9kCVjKcc64Ac7pDMO+VgNS8cQCTzZzCH/QKY4mhgQAMAKiMPa9oLlkgAAAAASUVORK5CYII=
+">}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz_with_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz_with_svg-moodle.ref
new file mode 100644
index 00000000000..aa1e98ab2cc
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tikz_with_svg-moodle.ref
@@ -0,0 +1,376 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjM8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjU8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjM8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjU8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjM8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> {1:MULTICHOICE_HS:=<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjM8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">~<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjU8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">}</P><P><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> {1:SHORTANSWER:=3#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">~=5#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">}</P><P><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NCIg
+aGVpZ2h0PSIxMy4yOCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NCAxMy4yOCIgeG1s
+OnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyB0
+cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yOCkiPjxnIHRyYW5zZm9y
+bT0idHJhbnNsYXRlKDIuNDksNC45OCkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yLjQ5LC0y
+LjQ5MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDg5KSI+PHRleHQgdHJhbnNmb3Jt
+PSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc4NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFtaWx5PSJT
+RlJNMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjE8L3RzcGFu
+PjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"> {1:NUMERICAL:=3:0#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjg5NSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">~=5:0#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuNTc2IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy41NzYi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuNTc2KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNS4wOTEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkxKSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwtMi42KSI+PHRleHQgdHJh
+bnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwyLjg2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJTRlRJMTAwMCIgZm9udC1zaXplPSI5Ljk2MjZweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8
+L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+">}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tolerance-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tolerance-moodle.ref
new file mode 100644
index 00000000000..5319491210c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_tolerance-moodle.ref
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Tolerance</text>
+ </category>
+</question>
+
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Num 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>4</tolerance>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>0</text>
+ <tolerance>2</tolerance>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ <feedback format="html"><text><![CDATA[<p>nope</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Num 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1,45E-3</text>
+ <tolerance>1,65e-4</tolerance>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>0</text>
+ <tolerance>0</tolerance>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ <feedback format="html"><text><![CDATA[<p>nope</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[ClozeNum 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number {1:NUMERICAL:=1:4~=0:3~*#nope}Give a number {1:NUMERICAL:=1:4~=0:2~*#nope}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[ClozeNum 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number {1:NUMERICAL:=1,45e-3:1,65E-4~=0:0~*#nope}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_truefalse-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_truefalse-moodle.ref
new file mode 100644
index 00000000000..875c60db03a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_truefalse-moodle.ref
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Truefalse questions</text>
+ </category>
+</question>
+
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is a matching question. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;true&rdquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p> Feedback for students choosing &rdquo;false&rdquo; </p>]]></text></feedback>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is an essay question. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;true&rdquo; </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;false&rdquo;</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 3]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Please answer &rdquo;True&rdquo;. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>false</text>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 4]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Please answer &rdquo;False&rdquo;. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_verbatim-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_verbatim-moodle.ref
new file mode 100644
index 00000000000..f3dc4067262
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/latin1ref/test_verbatim-moodle.ref
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Verbatim</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE>% !TeX encoding = UTF-8<BR/>% !TeX spellcheck = en_US<BR/>% !TEX TS-program = xelatex<BR/>\documentclass{article}<BR/>\usepackage[nostamp]{moodle}<BR/>\newif\iffvextra<BR/>\fvextratrue<BR/>\ifxetex % FOR XELATEX<BR/> \usepackage{fontspec}<BR/>\else %% FOR PDFLATEX<BR/> \usepackage[utf8]{inputenc} % necessary<BR/> \usepackage[T1]{fontenc} % necessary<BR/>\fi<BR/></CODE></PRE> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>test</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>toast</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/makefile b/Master/texmf-dist/doc/latex/moodle/test/makefile
new file mode 100644
index 00000000000..b942061ff26
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/makefile
@@ -0,0 +1,62 @@
+PREFIX=test
+SUFFIX=moodle
+LUATEX_ONLY_TEST_FILES=test_calculated_lua.tex
+XETEX_EXCLUDED_TEST_FILES=test_includegraphics_via_tikz.tex test_includegraphics_via_tikz_and_svg.tex test_tikz_with_svg.tex
+GENERIC_TEST_FILES=$(filter-out $(LUATEX_ONLY_TEST_FILES) $(XETEX_EXCLUDED_TEST_FILES),$(wildcard $(PREFIX)_*.tex))
+TEX_ENGINES=pdflatex lualatex xelatex
+LATEXFLAGS=-interaction=nonstopmode -shell-escape
+DIFFTOOL=diff -abBwZ
+FILE_CLEAN=*.log *.aux *.auxlock *.out *.blg *.bbl *.toc *.xml *.bcf *.synctex.gz *~ *.nav *.snm *.idx *.ilg *.ind _minted-* *.glo *.gls *.dpth *-tikztemp-*.pdf fig/*-converted-to.*
+ifndef DEBUG
+ DEBUG=> /dev/null
+endif
+
+.DEFAULT_GOAL := all
+.NOTPARALLEL := test
+
+.PHONY: all test clean distclean $(TEX_ENGINES)
+.SECONDARY: $(foreach engine,$(TEX_ENGINES),$(GENERIC_TEST_FILES:.tex=_$(engine)-$(SUFFIX).xml)) $(LUATEX_ONLY_TEST_FILES:.tex=_lualatex-$(SUFFIX).xml) $(XETEX_EXCLUDED_TEST_FILES:.tex=_pdflatex-$(SUFFIX).xml) $(XETEX_EXCLUDED_TEST_FILES:.tex=_lualatex-$(SUFFIX).xml)
+
+all: test
+
+test: $(TEX_ENGINES)
+
+pdflatex: $(GENERIC_TEST_FILES:.tex=_pdflatex.diff) $(XETEX_EXCLUDED_TEST_FILES:.tex=_pdflatex.diff)
+
+xelatex: $(GENERIC_TEST_FILES:.tex=_xelatex.diff)
+
+lualatex: $(GENERIC_TEST_FILES:.tex=_lualatex.diff) $(LUATEX_ONLY_TEST_FILES:.tex=_lualatex.diff) $(XETEX_EXCLUDED_TEST_FILES:.tex=_lualatex.diff)
+
+clean:
+ rm -rf $(FILE_CLEAN)
+
+distclean: clean
+ rm -rf *.pdf *.xml *.diff *.md5 *.py *.err $(SUFFIX).sty
+
+%_pdflatex-$(SUFFIX).xml : %.tex $(SUFFIX).sty
+ @pdflatex $(LATEXFLAGS) $< $(DEBUG)
+ @mv $(basename $<)-$(SUFFIX).xml $@
+
+%_xelatex-$(SUFFIX).xml : %.tex $(SUFFIX).sty
+ @xelatex $(LATEXFLAGS) $< $(DEBUG)
+ @mv $(basename $<)-$(SUFFIX).xml $@
+
+%_lualatex-$(SUFFIX).xml : %.tex $(SUFFIX).sty
+ @lualatex $(LATEXFLAGS) $< $(DEBUG)
+ @mv $(basename $<)-$(SUFFIX).xml $@
+
+OK = "$$(tput setaf 0)$$(tput setab 2)[ OK ]$$(tput sgr0)"
+KO = "$$(tput setaf 0)$$(tput setab 1)[FAILED]$$(tput sgr0)"
+$(PREFIX)_%_pdflatex.diff : latin1ref/$(PREFIX)_%-$(SUFFIX).ref $(PREFIX)_%_pdflatex-$(SUFFIX).xml
+ @$(DIFFTOOL) $^ > $@ && echo "$(OK) $* (pdflatex)" | sed -e "s/_/ /g" || echo "$(KO) $* (pdflatex)" | sed -e "s/_/ /g"
+
+$(PREFIX)_%_xelatex.diff : utf8ref/$(PREFIX)_%-$(SUFFIX).ref $(PREFIX)_%_xelatex-$(SUFFIX).xml
+ @$(DIFFTOOL) $^ > $@ && echo "$(OK) $* (xelatex)" | sed -e "s/_/ /g" || echo "$(KO) $* (xelatex)" | sed -e "s/_/ /g"
+
+$(PREFIX)_%_lualatex.diff : utf8ref/$(PREFIX)_%-$(SUFFIX).ref $(PREFIX)_%_lualatex-$(SUFFIX).xml
+ @$(DIFFTOOL) $^ > $@ && echo "$(OK) $* (lualatex)" | sed -e "s/_/ /g" || echo "$(KO) $* (lualatex)" | sed -e "s/_/ /g"
+
+$(SUFFIX).sty: ../$(SUFFIX).sty
+ cp $< $@
+../$(SUFFIX).sty: ../$(SUFFIX).dtx
+ $(MAKE) -C ../ $(SUFFIX).sty
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_autopoints.tex b/Master/texmf-dist/doc/latex/moodle/test/test_autopoints.tex
new file mode 100644
index 00000000000..05febfd567d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_autopoints.tex
@@ -0,0 +1,51 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\def\myequation{$(1+\sqrt{5})/2$}
+\htmlregister{\myequation}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of autopoints in multi answers
+questions.
+
+\begin{quiz}{Example Quiz}
+\begin{multi}[multiple]{All correct}
+100\% is distributed uniformly.
+\item* A
+\item* B
+\item* C
+\end{multi}
+\begin{multi}[multiple]{Auto sanction}
+Without the star, an error shall be issued because correct answers should sum
+up to 100\%.
+\item* A
+\item B
+\item C
+\end{multi}
+\begin{multi}[multiple]{All correct but sum $\geq 100$}
+A warning shall be issued because correct answers must sum up to 100\%.
+\item[fraction=50] A
+\item[fraction=50] B
+\item[fraction=50] C
+\end{multi}
+\begin{multi}[multiple]{Multiple Choice}
+Select the following numbers that are prime.
+\item[fraction=20] 2
+\item* 5
+\item* 7
+\item[fraction=-50] 1
+\item 6
+\item 8
+\end{multi}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_calculated_lua.tex b/Master/texmf-dist/doc/latex/moodle/test/test_calculated_lua.tex
new file mode 100644
index 00000000000..b4007926e2f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_calculated_lua.tex
@@ -0,0 +1,77 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{hyperref,luacode}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the possibility of generating
+pseudo-calculated questions with the help of Lua scripts.
+
+Inspired by
+\url{https://github.com/avohns/python-latex-moodle-quiz/blob/master/simple-examples-eng/example1_arithmetic.tex}
+
+\begin{quiz}[tags={calculated}]{Example Quiz}
+% THIS DOES NOT REQUIRE LUACODE AND WORKS WITH RECENT LUATEX (2020)
+%\directlua{
+%function clozenum_print(pair,op,result)
+% tex.print("\\begin{numerical}$"..pair[1].." "..op.." "..pair[2].."
+% =$".."\\item ",result,"\\end{numerical}")
+%end
+%function cloze_print(pair,points)
+% tex.print("\\begin{cloze}[points="..points.."]{Arithmetic Quiz
+% ("..pair[1]..", "..pair[2]..")}Solve the following tasks!\\\\")
+% clozenum_print(pair,"+",pair[1]+pair[2])
+% clozenum_print(pair,"-",pair[1]-pair[2])
+% clozenum_print(pair,"*",pair[1]*pair[2])
+% if pair[1]/pair[2]==math.floor(pair[1]/pair[2]) then
+% clozenum_print(pair,":",math.floor(pair[1]/pair[2]))
+% end
+% tex.print("\\end{cloze}")
+%end
+%for x = 2,4 do
+% for y = 2,4 do
+% if x>y then
+% if x/y==math.floor(x/y) then points=4 else points=3 end
+% cloze_print({x,y},points)
+% end
+% end
+%end
+%}
+% THIS SEEMS TO WORK BETTER WITH EARLIER VERSIONS OF LUATEX
+\begin{luacode*}
+function clozenum_print(pair,op,result)
+ tex.print([[\begin{numerical}$]]..pair[1].." "..op.." "..pair[2]..
+ " = $"..[[\item ]],result,[[\end{numerical}]])
+end
+function cloze_print(pair,points)
+ tex.print([[\begin{cloze}[points=]]..points.."]{Arithmetic Quiz ("..
+ pair[1]..", "..pair[2]..[[)}Solve the following tasks!\\]])
+ clozenum_print(pair,"+",pair[1]+pair[2])
+ clozenum_print(pair,"-",pair[1]-pair[2])
+ clozenum_print(pair,"*",pair[1]*pair[2])
+ if pair[1]/pair[2]==math.floor(pair[1]/pair[2]) then
+ clozenum_print(pair,":",math.floor(pair[1]/pair[2]))
+ end
+ tex.print([[\end{cloze}]])
+end
+for x = 2,4 do
+ for y = 2,4 do
+ if x>y then
+ if x/y==math.floor(x/y) then points=4 else points=3 end
+ cloze_print({x,y},points)
+ end
+ end
+end
+\end{luacode*}
+\end{quiz}
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_calculated_python.tex b/Master/texmf-dist/doc/latex/moodle/test/test_calculated_python.tex
new file mode 100644
index 00000000000..ce60773a1f6
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_calculated_python.tex
@@ -0,0 +1,52 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{hyperref}
+\usepackage{python}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the possibility of generating
+pseudo-calculated questions with the help of Python scripts.
+
+Inspired by
+\url{https://github.com/avohns/python-latex-moodle-quiz/blob/master/simple-examples-eng/example1_arithmetic.tex}
+
+\begin{quiz}[tags={calculated}]{Example Quiz}
+% the following syntax is Python 3
+% on Ubuntu 20.10, I had to force python to default to python 3
+% https://stackoverflow.com/a/50331137
+\begin{python}
+def clozenum_print(pair,op,result):
+ print(rf"""\begin{{numerical}}
+${pair[0]} {op} {pair[1]} =$\item {result}
+\end{{numerical}}""")
+def cloze_print(pair,points):
+ print(rf"""\begin{{cloze}}[points={points}]{{Arithmetic Quiz
+ {(pair[0],pair[1])}}}Solve the following tasks!\\""")
+ clozenum_print([x,y],"+",x+y)
+ clozenum_print([x,y],"-",x-y)
+ clozenum_print([x,y],"*",x*y)
+ if pair[0]/pair[1] == pair[0]//pair[1]:
+ clozenum_print([x,y],":",x//y)
+ print("\end{cloze}")
+for x in range(2,5):
+ for y in range(2,5):
+ if x > y:
+ if x/y == x//y:
+ points=4
+ else:
+ points=3
+ cloze_print([x,y],points)
+\end{python}
+\end{quiz}
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_categories.tex b/Master/texmf-dist/doc/latex/moodle/test/test_categories.tex
new file mode 100644
index 00000000000..23b2d7014f5
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_categories.tex
@@ -0,0 +1,77 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[section,nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of category settings in the quiz
+environment.
+
+%\setcategory{Category Outside Quiz}
+%\setsubcategory{Subcategory Outside Quiz}
+
+\begin{quiz}{Examples}
+\setsubcategory{Generic}
+\begin{multi}{Multi}
+A
+\item* B
+\item C
+\item D
+\end{multi}
+
+\begin{numerical}{Numerical}
+One
+\item 1
+\end{numerical}
+
+\setsubcategory{Very Specific}
+\begin{multi}{Multi}
+A
+\item* B
+\item C
+\item D
+\end{multi}
+
+\begin{numerical}{Numerical}
+One
+\item 1
+\end{numerical}
+
+\setcategory{Other Category}
+
+\begin{multi}{Multi}
+A
+\item* B
+\item C
+\item D
+\end{multi}
+
+\begin{numerical}{Numerical}
+One
+\item 1
+\end{numerical}
+
+\setsubcategory{Other Subcategory}
+\begin{multi}{Multi}
+A
+\item* B
+\item C
+\item D
+\end{multi}
+
+\begin{numerical}{Numerical}
+One
+\item 1
+\end{numerical}
+
+\end{quiz}
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_circuitikz.tex b/Master/texmf-dist/doc/latex/moodle/test/test_circuitikz.tex
new file mode 100644
index 00000000000..942d3c8ca0e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_circuitikz.tex
@@ -0,0 +1,38 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage[nooldvoltagedirection]{circuitikz}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of circuitikz.
+
+\begin{quiz}{Circuitikz}
+
+\begin{multi}{Multi}
+\begin{tikzpicture}[american]
+\draw (0,0) to[isource, l=$I_0$] (0,3) --(2,3) to[R=$R_1$] (2,0) -- (0,0);
+\draw (2,3) -- (4,3) to[R=$R_2$] (4,0) -- (2,0);
+\end{tikzpicture}
+\item[feedback={}]* \begin{tikzpicture}[american]
+\draw (0,0) to[isource, l=$I_0$] (0,3) --(2,3) to[R=$R_1$] (2,0) -- (0,0);
+\draw (2,3) -- (4,3) to[R=$R_2$] (4,0) -- (2,0);
+\end{tikzpicture}
+\item[feedback={\begin{tikzpicture}[american]
+\draw (0,0) to[isource, l=$I_0$] (0,3) --(2,3) to[R=$R_1$] (2,0) -- (0,0);
+\draw (2,3) -- (4,3) to[R=$R_2$] (4,0) -- (2,0);
+\end{tikzpicture}}] toast
+\end{multi}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_cloze_multi.tex b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_multi.tex
new file mode 100644
index 00000000000..ce4cb88193c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_multi.tex
@@ -0,0 +1,117 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of multi answers questions
+embedded in cloze questions. The following options are tested
+\begin{itemize}
+ \item Single or multiple correct answer
+ \item Regular mode, Horizontal mode, Vertical mode
+ \item Shuffling or no shuffling
+\end{itemize}
+
+\begin{quiz}{Cloze Multi}
+
+\begin{cloze}{Cloze}
+%% SINGLE
+\begin{multi}[shuffle=false]
+Regular, single, no shuffle
+\item[feedback={yes}]* chip
+\item[fraction=10] \textit{chop}
+\item[feedback={no.},fraction=-30] \textbf{chap}
+\end{multi}
+
+\begin{multi}[shuffle=false,vertical]
+Vertical, single, no shuffle
+\item[feedback={yes}]* chip
+\item[fraction=10] chop
+\item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[shuffle=false,horizontal]
+Horizontal, single, no shuffle
+\item[feedback={yes}]* chip
+\item[fraction=10] chop
+\item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[shuffle=true]
+ Regular, single, shuffle
+ \item[]* chip
+ \item[feedback={yes}] chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[shuffle=true,vertical]
+ Vertical, single, shuffle
+ \item[feedback={yes}]* chip
+ \item[fraction=10] chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[shuffle=true,horizontal]
+ Horizontal, single, shuffle
+ \item[feedback={yes}]* chip
+ \item chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+%% MULTIPLE
+\begin{multi}[multiple,shuffle=false]
+ Regular, multiple, no shuffle
+ \item* chip
+ \item[feedback={yes}]* chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+%\begin{multi}[multiple,shuffle=false,vertical]
+% Vertical, multiple, no shuffle
+% \item[feedback={yes}]* chip
+% \item* chop
+% \item[feedback={no.}] chap
+%\end{multi}
+
+\begin{multi}[multiple,shuffle=false,horizontal]
+ Horizontal, multiple, no shuffle
+ \item[feedback={yes}]* chip
+ \item* chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[multiple,shuffle=true]
+ Regular, multiple, shuffle
+ \item[]* chip
+ \item[feedback={yes}]* chop
+ \item[feedback={no.}] chap
+\end{multi}
+%
+%\begin{multi}[multiple,shuffle=true,vertical]
+% Vertical, multiple, shuffle
+% \item[feedback={yes}]* chip
+% \item* chop
+% \item[feedback={no.}] chap
+%\end{multi}
+%
+\begin{multi}[multiple,shuffle=true,horizontal]
+ Horizontal, multiple, shuffle
+ \item[feedback={yes}]* chip
+ \item* chop
+ \item[feedback={no.}] chap
+\end{multi}
+
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_cloze_numerical.tex b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_numerical.tex
new file mode 100644
index 00000000000..138f1fee868
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_numerical.tex
@@ -0,0 +1,34 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of numerical questions
+embedded in cloze questions.
+
+\begin{quiz}{Close Short Answer}
+
+\begin{cloze}{Cloze}
+\begin{numerical}
+Enter an integer $n$ such that $0< n\leq 2$.
+\item[tolerance=0.001,fraction={10},feedback={study difference between $<$ and
+$\leq$}] 0
+\item[tolerance=0.01,feedback={good!}] 1
+\item[tolerance=0.1,feedback={OK}] 2
+\end{numerical}
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_cloze_shortanswer.tex b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_shortanswer.tex
new file mode 100644
index 00000000000..70286cea8f2
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_cloze_shortanswer.tex
@@ -0,0 +1,38 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of short answers questions
+embedded in cloze questions.
+
+\begin{quiz}{Close Short Answer}
+
+\begin{cloze}{Cloze}
+\begin{shortanswer}[usecase]
+Who?
+\item chip
+\item[feedback={yes},fraction=10] chop
+\item[feedback={no.},fraction=-30] chap
+\end{shortanswer}
+\begin{shortanswer}
+what?
+\item chip
+\item[feedback={yes},fraction=10] chop
+\item[feedback={no.},fraction=-30] chap
+\end{shortanswer}
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_commands.tex b/Master/texmf-dist/doc/latex/moodle/test/test_commands.tex
new file mode 100644
index 00000000000..3ff827efa49
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_commands.tex
@@ -0,0 +1,37 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{hyperref}
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of some \LaTeX\ commands for
+conversion to HTML.
+
+\begin{quiz}[points=1]{LaTeX Commands}
+\begin{multi}{LaTeX Commands}
+Find the answer with small capitals
+\item \emph{emphasis}
+\item \textbf{bold}
+\item \textit{italic}
+\item \texttt{typewriter}
+\item* \textsc{Small Capitals}
+\item \underline{underlined}
+\item M\textsuperscript{me}
+\item H\textsubscript{2}O
+\item \url{http://192.0.0.256}
+\item \href{mailto:name@server.com}{Contact me}
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_description.tex b/Master/texmf-dist/doc/latex/moodle/test/test_description.tex
new file mode 100644
index 00000000000..c96ea81ce68
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_description.tex
@@ -0,0 +1,30 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the description
+question type.
+
+\begin{quiz}{Example Quiz}
+\begin{description}[tags={descr},feedback={here is a feedback}]{Requirements}
+This is a description. Not really a question. We can include environments and
+math.
+\begin{itemize}
+\item This
+\item That
+\end{itemize}
+\[\mathrm{e}^{2\mathrm{i}\pi}+1=0.\]
+\end{description}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_environments.tex b/Master/texmf-dist/doc/latex/moodle/test/test_environments.tex
new file mode 100644
index 00000000000..b2b1bd552ca
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_environments.tex
@@ -0,0 +1,51 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+
+\renewcommand\theenumiii{\arabic{enumiii}}% third level
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of some \LaTeX\ environments for
+conversion to HTML.
+
+\begin{quiz}[points=1]{LaTeX Environments}
+\begin{multi}{LaTeX Environments}
+\begin{center}
+\textsc{This is a question}
+\end{center}
+Select the numbered list
+\item[feedback={yes}]* \begin{enumerate}
+ \item C
+ \item D
+ \begin{itemize}
+ \item S
+ \item T
+ \item U
+ \end{itemize}
+ \end{enumerate}
+\item[feedback={Example of numbered list:\\\begin{enumerate}
+\item first item
+\item second item
+\end{enumerate}
+}] \begin{itemize}
+ \item E
+ \begin{enumerate}
+ \item X
+ \item Y
+ \item Z
+ \end{enumerate}
+ \item F
+ \end{itemize}
+\end{multi}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_escaping_right_braces_in_cloze.tex b/Master/texmf-dist/doc/latex/moodle/test/test_escaping_right_braces_in_cloze.tex
new file mode 100644
index 00000000000..e6b75c2cc6d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_escaping_right_braces_in_cloze.tex
@@ -0,0 +1,53 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+
+\def\myequation{y=a\sqrt{x}/2+{b}}
+\htmlregister{\myequation}
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check that in cloze subquestion code the right
+brace character is escaped with a backslash, as expected.
+
+This allows the character to pass Moodle import and \LaTeX equations to be
+displayed in \texttt{clozemulti} answers and in all cloze feedbacks.
+
+\begin{quiz}{Cloze: Escaping Characters}
+
+\begin{cloze}[points=2]{Cloze}
+No escaping here: $\myequation$
+
+\begin{multi}[points=4,vertical,shuffle=false]
+No escaping here: \texttt{text} $\myequation$
+\item* $\lbrace A\rbrace$
+\item \{B\}
+\end{multi}
+
+\begin{shortanswer}
+{No escaping here: } $\myequation$
+\item[feedback={nip}] chip
+\item[fraction=10,feedback={that must be escaped: $\myequation$}] nop
+\end{shortanswer}
+
+\begin{numerical}
+{No escaping here: } $\myequation$
+\item[feedback={nip}] 0
+\item[fraction=10,feedback={that must be escaped: $\myequation$}] 1
+\end{numerical}
+
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_essay.tex b/Master/texmf-dist/doc/latex/moodle/test/test_essay.tex
new file mode 100644
index 00000000000..21524bb5c53
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_essay.tex
@@ -0,0 +1,29 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of essay questions.
+
+\begin{quiz}[points=1]{Essay Test}
+
+\begin{essay}[feedback={feedback for essay},template={Type you answer
+here}]{Title}
+A
+\item B
+\item C
+\end{essay}
+
+\end{quiz}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_expandnewcommands.tex b/Master/texmf-dist/doc/latex/moodle/test/test_expandnewcommands.tex
new file mode 100644
index 00000000000..b74f8f9f8da
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_expandnewcommands.tex
@@ -0,0 +1,49 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+
+\moodleregisternewcommands
+
+%%%% Defining Sets
+\providecommand{\N}{\mathbb{N}}
+\newcommand{\K}{\mathbb{K}}
+\newcommand{\C}{\mathcal{C}}
+\renewcommand{\C}{\mathbb{C}}
+\newcommand{\Z}{\mathbb{Z}}
+\newcommand*{\R}{\mathbb{R}}
+\newcommand{\Q}{\mathbb{Q}}
+\newcommand{\prepostbb}[3]{#1\mathbb{#2}#3}
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of automatic recording of
+\LaTeX\ new commands for expansion when converting to HTML.
+
+\begin{quiz}{Recording New Commands for Expansion}
+
+\begin{multi}{Sets}
+Standard notation for the set of natural integers:
+\item* $\N$
+\item $\Z$
+\item $\Q$
+\item $\C$
+\item $\R$
+\item $\prepostbb{}{V}{}$
+\item $\prepostbb{\vphantom{K}^\dagger}{K}{^*_2}$
+\end{multi}
+
+\end{quiz}
+
+\end{document}
+
+
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_fancyvrb.tex b/Master/texmf-dist/doc/latex/moodle/test/test_fancyvrb.tex
new file mode 100644
index 00000000000..9f29837a1ee
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_fancyvrb.tex
@@ -0,0 +1,72 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\newif\iffvextra
+\fvextratrue % comment this line to use vanilla 'fancyvrb'
+\iffvextra
+ \usepackage{fvextra,xcolor}
+\else
+ \usepackage{fancyvrb} % must be loaded after fancybox
+\fi
+
+\fvset{firstline=3,firstnumber=2,lastline=7,numbers=left,tabsize=4,numberblanklines=false}
+\iffvextra
+ \fvset{highlightlines={2-5,8},numbers=both}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of \textsf{fancyvrb} or
+\textsf{fvextra} packages.
+
+The only command supported is \texttt{VerbatimInput[<options>]\{<filename>\}}.
+The variant with a star is unsupported.
+
+Outside of the moodle question bodies, \texttt{VerbatimOut} environments can be
+set to define portions of code.
+
+\begin{quiz}{Fancy Verbatim}
+% /!\ firstline and lastline set previously would apply to VerbatimOut
+\begin{VerbatimOut}[firstline,lastline]{test.log}
+ % !TeX encoding = UTF-8
+ % !TeX spellcheck = en_US
+ % !TEX TS-program = xelatex
+
+ \documentclass{article}
+ \usepackage[nostamp]{moodle}
+ \newif\iffvextra
+ \fvextratrue
+ \ifxetex % FOR XELATEX
+ \usepackage{fontspec}
+ \else %% FOR PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+ \fi
+\end{VerbatimOut}
+\fvset{gobble=2} % remove two characters at the beginning of each line
+\fvset{frame=none}% overide default display settings for PDF
+
+% To avoid collision of line and item numbers in PDF, force `left-right' mode:
+\RecustomVerbatimCommand{\VerbatimInput}{LVerbatimInput}{}
+\begin{multi}{Multi}
+Pick up the code decorated with line numbering on both sides.
+\item[feedback={No. Here, line numbers lie on the left side.}]
+\VerbatimInput{test.log}
+\item[feedback={No. Here, line numbers lie on the right side.}]
+\VerbatimInput[numbers=right,firstnumber=last,numberblanklines=true]{test.log}
+\item[feedback={yes!}]*
+\VerbatimInput[numbers=left,firstline=9,firstnumber=4,lastline=23]{test.log}
+\end{multi}
+
+\end{quiz}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_fractions.tex b/Master/texmf-dist/doc/latex/moodle/test/test_fractions.tex
new file mode 100644
index 00000000000..07174524d87
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_fractions.tex
@@ -0,0 +1,31 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check how fractions are handled.
+
+\begin{quiz}{Example Quiz}
+
+\begin{multi}[multiple,feedback={abc\\def
+$\sqrt{2}$}]{Multiple Choice}
+Select the following numbers that are prime.
+\item[fraction=83.3] $\sqrt{25}$
+\item[fraction=-66.6] \textbf{68}
+\item[fraction=16.7,feedback={$\sqrt{25}$}] 7
+\item[fraction=33.3] 8
+\item[fraction=-0.05] \texttt{nothing}
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_french.tex b/Master/texmf-dist/doc/latex/moodle/test/test_french.tex
new file mode 100644
index 00000000000..82e1b20a0c5
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_french.tex
@@ -0,0 +1,62 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage[french]{babel} % for french quotes
+\usepackage{hyperref}
+% pangramme conçu par Gilles Esposito-Farèse et cité dans "Petites leçons de
+% typographie" de Jacques André: https://jacques-andre.fr/faqtypo/lessons.pdf
+\ifPDFTeX
+ \def\myquestiontext{ \underline{Pangramme} con\c{c}u par Gilles
+ \textsc{Esposito-Far\`ese}\,:}
+ \def\pangramme{D\`es No\"el o\`u un z\'ephyr ha\"i me v\^et de
+gla\c{c}ons w\"urmiens je d\^ine d'exquis r\^otis de b\oe uf au kir \`a l'a\"y
+d'\^age m\^ur \& c\ae tera\,!}
+ \def\myfeedback{cit\'e dans
+\og\,\href{https://jacques-andre.fr/faqtypo/lessons.pdf}{Petites
+ le\c{c}ons de typographie}\,\fg\ de Jacques \textsc{Andr\'e}.}
+\else % assuming XELATEX or LUALATEX
+ \def\myquestiontext{ \underline{Pangramme} conçu par Gilles
+ \textsc{Esposito-Farèse}:}
+ \def\pangramme{Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne
+d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr \& cætera\,!}
+ \def\myfeedback{cité dans
+ \og\href{https://jacques-andre.fr/faqtypo/lessons.pdf}{Petites
+ leçons de typographie}\fg\ de Jacques \textsc{André}.}
+\fi
+\htmlregister{\myquestiontext}
+\htmlregister{\pangramme}
+\htmlregister{\myfeedback}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the \texttt{babel} package
+with option \texttt{french} that causes problems during \texttt{pdfLaTeX}
+compilation, due to autospacing.
+
+Secondarily, the use of \verb|\textsuperscript| (and french adaptation
+\verb|\fup|), \verb|\textsubscript|, \verb|\textsc|, \verb|\underline|,
+\verb|\url|, and \verb|\href| is also demonstrated.
+
+\begin{quiz}[points=1]{French Issues}
+\ifPDFTeX
+ \NoAutoSpacing% this option preserves pdflatex compilation
+\fi
+\begin{multi}[feedback={1\fup{er}, M\fup{me}, N\fup{o}\\
+1\textsuperscript{er}, M\textsuperscript{me}, N\textsuperscript{o}\\
+H\textsubscript{2}O}]{Test french}
+\myquestiontext
+\item[feedback={\myfeedback}]* \pangramme
+\item Portez ce vieux whisky au juge blond qui fume.
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_generalfeedback.tex b/Master/texmf-dist/doc/latex/moodle/test/test_generalfeedback.tex
new file mode 100644
index 00000000000..1c01d36080a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_generalfeedback.tex
@@ -0,0 +1,103 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage[french]{babel} % for french quotes
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of general feedback.
+
+\begin{quiz}[points=1]{General Feedback Test}
+\ifPDFTeX
+ \NoAutoSpacing% this option preserves pdflatex compilation
+\fi
+
+\begin{multi}[feedback={multi}]{Title}
+%\og abc\fg%\ae%\oe%
+\AA
+\item[feedback={tic}] \ae
+\item[feedback={tac}]* \oe
+\end{multi}
+
+\begin{shortanswer}[feedback={shortanswer}]{Title}
+% %\og abc\fg%\ae%\oe
+\AA
+\item[feedback={toc}] B
+\item[feedback={\og\fg}] C
+\item[fraction=0] *
+\end{shortanswer}
+
+\begin{numerical}[feedback={numerical}]{Title}
+% %\og abc\fg%\ae%\oe
+\AA
+\item[feedback={toc}] 1
+\item[feedback={\og\fg}] 2
+\item[fraction=0] 3
+\end{numerical}
+
+\begin{matching}[feedback={matching}]{Title}
+%\og abc\fg%\ae%\oe%
+\AA
+\item \ae \answer oui
+\item \oe \answer non
+\item \answer \AA
+\end{matching}
+
+\begin{essay}[feedback={essay}]{Title}
+%\og abc\fg%\ae%\oe%
+\AA
+\item \ae yo
+\item \oe
+\end{essay}
+
+\begin{cloze}[feedback={54}]{Cloze}
+\AA
+\begin{multi}[shuffle=false]
+\OE
+\item[]* chip
+\item[feedback={yes},fraction=10] chop
+\item[feedback={no.}] chap
+\end{multi}
+\fg
+\begin{shortanswer}
+\AA
+\item[feedback={toc}] B
+\item[feedback={\og\fg}] C
+\item[fraction=0] *
+\end{shortanswer}
+\og
+\begin{numerical}
+\AA
+\item[] 1
+\item[feedback={\og\fg}] 2
+\item[fraction=0] 3
+\end{numerical}
+\begin{multi}[shuffle=false,vertical]
+\OE
+\item[feedback={yes}]* chip
+\item[fraction=10] chop
+\item[feedback={no.}] chap
+\end{multi}
+
+\begin{multi}[shuffle=false,horizontal]
+\OE
+\item[feedback={yes}]* chip
+\item[fraction=10] chop
+\item[feedback={no.}] chap
+\end{multi}
+
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_handout.tex b/Master/texmf-dist/doc/latex/moodle/test/test_handout.tex
new file mode 100644
index 00000000000..059e8c9149e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_handout.tex
@@ -0,0 +1,159 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp,handout]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+%\RLsetrandomseed{3}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the package option
+\texttt{handout}. With this option, the PDF file is clean from teacher-only
+information (answers, points, penalty, feedback, tags) and, hence, can be given
+to students for classroom work. In particular, as would Moodle do,
+answers in \texttt{matching} questions are shuffled and the option
+\texttt{shuffle} triggers the shuffling of choices offered (\texttt{multi} and
+\texttt{matching}). The XML file is generated as usual.
+
+\begin{quiz}[points=1,tags={tag},feedback={General feedback},shuffle]{ Option
+Handout}
+
+\begin{description}{Description}
+Description text
+\end{description}
+
+\begin{essay}{Essay}
+Question text
+\item A
+\item B
+\item C
+\end{essay}
+
+\begin{multi}[shuffle=false]{Multi Single}
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[multiple]{Multi Multiple}
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB}] B
+\item[feedback={CCC}]* C
+\item[feedback={DDD}] D
+\end{multi}
+
+\begin{truefalse}{True/False 1}
+Question text
+\item[feedback={AAA}]
+\item[feedback={BBB}]*
+\end{truefalse}
+
+\begin{truefalse}{True/False 2}
+Question text
+\item*
+\end{truefalse}
+
+\begin{truefalse}{True/False 3}
+Question text
+\item
+\item*
+\end{truefalse}
+
+\begin{numerical}[tolerance=1]{Numerical}
+Question text
+\item[feedback={1}] 1
+\item[feedback={3},fraction=0] 3
+\end{numerical}
+
+\begin{shortanswer}[tolerance=1]{Short Answer}
+Question text
+\item[feedback={1}] aaa
+\item[feedback={3},fraction=0] bbb
+\end{shortanswer}
+
+\begin{matching}[dd]{Matching}
+Question text
+\item A \answer 1
+\item B \answer 2
+\item C \answer 3
+\item \answer 4
+\end{matching}
+
+\begin{matching}[shuffle=false]{Matching}
+Question text
+\item A \answer 1
+\item B \answer 2
+\item C \answer 3
+\item \answer 4
+\end{matching}
+
+\begin{cloze}{Cloze}
+
+\begin{multi}[horizontal,shuffle=false]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[vertical,shuffle=false]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[inline,shuffle=false]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[horizontal]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[vertical]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{multi}[inline]
+Question text
+\item[feedback={AAA}]* A
+\item[feedback={BBB},fraction=10] B
+\item[feedback={CCC}] C
+\end{multi}
+
+\begin{numerical}[tolerance=1]
+Question text
+\item[feedback={1}] 1
+\item[feedback={3},fraction=0] 3
+\end{numerical}
+
+\begin{shortanswer}[tolerance=1]
+Question text
+\item[feedback={1}] aaa
+\item[feedback={3},fraction=0] bbb
+\end{shortanswer}
+
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics.tex b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics.tex
new file mode 100644
index 00000000000..433872176c6
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics.tex
@@ -0,0 +1,45 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{graphicx}
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of picture inclusion using
+\verb|\includegraphics|. Only options \texttt{width} and \texttt{height} are
+supported. The file name or path may include spaces. The file path can be
+specified with \verb|\graphicspath|. In general, file extensions can be
+omitted. However, with case-sensitive file-systems (like under Linux), files
+with extensions in upper-case cannot be omitted.
+
+\begin{quiz}{Includegraphics}
+
+\begin{multi}{Picture}
+\includegraphics[width=2cm]{fig/1 1.PNG}
+\item[feedback={\includegraphics{fig/2 2.pdf}}]* \includegraphics{fig/3.gif}
+\item[feedback={\includegraphics{fig/4.jpg}}] \includegraphics{fig/5.jpeg}
+\end{multi}
+
+\graphicspath{{./fig/}}
+
+\begin{matching}[dd]{Picture}
+\includegraphics{1 1.PNG}
+% on Linux, if .PNG is omitted moodle tries to manipulate "fig/1 1.png"
+\item \includegraphics{2 2} \answer \includegraphics{3}
+\item \includegraphics{4} \answer \includegraphics{5}
+\item \includegraphics{3} \answer \includegraphics{2 2}
+\end{matching}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz.tex b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz.tex
new file mode 100644
index 00000000000..64fac8816ea
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz.tex
@@ -0,0 +1,41 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp,tikz]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to experiment the support of picture inclusion using
+\verb|\includegraphics| via \texttt{tikz}. All options are supported. The file
+name or path may include spaces. The file path can be specified with
+\verb|\graphicspath|. File extensions can be omitted.
+
+\begin{quiz}{Includegraphics with TikZ}
+
+\begin{multi}{Picture}
+\includegraphics[width=2em,angle=90]{fig/1 1.PNG}
+%\includegraphics{fig/1.png}
+\item* \includegraphics[scale=.5]{fig/2 2.pdf}
+\item \includegraphics{fig/3.gif}
+\end{multi}
+
+\graphicspath{{./fig/}}
+\begin{matching}[dd]{Picture}
+\includegraphics{1 1}
+\item \includegraphics[angle=45]{2 2} \answer \includegraphics{3}
+\item \includegraphics[angle=-45]{4} \answer \includegraphics{5}
+\item \includegraphics[scale=2]{3} \answer
+\includegraphics[angle=-180,scale=2]{2 2}
+\end{matching}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz_and_svg.tex b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz_and_svg.tex
new file mode 100644
index 00000000000..2eba3ef5085
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_via_tikz_and_svg.tex
@@ -0,0 +1,5 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\PassOptionsToPackage{svg}{moodle}
+\input{test_includegraphics_via_tikz.tex} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_with_svg.tex b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_with_svg.tex
new file mode 100644
index 00000000000..0c51d2d73d4
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_includegraphics_with_svg.tex
@@ -0,0 +1,46 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp,svg]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check picture inclusion using
+\verb|\includegraphics| together with the \texttt{svg} package option.
+When this option is used, vector graphics will be converted to SVG rather than
+being rasterized. The picture inclusion using \verb|\includegraphics| is mostly
+unchanged. If SVG files are included, they are converted on-the-fly to PDF.
+Conversions from and to SVG are performed using \textsf{Inkscape}. The
+\textsf{Scour} utility is used to perform an optimization on intermediate SVG
+files, before inclusion to the XML.
+
+\begin{quiz}{Scalable Vector Graphics}
+
+\begin{multi}{Picture}
+\includegraphics{fig/MoodlE_logo.SVG}
+\item[feedback={\includegraphics{fig/2 2.pdf}}]* \includegraphics{fig/3.gif}
+\item[feedback={\includegraphics{fig/4.jpg}}] \includegraphics{fig/5.jpeg}
+\end{multi}
+
+\graphicspath{{./fig/}}
+
+\begin{matching}[dd]{Picture}
+\includegraphics[width=2cm]{MoodlE_logo.SVG}
+% on Linux, if .SVG is omitted moodle tries to manipulate "MoodlE_logo.svg"
+\item \includegraphics{2 2} \answer \includegraphics{3}
+\item \includegraphics{4} \answer \includegraphics{5}
+\item \includegraphics{3} \answer \includegraphics[width=2em]{2 2}
+\end{matching}
+
+\end{quiz}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_macros.tex b/Master/texmf-dist/doc/latex/moodle/test/test_macros.tex
new file mode 100644
index 00000000000..b5b67a2d44f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_macros.tex
@@ -0,0 +1,39 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{eurosym,textcomp} % for Euro symbol
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of some \LaTeX\ macros for
+conversion to HTML.
+
+\begin{quiz}[points=1]{LaTeX Macros}
+\begin{multi}{LaTeX Macros}
+The following commands should not be placed in items: \\ and \par
+Find the \LaTeX\ logo
+\item* \TeX\ and \LaTeX
+\item (tilde)~and \#
+\item \$ and \&
+\item \& and \S
+\item \{ and \}
+\item (space)\ and \relax (relax)
+\item (space)\,and\thinspace(thinspace)
+\item \dots\ and \ldots
+\item \euro\ and \texteuro
+\item \TeX\ and \LaTeX
+\item \_ and \textbackslash
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_matching.tex b/Master/texmf-dist/doc/latex/moodle/test/test_matching.tex
new file mode 100644
index 00000000000..addeb50d006
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_matching.tex
@@ -0,0 +1,39 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+%\RLsetrandomseed{3}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the matching question type.
+
+\begin{quiz}{Matching}
+
+\begin{matching}[dd]{Matching}
+Question text
+\item A \answer 1
+\item B \answer 2
+\item C \answer 3
+\item \answer 4
+\end{matching}
+
+\begin{matching}[shuffle=false]{Matching}
+Question text
+\item A \answer 1
+\item B \answer 2
+\item C \answer 3
+\item \answer 4
+\end{matching}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_mathenv.tex b/Master/texmf-dist/doc/latex/moodle/test/test_mathenv.tex
new file mode 100644
index 00000000000..41e024ca375
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_mathenv.tex
@@ -0,0 +1,39 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+\begin{quiz}{Example Quiz}
+\begin{multi}{Multiple Choice}
+\[\begin{array}{c}\$1\\2\end{array}\]
+
+$$\begin{array}{c}\$1\\2\end{array}$$
+
+\(\begin{array}{c}\$1\\2\end{array}\)
+\item[fraction=100]* $\$\sqrt{25}$
+\item 6
+\item[fraction=30,feedback={\[\$\sqrt{25}\]}]* 7
+\item[fraction=10] 8
+\end{multi}
+\begin{cloze}{Cloze}
+\begin{multi}[vertical ]
+\[\begin{array}{c}\$1\\2\end{array}\]
+
+$$\begin{array}{c}\$1\\2\end{array}$$
+
+\(\begin{array}{c}\$1\\2\end{array}\)
+\item[fraction=100]* $\$\sqrt{25}$
+\item 6
+\item[fraction=30,feedback={\[\$\sqrt{25}\]}]* 7
+\item[fraction=10] 8
+\end{multi}
+\end{cloze}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_minted.tex b/Master/texmf-dist/doc/latex/moodle/test/test_minted.tex
new file mode 100644
index 00000000000..cc9458eb0ce
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_minted.tex
@@ -0,0 +1,128 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{minted}
+\usemintedstyle{tango}
+%\RecustomVerbatimEnvironment{Verbatim}{LVerbatim}{}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the \textsf{minted} package.
+
+The only command supported is
+\texttt{inputminted[<options>]\{<lang>\}\{<filename>\}}.
+
+\begin{quiz}{Minted}
+
+\setminted{numbersep=3ex,tabsize=4,numberblanklines=false,autogobble=true}
+
+\begin{VerbatimOut}{_minted-test_minted/test.tex}
+ % !TeX encoding = UTF-8
+ % !TeX spellcheck = en_US
+ % !TEX TS-program = xelatex
+
+ \documentclass{article}
+ \usepackage[nostamp]{moodle}
+ \newif\iffvextra
+ \fvextratrue
+ \ifxetex % FOR XELATEX
+ \usepackage{fontspec}
+ \else %% FOR PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+ \fi
+\end{VerbatimOut}
+\setminted[latex]{firstline=3,firstnumber=2,lastline=9,numbers=both,style=xcode}
+
+\begin{VerbatimOut}{_minted-test_minted/test.py}
+n = int(input('Type a number, and its factorial will be printed: '))
+
+if n < 0:
+ raise ValueError('non negative integer expected')
+
+fact = 1
+
+for i in range(2, n + 1):
+ fact *= i
+
+print(fact)
+\end{VerbatimOut}
+\setminted[python]{firstline=3,firstnumber=2,lastline=9,numbers=both,style=xcode}
+
+\begin{VerbatimOut}{_minted-test_minted/test.c}
+long some_function();
+/* int */ other_function();
+
+/* int */ calling_function()
+{
+ long test1;
+ register /* int */ test2;
+
+ test1 = some_function();
+ if (test1 > 0)
+ test2 = 0;
+ else
+ test2 = other_function();
+ return test2;
+}
+\end{VerbatimOut}
+\setminted[c]{style=tango,numberblanklines=true,highlightlines={2,4,7}}
+
+\begin{VerbatimOut}{_minted-test_minted/test.pl}
+#!/usr/bin/XXXX
+use strict;
+use warnings;
+use IO::Handle;
+
+my ( $remaining, $tot );
+
+$remaining = $tot = shift(@ARGV);
+
+STDOUT->autoflush(1);
+
+while ( $remaining ) {
+ printf ( "Remaining %s/%s \r", $remaining--, $tot );
+ sleep 1;
+}
+
+print "\n";
+\end{VerbatimOut}
+\setminted[perl]{firstline=1,firstnumber=1,lastline=19,numbers=left}
+
+\begin{numerical}[tolerance=0]{LaTeX Classes}
+In the following \LaTeX\ code excerpt, on which line is the class loaded?
+\inputminted{latex}{_minted-test_minted/test.tex}
+\item[feedback={yes!
+\inputminted[highlightlines={3}]{latex}{_minted-test_minted/test.tex}},fraction=100]
+ 4
+\item[feedback={No. On line 3, there is only a comment.},fraction=0] 3
+\item[feedback={No. On line 5, the package \texttt{moodle} is
+loaded.},fraction=0] 5
+\end{numerical}
+
+% To avoid collision of line and item numbers in PDF, force `left-right' mode:
+\RecustomVerbatimEnvironment{Verbatim}{LVerbatim}{frame=lines,
+ label={[Beginning of code]End of code},framesep=3mm,numbersep=9pt}%
+\begin{multi}{Languages}
+Select the code written in the Python language.
+\item[feedback={Indeed, this is Python code.}]*
+\inputminted[highlightlines={2,4-5},numbers=both]{python}{_minted-test_minted/test.py}
+\item[feedback={No. This is Perl code.}]
+\inputminted[highlightlines={2,4-5},numbers=right,style=colorful]{perl}{_minted-test_minted/test.pl}
+\item[feedback={No. This is C code.}]
+\inputminted[numbers=left]{c}{_minted-test_minted/test.c}
+\end{multi}
+
+
+\end{quiz}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_multi.tex b/Master/texmf-dist/doc/latex/moodle/test/test_multi.tex
new file mode 100644
index 00000000000..4d18254759a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_multi.tex
@@ -0,0 +1,55 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\def\myequation{$(1+\sqrt{5})/2$}
+\htmlregister{\myequation}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of multi answers questions. The
+following options are tested
+\begin{itemize}
+ \item Single or multiple correct answer
+ \item Shuffling or no shuffling
+\end{itemize}
+
+\begin{quiz}{Example Quiz}
+
+\begin{multi}{Multiple Choice}
+Text
+\item* A
+\item B
+\item C
+\end{multi}
+
+\begin{multi}[multiple,feedback={abc\\def $\sqrt{2}$}]{Multiple Choice}
+Select the following numbers that are prime.
+\item[fraction=70] $\sqrt{25}$
+\item[fraction=-10] \textbf{68}
+\item[fraction=30,feedback={$\sqrt{25}$}] 7
+\item[fraction=-70] 8
+\item \texttt{nothing}
+\end{multi}
+
+\begin{multi}[shuffle,feedback={abc\\def $\sqrt{2}$}]{Multiple Choice}
+Select the following numbers that are prime.
+\item* $\sqrt{25}$
+\item[fraction=-30] 6
+\item[fraction=-30,feedback={$\sqrt{25}$}] 9
+\item[fraction=-70] \begin{enumerate}
+\item False
+\item Wrong
+\end{enumerate}
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_multiple_categories.tex b/Master/texmf-dist/doc/latex/moodle/test/test_multiple_categories.tex
new file mode 100644
index 00000000000..5d61226a124
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_multiple_categories.tex
@@ -0,0 +1,27 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = xelatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifxetex % FOR XELATEX
+ \usepackage{fontspec}
+\else %% FOR PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\fi
+\begin{document}
+\begin{quiz}{Category 1}
+\begin{multi}{Q1}
+Text 1
+\item* A
+\item B
+\end{multi}
+\end{quiz}
+\begin{quiz}{Category 2}
+\begin{multi}{Q2}
+Text 2
+\item* C
+\item D
+\end{multi}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_penalty.tex b/Master/texmf-dist/doc/latex/moodle/test/test_penalty.tex
new file mode 100644
index 00000000000..03540712905
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_penalty.tex
@@ -0,0 +1,21 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+\begin{quiz}{Example}
+\begin{multi}[feedback={abc: def}]{Multiple Choice}
+abc: def
+\item[fraction=100]* abc: def
+\item 6
+\end{multi}
+
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_point_points.tex b/Master/texmf-dist/doc/latex/moodle/test/test_point_points.tex
new file mode 100644
index 00000000000..20e4dd95967
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_point_points.tex
@@ -0,0 +1,27 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+\begin{quiz}{Ifnum}
+\begin{multi}{MWE}
+\item* A
+\item B
+\end{multi}
+\begin{multi}[points=.5]{MWE}
+\item* A
+\item B
+\end{multi}
+\begin{multi}[points=3.2]{MWE}
+\item* A
+\item B
+\end{multi}
+\end{quiz}
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_special_characters.tex b/Master/texmf-dist/doc/latex/moodle/test/test_special_characters.tex
new file mode 100644
index 00000000000..557c0642c36
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_special_characters.tex
@@ -0,0 +1,88 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{libertine} % includes the "großes Eszett" ß
+
+\def\UTFdiacriticLC{å à â ã é è ë ê î ï ñ õ ô ö ù ü û ç }
+\def\UTFdiacriticUC{Å À Â Ã É È Ë Ê Î à Ñ Õ Ô Ö Ù Ü Û Ç }
+\def\UTFligaturesLC{}
+\def\UTFligaturesUC{}
+\def\UTFotherLC{}
+\def\UTFotherUC{}
+\def\UFTextend{
+ \newcommand\addtomacro[2]{\expandafter\def\expandafter##1\expandafter{##1##2}}%
+ \addtomacro{\UTFdiacriticLC}{ÅŸ Å£ Å‘ ű ÿ ă Ä• ÄŸ Ä­ Å Å­ Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž }%
+ \addtomacro{\UTFdiacriticUC}{Ş Ţ ŠŰ Ÿ Ă Ĕ Ğ Ĭ Ŏ Ŭ Č Ď Ě Ľ Ň Ř Š Ť Ž }%
+ \addtomacro{\UTFligaturesLC}{œ æ ß }%
+ \addtomacro{\UTFligaturesUC}{Œ Æ ẞ }%
+ \addtomacro{\UTFotherLC}{« ø ł » ¿ ¡ }%
+ \addtomacro{\UTFotherUC}{Ø Š}%
+}
+\ifTUTeX % xetex and luatex compile fine the following in the XML
+ \UFTextend
+\fi
+\def\LaTeXdiacriticLC
+{\aa\ \`a \^a \~a \'e \`e \"e \^e \^i \"i \~n \~o \"o \^o \`u \"u \^u \c{c}
+\c{s} \c{t} \H{o} \H{u} \"y \u{a} \u{e} \u{g} \u{i} \u{\i} \u{o} \u{u} \v{c}
+\v{d} \v{e} \v{l} \v{n} \v{r} \v{s} \v{t} \v{z} }
+\def\LaTeXdiacriticUC
+{\AA\ \`A \^A \~A \'E \`E \"E \^E \^I \"I \~N \~O \"O \^O \`U \"U \^U \c{C}
+\c{S} \c{T} \H{O} \H{U} \"Y \u{A} \u{E} \u{G} \u{I} \u{O} \u{U} \v{C} \v{D}
+\v{E} \v{L} \v{N} \v{R} \v{S} \v{T} \v{Z} }
+\def\LaTeXligaturesLC{\oe\ \ae\ \ss\ }
+\def\LaTeXligaturesUC{\OE\ \AE\ \SS\ }
+\def\LaTeXotherLC{\guillemotleft\ \o\ \l\ \guillemotright\ \textquestiondown\ %
+\textexclamdown\ }
+\def\LaTeXotherUC{\O\ \L\ }
+
+\htmlregister{\UTFdiacriticLC}
+\htmlregister{\UTFdiacriticUC}
+\htmlregister{\LaTeXdiacriticLC}
+\htmlregister{\LaTeXdiacriticUC}
+\htmlregister{\UTFligaturesLC}
+\htmlregister{\UTFligaturesUC}
+\htmlregister{\LaTeXligaturesLC}
+\htmlregister{\LaTeXligaturesUC}
+\htmlregister{\UTFotherLC}
+\htmlregister{\UTFotherUC}
+\htmlregister{\LaTeXotherLC}
+\htmlregister{\LaTeXotherUC}
+
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of diacritical marks (accents)
+and ligatures found in different languages written with the latin alphabet.
+
+For most of them, two ways of encoding are tested: UTF8 et \LaTeX{} syntax.
+
+\begin{quiz}[points=1]{Diacritical marks and ligatures}
+
+\begin{multi}{\UTFdiacriticUC}
+\UTFdiacriticLC\\
+\UTFdiacriticUC\\
+\UTFligaturesLC \UTFligaturesUC \UTFotherUC \UTFotherLC
+\item[feedback={\UTFdiacriticUC}] \UTFdiacriticLC
+\item[feedback={\UTFdiacriticLC}]* \UTFdiacriticUC
+\end{multi}
+
+\begin{multi}{\LaTeXdiacriticUC}
+\LaTeXdiacriticLC\\
+\LaTeXdiacriticUC\\
+\LaTeXligaturesLC \LaTeXligaturesUC \LaTeXotherUC \LaTeXotherLC
+\item[feedback={\LaTeXdiacriticUC}] \LaTeXdiacriticLC
+\item[feedback={\LaTeXdiacriticLC}]* \LaTeXdiacriticUC
+\end{multi}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_tags.tex b/Master/texmf-dist/doc/latex/moodle/test/test_tags.tex
new file mode 100644
index 00000000000..870827431e1
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_tags.tex
@@ -0,0 +1,100 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage[french]{babel} % for french quotes
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of tags (i.e. keywords). The
+definition of multiple tags per question is currently unsupported.
+
+\begin{quiz}[points=1,tags={quizz-level}]{Moodle Tags}
+
+ \begin{multi}[tags={multiéàî}]{Title}
+ %\og abc\fg%\ae%\oe%
+ \AA
+ \item[feedback={tic}] \ae
+ \item[feedback={tac}]* \oe
+ \end{multi}
+
+ \begin{shortanswer}[]{Title}
+ % %\og abc\fg%\ae%\oe
+ \AA
+ \item[feedback={toc}] B
+ \item[feedback={\og\fg}] C
+ \item[fraction=0] *
+ \end{shortanswer}
+
+ \begin{numerical}[tags={}]{Title}
+ % %\og abc\fg%\ae%\oe
+ \AA
+ \item[feedback={toc}] 1
+ \item[feedback={\og\fg}] 2
+ \item[fraction=0] 3
+ \end{numerical}
+
+ \begin{matching}[tags={m\aa tch\"ing}]{Title}
+ %\og abc\fg%\ae%\oe%
+ \AA
+ \item \ae \answer oui
+ \item \oe \answer non
+ \item \answer \AA
+ \end{matching}
+
+ \begin{essay}[tags={essay}]{Title}
+ %\og abc\fg%\ae%\oe%
+ \AA
+ \item \ae yo
+ \item \oe
+ \end{essay}
+
+ \begin{cloze}[tags={cloze}]{Cloze}
+ \AA
+ \begin{multi}[shuffle=false]
+ \OE
+ \item[]* chip
+ \item[feedback={yes},fraction=10] chop
+ \item[feedback={no.}] chap
+ \end{multi}
+ \fg
+ \begin{shortanswer}
+ \AA
+ \item[feedback={toc}] B
+ \item[feedback={\og\fg}] C
+ \item[fraction=0] *
+ \end{shortanswer}
+ \og
+ \begin{numerical}
+ \AA
+ \item[] 1
+ \item[feedback={\og\fg}] 2
+ \item[fraction=0] 3
+ \end{numerical}
+ \begin{multi}[shuffle=false,vertical]
+ \OE
+ \item[feedback={yes}]* chip
+ \item[fraction=10] chop
+ \item[feedback={no.}] chap
+ \end{multi}
+
+ \begin{multi}[shuffle=false,horizontal]
+ \OE
+ \item[feedback={yes}]* chip
+ \item[fraction=10] chop
+ \item[feedback={no.}] chap
+ \end{multi}
+
+ \end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_tikz.tex b/Master/texmf-dist/doc/latex/moodle/test/test_tikz.tex
new file mode 100644
index 00000000000..0cc9acdd906
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_tikz.tex
@@ -0,0 +1,68 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp,tikz]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of picture
+inclusion using Ti\emph{k}Z.
+
+\begin{quiz}{TikZ}
+
+\begin{multi}{Multi}
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}]* \embedaspict{3}
+\item[feedback={\embedaspict{4}}] \embedaspict{5}
+\end{multi}
+
+\begin{matching}[dd]{Matching}
+\embedaspict{1}
+\item \embedaspict{2} \answer \embedaspict{3}
+\item \embedaspict{4} \answer \embedaspict{5}
+\item \embedaspict{3} \answer \embedaspict{2}
+\end{matching}
+
+\begin{shortanswer}{Short}
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}] 3
+\item[feedback={\embedaspict{4}}] 5
+\end{shortanswer}
+
+\begin{numerical}{Numerical}
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}] 3
+\item[feedback={\embedaspict{4}}] 5
+\end{numerical}
+
+\begin{cloze}{Cloze}
+\begin{multi}[horizontal]
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}]* \embedaspict{3}
+\item[feedback={\embedaspict{4}}] \embedaspict{5}
+\end{multi}
+
+\begin{shortanswer}
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}] 3
+\item[feedback={\embedaspict{4}}] 5
+\end{shortanswer}
+
+\begin{numerical}
+\embedaspict{1}
+\item[feedback={\embedaspict{2}}] 3
+\item[feedback={\embedaspict{4}}] 5
+\end{numerical}
+\end{cloze}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_tikz_with_svg.tex b/Master/texmf-dist/doc/latex/moodle/test/test_tikz_with_svg.tex
new file mode 100644
index 00000000000..8744595775f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_tikz_with_svg.tex
@@ -0,0 +1,5 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\PassOptionsToPackage{svg}{moodle}
+\input{test_tikz.tex} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_tolerance.tex b/Master/texmf-dist/doc/latex/moodle/test/test_tolerance.tex
new file mode 100644
index 00000000000..89a8265e22f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_tolerance.tex
@@ -0,0 +1,56 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{siunitx}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of the tolerance key for
+numerical questions.
+
+\begin{quiz}[tolerance=0]{Tolerance}
+\begin{numerical}[tolerance=2]{Num 1}
+Give a number
+\item[tolerance=4] 1
+\item 0
+\item[fraction=0,feedback={nope}] *
+\end{numerical}
+\begin{numerical}{Num 2}
+Give a number
+\item[tolerance={1,65e-4}] 1,45E-3
+\item 0
+\item[fraction=0,feedback={nope}] *
+\end{numerical}
+\begin{cloze}[tolerance=2]{ClozeNum 1}
+\begin{numerical}[tolerance=3]
+Give a number
+\item[tolerance=4] 1
+\item 0
+\item[fraction=0,feedback={nope}] *
+\end{numerical}
+\begin{numerical}
+Give a number
+\item[tolerance=4] 1
+\item 0
+\item[fraction=0,feedback={nope}] *
+\end{numerical}
+\end{cloze}
+\begin{cloze}{ClozeNum 2}
+\begin{numerical}
+Give a number
+\item[tolerance={1,65E-4}] 1,45e-3
+\item 0
+\item[fraction=0,feedback={nope}] *
+\end{numerical}
+\end{cloze}
+\end{quiz}
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_truefalse.tex b/Master/texmf-dist/doc/latex/moodle/test/test_truefalse.tex
new file mode 100644
index 00000000000..29ddd6d26f2
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_truefalse.tex
@@ -0,0 +1,51 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of truefalse questions.
+
+The penalty keyword is overridden.
+
+\begin{quiz}[points=3]{Truefalse questions}
+
+\begin{truefalse}[feedback={general feedback},penalty=3]{Truefalse Test 1}
+This is a matching question.
+\item[feedback={Feedback for students choosing "true"}] this is discarded
+because the feedback key is defined
+\item[]* Feedback for students choosing "false"
+\item* Extra items are ignored
+\end{truefalse}
+
+\begin{truefalse}[feedback={general feedback}]{Truefalse Test 2}
+This is an essay question.
+\item Feedback for students choosing "true"
+\item[feedback={Feedback for students choosing "false"}]*
+\end{truefalse}
+
+\begin{truefalse}[feedback={general feedback}]{Truefalse Test 3}
+Please answer "True".
+\item*
+%\item % if the correct answer is "true", the second item is optional
+\end{truefalse}
+
+\begin{truefalse}[feedback={general feedback}]{Truefalse Test 4}
+Please answer "False".
+\item % if the correct answer is "false", the first item is mandatory, even
+%when it is not given any feedback
+\item*
+\end{truefalse}
+
+\end{quiz}
+
+\end{document}
diff --git a/Master/texmf-dist/doc/latex/moodle/test/test_verbatim.tex b/Master/texmf-dist/doc/latex/moodle/test/test_verbatim.tex
new file mode 100644
index 00000000000..3ac05359d97
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/test_verbatim.tex
@@ -0,0 +1,48 @@
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = lualatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\ifPDFTeX % FOR LATEX and PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\else % assuming XELATEX or LUALATEX
+ \usepackage{fontspec}
+\fi
+\usepackage{verbatim}
+\begin{document}
+
+\section*{Introduction}
+
+This document is intended to check the support of verbatim environment.
+
+Outside of the scope of moodle questions, \texttt{filecontents} environments
+can be set to define portions of code.
+
+\begin{quiz}{Verbatim}
+
+\begin{filecontents*}[overwrite]{test.log}
+% !TeX encoding = UTF-8
+% !TeX spellcheck = en_US
+% !TEX TS-program = xelatex
+\documentclass{article}
+\usepackage[nostamp]{moodle}
+\newif\iffvextra
+\fvextratrue
+\ifxetex % FOR XELATEX
+ \usepackage{fontspec}
+\else %% FOR PDFLATEX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+\fi
+\end{filecontents*}
+
+\begin{multi}{Multi}
+\verbatiminput{test.log}
+\item[feedback={}]* test
+\item[feedback={}] toast
+\end{multi}
+
+\end{quiz}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_autopoints-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_autopoints-moodle.ref
new file mode 100644
index 00000000000..5d8f4bd6f74
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_autopoints-moodle.ref
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[All correct]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>100\% is distributed uniformly. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Auto sanction]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Without the star, an error shall be issued because correct answers should sum up to 100\%. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[All correct but sum \(\geq 100\)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A warning shall be issued because correct answers must sum up to 100\%. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="20" format="html">
+ <text><![CDATA[<p>2</p>]]></text>
+ </answer>
+ <answer fraction="40" format="html">
+ <text><![CDATA[<p>5</p>]]></text>
+ </answer>
+ <answer fraction="40" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>1</p>]]></text>
+ </answer>
+ <answer fraction="-25" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="-25" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_lua-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_lua-moodle.ref
new file mode 100644
index 00000000000..ac0d1123b74
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_lua-moodle.ref
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (3, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(3 + 2 =\){1:NUMERICAL:=5:0}\(3 - 2 =\){1:NUMERICAL:=1:0}\(3 * 2 =\){1:NUMERICAL:=6:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 2 =\){1:NUMERICAL:=6:0}\(4 - 2 =\){1:NUMERICAL:=2:0}\(4 * 2 =\){1:NUMERICAL:=8:0}\(4 : 2 =\){1:NUMERICAL:=2:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>4</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 3)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 3 =\){1:NUMERICAL:=7:0}\(4 - 3 =\){1:NUMERICAL:=1:0}\(4 * 3 =\){1:NUMERICAL:=12:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_python-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_python-moodle.ref
new file mode 100644
index 00000000000..ac0d1123b74
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_calculated_python-moodle.ref
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (3, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(3 + 2 =\){1:NUMERICAL:=5:0}\(3 - 2 =\){1:NUMERICAL:=1:0}\(3 * 2 =\){1:NUMERICAL:=6:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 2)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 2 =\){1:NUMERICAL:=6:0}\(4 - 2 =\){1:NUMERICAL:=2:0}\(4 * 2 =\){1:NUMERICAL:=8:0}\(4 : 2 =\){1:NUMERICAL:=2:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>4</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Arithmetic Quiz (4, 3)]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Solve the following tasks!<BR/> \(4 + 3 =\){1:NUMERICAL:=7:0}\(4 - 3 =\){1:NUMERICAL:=1:0}\(4 * 3 =\){1:NUMERICAL:=12:0}</p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[calculated]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_categories-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_categories-moodle.ref
new file mode 100644
index 00000000000..6adc98edf30
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_categories-moodle.ref
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples</text>
+ </category>
+</question>
+
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples/Generic</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Examples/Very Specific</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Other Category</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Other Category/Other Subcategory</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>One </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_circuitikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_circuitikz-moodle.ref
new file mode 100644
index 00000000000..9b0e6e6f69e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_circuitikz-moodle.ref
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Circuitikz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>toast</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+"></p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_multi-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_multi-moodle.ref
new file mode 100644
index 00000000000..3cfe0c1f3f7
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_multi-moodle.ref
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Cloze Multi</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Regular, single, no shuffle {1:MULTICHOICE:=chip#yes~%10%<I>chop</I>~%-30%<B>chap</B>#no.}</P><P>Vertical, single, no shuffle {1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>Horizontal, single, no shuffle {1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P>Regular, single, shuffle {1:MULTICHOICE_S:=chip~chop#yes~chap#no.}</P><P>Vertical, single, shuffle {1:MULTICHOICE_VS:=chip#yes~%10%chop~chap#no.}</P><P>Horizontal, single, shuffle {1:MULTICHOICE_HS:=chip#yes~chop~chap#no.}</P><P>Regular, multiple, no shuffle {1:MULTIRESPONSE:=chip~=chop#yes~chap#no.}</P><P></P><P>Horizontal, multiple, no shuffle {1:MULTIRESPONSE_H:=chip#yes~=chop~chap#no.}</P><P>Regular, multiple, shuffle {1:MULTIRESPONSE_S:=chip~=chop#yes~chap#no.}Horizontal, multiple, shuffle {1:MULTIRESPONSE_HS:=chip#yes~=chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_numerical-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_numerical-moodle.ref
new file mode 100644
index 00000000000..7e05e9ef63e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_numerical-moodle.ref
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Close Short Answer</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Enter an integer \(n\) such that \(0&lt; n\leq 2\). {1:NUMERICAL:%10%0:0.001#study difference between \(&lt;\) and \(\leq \)~=1:0.01#good!~=2:0.1#OK}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_shortanswer-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_shortanswer-moodle.ref
new file mode 100644
index 00000000000..97fd0bf6f63
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_cloze_shortanswer-moodle.ref
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Close Short Answer</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Who? {1:SHORTANSWER_C:=chip~%10%chop#yes~%-30%chap#no.}what? {1:SHORTANSWER:=chip~%10%chop#yes~%-30%chap#no.}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_commands-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_commands-moodle.ref
new file mode 100644
index 00000000000..3183131dfe7
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_commands-moodle.ref
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Commands</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Commands]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Find the answer with small capitals </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><EM>emphasis</EM></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><B>bold</B></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><I>italic</I></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><CODE>typewriter</CODE></p>]]></text>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><SPAN STYLE=&#34;font-variant: small-caps;&#34;>Small Capitals</SPAN></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><SPAN STYLE=&#34;text-decoration: underline;&#34;>underlined</SPAN></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>M<SUP>me</SUP></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>H<SUB>2</SUB>O</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><A href=&#34;http://192.0.0.256&#34;>http://192.0.0.256</A></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><A href=&#34;mailto:name@server.com&#34;>Contact me</A></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_description-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_description-moodle.ref
new file mode 100644
index 00000000000..5ac3ffd8cb8
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_description-moodle.ref
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="description">
+ <name format="html">
+ <text><![CDATA[Requirements]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is a description. Not really a question. We can include environments and math. <UL><LI>This</LI><LI>That</LI></UL> \[\mathrm {e}^{2\mathrm {i}\pi }+1=0.\]</p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>here is a feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[descr]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_environments-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_environments-moodle.ref
new file mode 100644
index 00000000000..5eee6a48e41
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_environments-moodle.ref
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Environments</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Environments]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><CENTER><SPAN STYLE=&#34;font-variant: small-caps;&#34;>This is a question</SPAN></CENTER> Select the numbered list </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><OL><LI>C</LI><LI>D <UL><LI>S</LI><LI>T</LI><LI>U</LI></UL></LI></OL></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>yes</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><UL><LI>E <OL><LI>X</LI><LI>Y</LI><LI>Z</LI></OL></LI><LI>F</LI></UL></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Example of numbered list:<BR/><OL><LI>first item</LI><LI>second item</LI></OL></p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_escaping_right_braces_in_cloze-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_escaping_right_braces_in_cloze-moodle.ref
new file mode 100644
index 00000000000..2d6f9d99d6a
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_escaping_right_braces_in_cloze-moodle.ref
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Cloze: Escaping Characters</text>
+ </category>
+</question>
+
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>No escaping here: \(y=a\sqrt {x}/2+{b}\) </P><P>No escaping here: <CODE>text</CODE> \(y=a\sqrt {x}/2+{b}\) {4:MULTICHOICE_V:=\(\lbrace A\rbrace \)~{B\}}</P><P>{No escaping here: } \(y=a\sqrt {x}/2+{b}\) {1:SHORTANSWER:=chip#nip~%10%nop#that must be escaped: \(y=a\sqrt {x\}/2+{b\}\)}</P><P>{No escaping here: } \(y=a\sqrt {x}/2+{b}\) {1:NUMERICAL:=0:0#nip~%10%1:0#that must be escaped: \(y=a\sqrt {x\}/2+{b\}\)}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>2</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_essay-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_essay-moodle.ref
new file mode 100644
index 00000000000..2caadf5297f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_essay-moodle.ref
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Essay Test</text>
+ </category>
+</question>
+
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>A </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>feedback for essay</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>B </li>
+ <li>C</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html">
+ <text><![CDATA[Type you answer here]]></text>
+ </responsetemplate>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_expandnewcommands-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_expandnewcommands-moodle.ref
new file mode 100644
index 00000000000..6c8bfc0b299
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_expandnewcommands-moodle.ref
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Recording New Commands for Expansion</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Sets]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Standard notation for the set of natural integers: </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\mathbb {N}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {Z}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {Q}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {C}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {R}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\mathbb {V}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\vphantom {K}^\dagger \mathbb {K}^*_2\)</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fancyvrb-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fancyvrb-moodle.ref
new file mode 100644
index 00000000000..bbf11123d41
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fancyvrb-moodle.ref
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Fancy Verbatim</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Pick up the code decorated with line numbering on both sides. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark>% !TEX TS-program = xelatex</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><mark>\documentclass{article}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark>\usepackage[nostamp]{moodle}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark>\newif\iffvextra</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. Here, line numbers lie on the left side.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE>% !TEX TS-program = xelatex<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/><mark>\documentclass{article}</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">8</span><BR/>\usepackage[nostamp]{moodle}<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">9</span><BR/>\newif\iffvextra<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">10</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. Here, line numbers lie on the right side.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark>\ifxetex % FOR XELATEX</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark> \usepackage{fontspec}</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span>\else %% FOR PDFLATEX<BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span> \usepackage[utf8]{inputenc} % necessary<BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">8</span><mark> \usepackage[T1]{fontenc} % necessary</mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">9</span>\fi<BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>yes!</p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fractions-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fractions-moodle.ref
new file mode 100644
index 00000000000..36bf5b62d91
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_fractions-moodle.ref
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="83.33333" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-66.66667" format="html">
+ <text><![CDATA[<p><B>68</B></p>]]></text>
+ </answer>
+ <answer fraction="16.66667" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="33.33333" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><CODE>nothing</CODE></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_french-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_french-moodle.ref
new file mode 100644
index 00000000000..61895de7164
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_french-moodle.ref
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/French Issues</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Test french]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p> <SPAN STYLE=&#34;text-decoration: underline;&#34;>Pangramme</SPAN> conçu par Gilles <SPAN STYLE=&#34;font-variant: small-caps;&#34;>Esposito-Farèse</SPAN>:</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>1<SUP>er</SUP>, M<SUP>me</SUP>, N<SUP>o</SUP><BR/> 1<SUP>er</SUP>, M<SUP>me</SUP>, N<SUP>o</SUP><BR/> H<SUB>2</SUB>O</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d’exquis rôtis de bœuf au kir à l’aÿ d’âge mûr & cætera&#8239;!</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>cité dans &laquo;&#8239;<A href=&#34;https://jacques-andre.fr/faqtypo/lessons.pdf&#34;>Petites leçons de typographie</A>&#8239;&raquo; de Jacques <SPAN STYLE=&#34;font-variant: small-caps;&#34;>André</SPAN>.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>Portez ce vieux whisky au juge blond qui fume.</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_generalfeedback-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_generalfeedback-moodle.ref
new file mode 100644
index 00000000000..b4ded056bc5
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_generalfeedback-moodle.ref
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/General Feedback Test</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>multi</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tic</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tac</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>shortanswer</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>B</text>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>C</text>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>numerical</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>2</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>matching</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <answer><text>oui</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <answer><text>non</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>Ã…</text></answer>
+ </subquestion>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>essay</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>&aelig;yo </li>
+ <li>&oelig;</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;&OElig;{1:MULTICHOICE:=chip~%10%chop#yes~chap#no.}&#8239;&raquo;&Aring;{1:SHORTANSWER:=B#toc~=C#&laquo;&#8239;&#8239;&raquo;~*}&laquo;&#8239;&Aring;{1:NUMERICAL:=1:0~=2:0#&laquo;&#8239;&#8239;&raquo;~3:0}&OElig;{1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>&OElig;{1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>54</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_handout-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_handout-moodle.ref
new file mode 100644
index 00000000000..f6bf07339ce
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_handout-moodle.ref
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/ Option Handout</text>
+ </category>
+</question>
+
+<question type="description">
+ <name format="html">
+ <text><![CDATA[Description]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Description text</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Essay]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>A </li>
+ <li>B </li>
+ <li>C</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi Single]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>0</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="10" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>CCC</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi Multiple]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <answer fraction="50" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>CCC</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-50" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>DDD</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>AAA</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p>BBB</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>false</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[True/False 3]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>1</tolerance>
+ <feedback format="html"><text><![CDATA[<p>1</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>1</tolerance>
+ <feedback format="html"><text><![CDATA[<p>3</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short Answer]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>aaa</text>
+ <feedback format="html"><text><![CDATA[<p>1</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>bbb</text>
+ <feedback format="html"><text><![CDATA[<p>3</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>1</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>2</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>3</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer format="html"><text><![CDATA[<p>4</p>]]></text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>0</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer><text>1</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer><text>2</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer><text>3</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>4</text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p></P><P>Question text {1:MULTICHOICE_H:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_V:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_HS:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_VS:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:MULTICHOICE_S:=A#AAA~%10%B#BBB~C#CCC}</P><P>Question text {1:NUMERICAL:=1:1#1~3:1#3}</P><P>Question text {1:SHORTANSWER:=aaa#1~bbb#3}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>General feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[tag]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics-moodle.ref
new file mode 100644
index 00000000000..98b830dce2f
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics-moodle.ref
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG width=81 SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABhSURB
+VCiR7dIxDkVgFEThj6jsxhp0Wlt6jY1o1NbBAlQKveLVNH8EIdFpTHKamzNTXSjxQ4sJS6BwynLD
+QUxQo0cXGJGe167yv1qMnzQ/8QUxQoV8d8vCwIB5LzfuP2hjBTnvHcSzvuJGAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAQCAYAAAAvf+5AAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABhSURB
+VCiR7dIxDkVgFEThj6jsxhp0Wlt6jY1o1NbBAlQKveLVNH8EIdFpTHKamzNTXSjxQ4sJS6BwynLD
+QUxQo0cXGJGe167yv1qMnzQ/8QUxQoV8d8vCwIB5LzfuP2hjBTnvHcSzvuJGAAAAAElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,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
+4/8BfX6FOOHA2dwAAAAASUVORK5CYII=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz-moodle.ref
new file mode 100644
index 00000000000..1b60f6ee535
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz-moodle.ref
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics with TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAqCAMAAAAwLX3tAAAAM1BMVEUAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjBUbJAAAAEHRSTlMAE0RKU3WEiaWr
+tczb5vX9QmfMGwAAAFlJREFUSMft08kRgDAMBEGBOSwuK/9o2U2AKss/oQmgfyPi70RmJkkkkcQ3
+UfxdKBRhw8Ujnv4aCkXciMTEfJuFIQ5EYmZJjBIbIrGynxMLIlFZH7EjVQ1DvOOONZP3s13WAAAA
+AElFTkSuQmCC
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOCAYAAAD9lDaoAAAAcUlEQVQokcWPMRWAMAxEf0FBLWCh
+FrpiAy1FE0gACa0EkABDj0eXlpGbknc/yaXn1QBMwKg+FR4OWIALOICoOsoDIAhyxaDXwMaHgja6
+rgGdT9GCBoF7DfA6FWqAJQeuhi4B+xNgZDpgruRMhvxqS+sNlq0d/BTebEoAAAAASUVORK5CYII=
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAjAQMAAABFDwNYAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAADdJREFUCNdj+P+/gYGB/QEEM/6A4n9Q/AOBoWr4gcJgDNTHj00vQwUqRjHjHxj/
+//8AgoFcJAwAXTsqcaGGnVkAAAAASUVORK5CYII=
+"></p>]]></text>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAbCAYAAACa9mScAAAAdklEQVQ4jWNkYGAIZoAAQyhmQKIl
+GRDAG0pvY0ADTOgC5AAWBgaGNdQwZBmUfYGBgeE8lA2jHzEwMHARMoRq3omm1BCquGTUkFFDRg0Z
+NWRQGcLIwMDQCWU7Y5E3RLLoDpT+iK6IhYGBQQnKNiZgoQouCap4BwCPsgqJWVTJ7gAAAABJRU5E
+rkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAM1BMVEUAAAD///8AAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADW5/q5AAAAEHRSTlMAABEiM0RVZneI
+maq7zN3uf6QJ9gAAAKhJREFUOMu90sESwiAMRVGkVEpb4P7/17pQKJhAZ1yYJe8MyUDM46bMX4Ap
+5dbFyCrAhgSkMAIu8a5oVbBmyOcJcGjAZQjWmOUAvAJiPQ6QJPBQhrMZngIkch3teeEKXNcXzm8Q
+oHmhKMEOzUEgixbb1gHUp/4NLDfA46fAA+sEeGCf3PDJh6DkI1DzAbhyHTS5CtpcBW0+AGH+F93e
+CmBjv9cCGNst7QvN2wpURq09lgAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAjAQMAAABFDwNYAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAADdJREFUCNdj+P+/gYGB/QEEM/6A4n9Q/AOBoWr4gcJgDNTHj00vQwUqRjHjHxj/
+//8AgoFcJAwAXTsqcaGGnVkAAAAASUVORK5CYII=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAMAAAANmfvwAAAA0lBMVEX///8AAAABAQECAgIDAwME
+BAQFBQUJCQkLCwsNDQ0dHR0hISEiIiIoKCguLi41NTVJSUlMTExmZmZubm5zc3N1dXWLi4uQkJCS
+kpKbm5ucnJydnZ2fn5+goKCioqKkpKSlpaWmpqapqamqqqqrq6utra2urq6xsbGzs7O1tbW2tra6
+urq8vLzLy8vMzMzT09Pd3d3h4eHk5OTl5eXm5ubn5+fp6enr6+vs7Ozt7e3w8PDz8/P09PT29vb3
+9/f5+fn6+vr7+/v8/Pz9/f3+/v7/////o5MGAAAAAXRSTlMAQObYZgAAAbNJREFUOMuF1NlS6kAQ
+BuB0SEBlUWQ1BlyIARRZ4yBLwqR7/vd/pXPh2SoE6Mupr6Zrpv5uyzouWJcK2F8W+/OGGdjjXC+w
+1ohxxhyw1lriFNCnxAHrtQinqdb59xgDwBhmBoBJjhA5HCACMPPX12QyyXktcGBRCh/calWrE6Js
+F8znGHNTqcoHter16jVlTGAa83l5TM1mpdKlWb3uXROR/78IqNEol9tEd3fdLmYzzyMi3//3rpsb
+Irq9bbfbn5/f3wDe3n7E3z8kqtVoOt1u2wBgDN7f/4jfZrcjqr1MjdkKRJLEBFnBu8WC3JfAGAiE
+ORkGGbFnLBYbtxQEAJAyj4ZZsQew2axKpX4fiNN0NMoI/NRqtbLt19c4jo+EZSUJRLReRZFtDwbx
+eHwkLCthATRHy6XrDppj26anjLAsBgDGUim32CzatvckyOYOADRipfwiFYueB5GjZIpojTj2fYfo
+/h6A1rm5x3DoOM7VVb+fn24AYVgoOJ2O6/af83OLMCQqPHaiyKXnE+kPHaLeo44iRSdnyHF6PWit
+1JlJfHgAgPN7wRgYc2ErGJjLuyXn7BfJsGNGBciJRQAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAdCAAAAABtMQhgAAABDUlEQVQYGW3Bu2pUURQA0LX3OXPN
+o7GykBRaKggprFSCkEqxERTyF2JnZ6ddWv2A4CcIgl+gFoLBxmIg2KkIFpnJzH2YUjiuFXNX/ePQ
+U6lVB3HNHWm2MOku+a326gMvFHpFnNqSWnXLOhUrMdOzidSqgxwshI3JKAOpVRfGwdoPpXOZwZKT
+E3GuFKUcHHw8O5um1Iq53SeuuOj7B0fKkUdSK04N2wYpV956GL6IXlnpnBulw2deSq06Kh2WNsLk
+7to7qVVnlh06Uxhs8kudzMKoWFfFz3BdatVQRkVP+OM1j6VWfe7eDRdU4zevvNmzK/1XsLOzvy+C
++8fHwxCffP1s7r29m267tW2SWn8B1wBQQBxcN+IAAAAASUVORK5CYII=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAABHAQMAAABCjOfmAAAABlBMVEX///8AAABVwtN+AAAAAXRS
+TlMAQObYZgAAAEVJREFUGNOd0LENwCAMBdHrMjaMlrEoLF0KysQGUr3qyzqj2uEToEXO5b0mCvJd
+flYHOfaMOmWjiPaPMnN+4o1qsGJwzgPXwLGKCxz0xgAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAA2BAMAAAC/7D1CAAAAMFBMVEUAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaPxwLAAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAABBUlEQVQ4y62SMUoDURRFbyKIQQKzAIvUIsQVmCZFUiiW6XQHugSTBTh2diKphICm
+sFMwrsAlKFhaJIiKRjPHYj7j//OETJFbHu7j3X/fF3lNtEh04+sWeFKgNUg2A1J6gOd5pqVHY9qy
+pjHcG9NPtBDTjjEtY0wHBU1Jbh0FXze3J93Be0hWgP0Q7cFnSEpjOA9RBWZhTDXgLSS6MnNloGYi
+fOfmqianGjCRqWqYQzGc2AxHMjUUQPG/aCTT1qvXlCTVYfpHziJJq37N24zc7T8cWYcvl4KuJKkN
+sJueGi6azc4lwDRyt86UHEqSNjzUd5vjjFxn9R+nYNbzntAawMtp+lV+Afb0PN8sFBDMAAAAAElF
+TkSuQmCC
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz_and_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz_and_svg-moodle.ref
new file mode 100644
index 00000000000..89098280db9
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_via_tikz_and_svg-moodle.ref
@@ -0,0 +1,247 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Includegraphics with TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDIuNTEx
+IiBoZWlnaHQ9IjI2LjU2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNDIuNTExIDI2LjU2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQW9BQUFBUUNBQUFBQUFL
+RkxHY0FBQUFBWE5DU1ZRSTVncGJtUUFBQUVCSlJFRlVDSmxqQ0c3Wit1ei9meThHQmdhRy8vLy8v
+NGN3V1paZE9ILytFUmNEREh6OTc4WEF3TUFFNTlPRHlkanB6TUJneUhUbkl3TUR3K3IvTUFBQUdh
+d2R4Rjl4QWJZQUFBQUFTVVZPUks1Q1lJST0iLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0i
+bWF0cml4KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDI2LjU2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNs
+YXRlKDE1Ljk0Miw5Ljk2MykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNS45NDIsLTkuOTYz
+KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzEuODgzKSI+PGcgdHJhbnNmb3JtPSJyb3RhdGUo
+OTApIj48ZyB0cmFuc2Zvcm09InNjYWxlKDIuNDkwOSkiPjxnIHRyYW5zZm9ybT0ic2NhbGUoOCwx
+Mi44KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIxIiBo
+ZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNhKSIg
+cHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFz
+ZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFRQ0FZQUFBQXZmKzVBQUFBQUJITkNT
+VlFJQ0FnSWZBaGtpQUFBQUJwSlJFRlVLSkZqWkdCZytNOUFCR0FpUnRHb3dsR0ZsQ2tFQUxVaUFS
+OUNRa1gyQUFBQUFFbEZUa1N1UW1DQyIvPjwvZz48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2
+Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNS42MzA3
+IiBoZWlnaHQ9IjguNjg5MyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNS42MzA3IDguNjg5
+MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDguNjg5MykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMTEyLDMuMjU5KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIuMTEyLC0zLjI1OSkiPjxnIHRyYW5zZm9ybT0ic2Nh
+bGUoLjUpIj48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEgMCAw
+IC0xIDAgMTMuMDM0KSI+PHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS44Nzg5MSAxMy4wMzQp
+IiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iJ09wZW4gU2FucyciIGZvbnQtc2l6ZT0iMThw
+eCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9n
+PjwvZz48L3N2Zz4K
+"></p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTQuNjY3
+IiBoZWlnaHQ9IjIyLjY2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTQuNjY3IDIyLjY2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDIyLjY2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNSw4LjUp
+Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNS41LC04LjUpIj48ZyB0cmFuc2Zvcm09InNjYWxl
+KDExLDE3KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIx
+IiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNh
+KSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7
+YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFSQ0FZQUFBQUw0VmJiQUFBQUJI
+TkNTVlFJQ0FnSWZBaGtpQUFBQUZoSlJFRlVLSkhGa3NFT3dDQUlROXRsLy8vTDlUSXpneFh4NUxz
+UkNsU0VBSVFFNlU5VFl6UkFjaXA0U2gyL3dxWFlUU3FMSmEzRnp2UHJrbEhVU1czRUJwZFdkK1E1
+Y3ZUQTBwNTdUR3l1RGpDZmtvbTJOaHdOWDdFckdXNWlRWVVBQUFBQVNVVk9SSzVDWUlJPSIvPjwv
+Zz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAuNjY3
+IiBoZWlnaHQ9IjE3LjA2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTAuNjY3IDE3LjA2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQW9BQUFBUUNBQUFBQUFL
+RkxHY0FBQUFBWE5DU1ZRSTVncGJtUUFBQUVCSlJFRlVDSmxqQ0c3Wit1ei9meThHQmdhRy8vLy8v
+NGN3V1paZE9ILytFUmNEREh6OTc4WEF3TUFFNTlPRHlkanB6TUJneUhUbkl3TUR3K3IvTUFBQUdh
+d2R4Rjl4QWJZQUFBQUFTVVZPUks1Q1lJST0iLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0i
+bWF0cml4KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDE3LjA2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNs
+YXRlKDQsNi40KSI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTQsLTYuNCkiPjxnIHRyYW5zZm9y
+bT0ic2NhbGUoOCwxMi44KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSki
+IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFz
+az0idXJsKCNhKSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTpp
+bWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFRQ0FZQUFBQXZm
+KzVBQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUJwSlJFRlVLSkZqWkdCZytNOUFCR0FpUnRHb3ds
+R0ZsQ2tFQUxVaUFSOUNRa1gyQUFBQUFFbEZUa1N1UW1DQyIvPjwvZz48L2c+PC9nPjwvZz48L3N2
+Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjAuMjUy
+IiBoZWlnaHQ9IjIwLjI1MiIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjAuMjUyIDIwLjI1
+MiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDIwLjI1MikiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcuNTk0LDcuNTk0KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcuNTk0LC03LjU5NCkiPjxnIHRyYW5zZm9ybT0idHJh
+bnNsYXRlKDkuMjE2KSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLjcwNzA5IC43MDcwOSAtLjcwNzA5
+IC43MDcwOSAwIDApIj48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxnIHRyYW5zZm9ybT0ibWF0cml4
+KDEgMCAwIC0xIDAgMTMuMDM0KSI+PHRleHQgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLS44Nzg5MSAx
+My4wMzQpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZhbWlseT0iJ09wZW4gU2FucyciIGZvbnQtc2l6
+ZT0iMThweCI+PHRzcGFuIHg9IjAiIHk9IjAiPjI8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48
+L2c+PC9nPjwvZz48L2c+PC9zdmc+Cg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTQuNjY3
+IiBoZWlnaHQ9IjIyLjY2NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTQuNjY3IDIyLjY2
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDIyLjY2NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNSw4LjUp
+Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNS41LC04LjUpIj48ZyB0cmFuc2Zvcm09InNjYWxl
+KDExLDE3KSI+PGltYWdlIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMSkiIHdpZHRoPSIx
+IiBoZWlnaHQ9IjEiIGltYWdlLXJlbmRlcmluZz0ib3B0aW1pemVTcGVlZCIgbWFzaz0idXJsKCNh
+KSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7
+YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBc0FBQUFSQ0FZQUFBQUw0VmJiQUFBQUJI
+TkNTVlFJQ0FnSWZBaGtpQUFBQUZoSlJFRlVLSkhGa3NFT3dDQUlROXRsLy8vTDlUSXpneFh4NUxz
+UkNsU0VBSVFFNlU5VFl6UkFjaXA0U2gyL3dxWFlUU3FMSmEzRnp2UHJrbEhVU1czRUJwZFdkK1E1
+Y3ZUQTBwNTdUR3l1RGpDZmtvbTJOaHdOWDdFckdXNWlRWVVBQUFBQVNVVk9SSzVDWUlJPSIvPjwv
+Zz48L2c+PC9nPjwvZz48L3N2Zz4K
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjEuNTk5
+IiBoZWlnaHQ9IjIxLjU5OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjEuNTk5IDIxLjU5
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGcgdHJhbnNmb3Jt
+PSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMjEuNTk5KSI+PGcgdHJhbnNmb3JtPSJ0cmFu
+c2xhdGUoOC4wOTksOC4wOTkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtOC4wOTksLTEuMTU3
+KSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLjcwNzA5IC0uNzA3MDkgLjcwNzA5IC43MDcwOSAwIDAp
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDkuODE4MiAxMy4wOTEpIj48aW1hZ2UgdHJhbnNmb3JtPSJt
+YXRyaXgoMSwwLDAsLTEsMCwxKSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgaW1hZ2UtcmVuZGVyaW5n
+PSJvcHRpbWl6ZVNwZWVkIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB4bGluazpocmVmPSJk
+YXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUF3QUFBQVFDQVlB
+QUFBaVlaNEhBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBZEJKUkVGVUtKRmxrcnRLTTNFVXhILy8y
+OHF5eENMWjJrcXdDVlkrVFhyQklwV1BZY2oxQmZJRXRqYm1CYngwNlZJb2dnWWpTQW9OdSt5Nk94
+YVN3UGRsMm5QbXpEQnprS1R2NzI5dFVSU0ZKR2sybXdrUW9PbDB1cHRiZ0NSSnlMS01uNThmUWdp
+OHY3L1Q3WFpwTkJyOEQxdFZGV1ZaY25Cd2dER0dxcW9ZREFZY0h4OHpIQTczQ040NXgzcTlwdFZx
+WWEzbDl2YVdYcS9IZkQ1bnNWanNLeFJGUVpxbVNPTGo0NE9MaXdzbWt3bnRkcHM0anZjSklRU0tv
+a0FTVjFkWG5KeWMwT2wwa01SbXM5bTNKSWtvaXJpNXVhSGY3L1B3OEVDcjFTTFBjNklvMmxldzF2
+TDA5RVMzMjZYWDYzRjJka1pkMTRRUXNOYnVFeVF4SG85SjA1VHo4M1BxdXNaYWk2VGRVZ2lCdXE0
+cHl4Si9mWDNOWkRMaDhmR1J3OE5EakRFQWxHV0p0UlpqREhtZVk2M0ZXb3Uvdkx6azlQU1V4V0xC
+OC9NeldaYnRPcm03dThON3ovMzlQVkVVNFp5RGJmM2VlOFZ4TEdPTWpESHkzaXVFSUVCSmtzaDcv
+L2NxWDE5ZmVubDUwZWZucDk3ZTNyUmNMdlg2K3FyVmFxWHBkQ3JubkVhamtaYkxwVmFybFh3Y3h4
+d2RIZjNqMnpsSGxtVTBtMDBrMFdnMFNOUDBMN2s4endGMlVUcm5LTXVTT0k2cHFvcTZybkhPRVVK
+QUVqWkpFdkk4MzhXNGpYV0w3UUZKR0dQNEJhTGhDSGFvckgxYkFBQUFBRWxGVGtTdVFtQ0MiLz48
+L2c+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIiIGhl
+aWdodD0iMTguNTQ1IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAxMiAxOC41NDUiIHhtbDpz
+cGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6
+eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIHRyYW5zZm9ybT0ibWF0cml4
+KDEuMzMzMyAwIDAgLTEuMzMzMyAwIDE4LjU0NSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQu
+NSw2Ljk1NSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00LjUsLTYuOTU1KSI+PGcgdHJhbnNm
+b3JtPSJzY2FsZSg5IDEzLjkwOSkiPjxpbWFnZSB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwtMSww
+LDEpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9wdGltaXplU3BlZWQi
+IHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jh
+c2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBWUFBQUFMNFZiYkFBQUFCSE5D
+U1ZRSUNBZ0lmQWhraUFBQUFkMUpSRUZVS0pGOWtMMUtiRXNVaEwvVmJXOVFFeU1ETVREVnlNQkla
+Ukl4TVRZUVgwSk1ESDBDOVNrbUYzTnp3Ujh3R0VSTU5vcVppb2cvZTJaNjk2b1RITGJjZTROYlVN
+bWlhbFZSMUhVdDRIOTVjbklpU1pvb3BXQm1MQzR1c3I2K1RnaUJsQkpOMHlDSnFxcVluWjNsL2Yw
+ZDd1L3ZsVkxTd2NHQjJyWlZoNXl6M0YyUzlQMzkvZmZ6MU5RVU9XZENDTVFZR1kvSG1Ca3BKZHEy
+QldCeWNoS0FVRW9oaEVBcGhhWnBjSGRTU2tqQzNRRXdNd0FtT2tFcGhad3pMeTh2eEJpcHFvcTV1
+VGtBU2lrTWgwTjRlbm9TSURPVG1TbkdLRUF4UnUzczdPanE2a3FqMFVpU1pIVmRhM2w1bWIyOVBS
+WVdGcGlabWVINStabkx5MHY2L1Q0eFJ2cjlQdHZiMi9Eejg2UFB6MCs1dTNMT0txVklra2Fqa1U1
+UFQzOVRCNE9CNk9icW9qcDBwdVBqWTZXVWRIUjBKTWJqOGI5RVRkTklrdHhkN3E2Ym14c0IydHpj
+VkVncE1Sd09jWGZjbmFxcWtJU1o0ZTYvRzcrOXZSRWtrVkxDekpCRUNJRzJiWkZFakpIWDExZk1q
+S1dsSmZodng1eXp1bW9mSHgvYTNkMlZtZW5zN0V3Y0hoN3E0dUpDWDE5Znlqbi9HaDhlSHJTL3Z5
+OUF2VjVQajQrUG9wc0cwUHo4dkRZMk52VFAyOWJXbGdhRGdVb3BzdXZyYTkzZDNYRjdlMHRkMTV5
+Zm45UHI5VmhaV1dGdGJZM1YxVldtcDZlUnhCLytqcHNTZnA2TFB3QUFBQUJKUlU1RXJrSmdnZz09
+Ii8+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjkuMzMz
+IiBoZWlnaHQ9IjQ1LjMzMyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjkuMzMzIDQ1LjMz
+MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+IiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PGRlZnM+PG1hc2sg
+aWQ9ImEiIHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIG1hc2tVbml0cz0idXNlclNw
+YWNlT25Vc2UiPjxpbWFnZSB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBpbWFnZS1yZW5kZXJpbmc9Im9w
+dGltaXplU3BlZWQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHhsaW5rOmhyZWY9ImRhdGE6
+aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQXNBQUFBUkNBQUFBQUF1
+aWdrSEFBQUFBWE5DU1ZRSTVncGJtUUFBQURoSlJFRlVDSmwxampFS0FDQVF3eEx4LzErdWc1Nklj
+SjB5cEtXR0hjRk5BWXNKK0RDREd6OC9aK1k2b2Q4czUvVnB1MkQ5UkdiVFhaRGVEQnExSkJpeEFB
+QUFBRWxGVGtTdVFtQ0MiLz48L21hc2s+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMz
+MyAwIDAgLTEuMzMzMyAwIDQ1LjMzMykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLDE3KSI+
+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTExLC0xNykiPjxnIHRyYW5zZm9ybT0ic2NhbGUoMiki
+PjxnIHRyYW5zZm9ybT0ic2NhbGUoMTEsMTcpIj48aW1hZ2UgdHJhbnNmb3JtPSJtYXRyaXgoMSww
+LDAsLTEsMCwxKSIgd2lkdGg9IjEiIGhlaWdodD0iMSIgaW1hZ2UtcmVuZGVyaW5nPSJvcHRpbWl6
+ZVNwZWVkIiBtYXNrPSJ1cmwoI2EpIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB4bGluazpo
+cmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFzQUFB
+QVJDQVlBQUFBTDRWYmJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBRmhKUkVGVUtKSEZrc0VPd0NB
+SVE5dGwvLy9MOVRJemd4WHg1THNSQ2xTRUFJUUU2VTlUWXpSQWNpcDRTaDIvd3FYWVRTcUxKYTNG
+enZQcmtsSFVTVzNFQnBkV2QrUTVjdlRBMHA1N1RHeXVEakNma29tMk5od05YN0VyR1c1aVFZVUFB
+QUFBU1VWT1JLNUNZSUk9Ii8+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjIuNTIz
+IiBoZWlnaHQ9IjM0Ljc1NyIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjIuNTIzIDM0Ljc1
+NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGQ9Im0wIDBoOC40NDYzdjEzLjAzNGgtOC40
+NDYzeiIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMyAwIDAg
+LTEuMzMzMyAwIDM0Ljc1NykiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDguNDQ2LDEzLjAzNCki
+PjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC04LjQ0NiwxMy4wMzQpIj48ZyB0cmFuc2Zvcm09Im1h
+dHJpeCgyLDAsMCwyLDE2Ljg5MiwwKSI+PGcgdHJhbnNmb3JtPSJzY2FsZSgtMSkiPjxnIGNsaXAt
+cGF0aD0idXJsKCNhKSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAxMy4wMzQpIj48
+dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtLjg3ODkxIDEzLjAzNCkiIGZpbGw9IiMwMDAwMDAi
+IGZvbnQtZmFtaWx5PSInT3BlbiBTYW5zJyIgZm9udC1zaXplPSIxOHB4Ij48dHNwYW4geD0iMCIg
+eT0iMCI+MjwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4K
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_with_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_with_svg-moodle.ref
new file mode 100644
index 00000000000..9644910e413
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_includegraphics_with_svg-moodle.ref
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Scalable Vector Graphics</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEi
+IHZpZXdCb3g9IjAgMCAzMjcgMTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmci
+Pgo8ZyBmaWxsPSIjZjk4MDEyIj4KPHBhdGggZD0ibTcyLjQgNzcuNDV2LTI3LjA3YzAtNS42NS0y
+LjM1LTguNS03LTguNS00LjY3NCAwLTcuMDI0IDIuODI2LTcuMDI0IDguNXYyNy4wN2gtMTMuNzd2
+LTI3LjA3YzAtNS42NS0yLjMwMS04LjUtNi44OTktOC41LTQuNjc2IDAtNyAyLjgyNi03IDguNXYy
+Ny4wN2gtMTMuNzh2LTI4LjY4YzAtNS45IDIuMDUxLTEwLjM3IDYuMTUxLTEzLjQgMy41OTktMi43
+MDEgOC41LTQuMDc2IDE0LjY1LTQuMDc2IDYuMjI1IDAgMTAuODIgMS42IDEzLjc3IDQuODAxIDIu
+NTQ5LTMuMjAxIDcuMTc0LTQuODAxIDEzLjktNC44MDEgNi4xNSAwIDExLjAyIDEuMzUgMTQuNjIg
+NC4wNzYgNC4xIDMuMDI1IDYuMTUgNy41IDYuMTUgMTMuNHYyOC42OHoiLz4KPHBhdGggZD0ibTEz
+Ni4xIDIyLjc1LTMuMDk0LTIuMTE3LTcuNDkyIDEyLjA1Yy01LjM3NS0xLjc5Mi0xMC41OS0xLjc5
+Mi0xMS41Ni0xLjc5Mi0xNy4xIDAtMjYuNTUgMTAuNTktMjYuNTUgMjQuNDMgMCA2LjM1MSAyLjQ0
+MyAxNC45OCAxMS43MyAxOS44N2wtNy4zMjggMTEuODkgMy4wOTUgMS45NTQgNy42NTMtMTIuMjFj
+NS4yMTIgMS43OTIgMTAuMSAxLjc5MiAxMS40IDEuNzkyIDE3LjQzIDAgMjYuNTUtMTAuNTkgMjYu
+NTUtMjMuMjkgMC03Ljk4LTMuNDIxLTE2LjQ1LTExLjczLTIwLjg1em0tMzMuNzEgNDcuMjNjLTMu
+MDk1LTMuNzQ2LTMuMDk1LTkuNjA5LTMuMDk1LTE0LjgyIDAtNy44MTcgMC0yMC41MiAxNC42Ni0y
+MC41MiAzLjA5NSAwIDYuMTg5IDAuNjUxIDguNzk0IDIuNDQzem0yMy4xMy0zMC4yOWMyLjkzMiA0
+LjA3MiAzLjA5NSA5Ljc3MiAzLjA5NSAxNS40NyAwIDcuODE2IDAgMTkuNzEtMTQuNjYgMTkuNzEt
+MS4zMDIgMC01LjIxMSAwLTguNjMxLTIuMjh6Ii8+CjxwYXRoIGQ9Im0xNjUuNiA3OC41NWMtNi45
+NzUgMC0xMi43NS0yLjIyNC0xNy4zLTYuNjUtNC41NTEtNC40MjQtNi44MjYtMTAuMTItNi44MjYt
+MTcuMTIgMC02Ljk3NSAyLjI3NS0xMi42NyA2LjgyNi0xNy4xIDQuNTQ5LTQuNDI0IDEwLjMyLTYu
+NjUgMTcuMy02LjY1czEyLjc3IDIuMjI1IDE3LjM1IDYuNjVjNC42IDQuNDI2IDYuODk5IDEwLjE1
+IDYuODk5IDE3LjEgMCA2Ljk3NS0yLjI5OSAxMi42OC02Ljg5OSAxNy4xMi00LjYgNC40MjYtMTAu
+MzcgNi42NS0xNy4zNSA2LjY1em0wLTM2LjQ1Yy0zLjMyNCAwLTUuODc1IDEuMjUtNy42NzQgMy43
+NzUtMS43NzUgMi41MjUtMi42NzYgNS41LTIuNjc2IDguOTc1IDAgMy40NzUgMC44MjU2IDYuNCAy
+LjUgOC43NzQgMS45MDEgMi43MjUgNC41MjYgNC4wNzYgNy44NSA0LjA3NiAzLjMyNiAwIDUuOTI2
+LTEuMzUgNy44NS00LjA3NiAxLjc1LTIuNCAyLjYyNS01LjMyNiAyLjYyNS04Ljc3NCAwLTMuNDc1
+LTAuODI1Ni02LjQtMi41LTguNzc0LTEuOTI0LTIuNjUxLTQuNTc2LTMuOTc1LTcuOTc1LTMuOTc1
+eiIvPgo8cGF0aCBkPSJtMjI3LjIgNzcuMzJ2LTQuNTUxYy0xLjIyNSAxLjY1LTMuMzI2IDIuOTUx
+LTYuMjc2IDMuOTUxLTIuNjI1IDAuODk5Ni01LjEyNSAxLjM1LTcuNSAxLjM1LTYuNTc0IDAtMTEu
+ODUtMi4yNS0xNS44Mi02Ljc3Ni0zLjk3NS00LjUtNS45NzUtMTAuMS01Ljk3NS0xNi43NSAwLTYu
+NTc0IDEuOTUxLTEyLjA3IDUuODUtMTYuNSAzLjQ0OS0zLjkyNCA5LjEtNi42NSAxNS41Ny02LjY1
+IDcuMzAxIDAgMTEuNTggMi43NSAxNC4xNSA1Ljl2LTM3LjNoMTMuNDJ2NzcuMzJ6bTAtMjUuNzVj
+MC0yLjQ1MS0xLjE3Ni00LjgyNi0zLjUtNy4wNzUtMi4zMjYtMi4yNS00Ljc1LTMuMzc1LTcuMi0z
+LjM3NS0zLjUyNSAwLTYuMzI2IDEuNDUxLTguMzc1IDQuMjk5LTEuNzk5IDIuNTUxLTIuNzAxIDUu
+Njc2LTIuNzAxIDkuMzUgMCAzLjYyNSAwLjkwMTMgNi43IDIuNzAxIDkuMjI1IDIuMDQ5IDIuOTUx
+IDQuODUgNC40MjQgOC4zNzUgNC40MjQgMi4xMjUgMCA0LjQ1MS0xIDYuOTUtMy4wMjUgMi41LTIg
+My43NS00LjA3NCAzLjc1LTYuMjI1eiIvPgo8cGF0aCBkPSJtMjQ0LjggMGgxMy44djc3LjMyaC0x
+My44eiIvPgo8cGF0aCBkPSJtMzI3IDczLjgzaC0yLjc3NGMtMi43NzIgMTUuNTctNS4zMjQgMjMt
+MjQuMjkgMjNoLTE0LjY0Yy01LjIxMiAwLTUuNDM1LTAuNzEyLTUuNDM1LTQuMDd2LTI3LjA3aDku
+ODcyYzEwLjc2IDAgMTEuOTggMy4yNTcgMTEuOTggMTEuOTFoMi43NzN2LTI2Ljg3aC0yLjc3M2Mw
+IDguNjQ5LTEuMjIgMTEuOC0xMS45OCAxMS44aC05Ljg3MnYtMjQuMzJjMC0zLjM1OCAwLjIyMjct
+NC4wNzIgNS40MzUtNC4wNzJoMTQuMmMxNi45NyAwIDE5Ljg1IDUuNTk4IDIxLjYzIDE5Ljc0aDIu
+NzczbC0zLjEwNS0yMi44aC02Mi4xMXYzLjA1M2gyLjU1MmM4LjUzOSAwIDguNzYyIDEuMTIgOC43
+NjIgNC43ODN2NTMuMTJjMCAzLjY2My0wLjIyMTYgNC43ODItOC43NjIgNC43ODJoLTIuNTUydjMu
+MTU1aDYzLjY3bDQuNjU5LTI2LjE1eiIvPgo8L2c+CjxwYXRoIGQ9Im00My42NyAyOS4yMiAxMy42
+OC0xMC0wLjE3Ni0wLjYwMDNjLTI0LjY3IDMuMDI1LTM1LjkgNS4xNzQtNTcuMTcgMTcuNWwwLjIw
+MDcgMC41NDkzIDEuNjk5IDAuMDI2M2MtMC4xNDk3IDEuNjk5LTAuNDI0MyA1LjktMC4wNzQgMTIu
+MjUtMi4zNSA2LjgyNC0wLjA1MSAxMS40NyAyLjA5OSAxNi41MiAwLjM1MDMtNS4yNSAwLjMwMS0x
+MS0xLjI5OS0xNi43Mi0wLjMyNTctNi4yNzUtMC4wNDkzLTEwLjQyIDAuMTAwMy0xMi4wMmwxNC4x
+IDAuMTI1cy0wLjEwMDMgNC4yNSAwLjQyNDMgOC4yNzRjMTIuNiA0LjQyNCAyNS4yNy0wLjAyNDcg
+MzItMTAuOTItMS45LTIuMTI1LTUuNTc2LTQuOTc1LTUuNTc2LTQuOTc1eiIgZmlsbD0iIzMzMyIv
+Pgo8L3N2Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Picture]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG width=81 SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEi
+IHZpZXdCb3g9IjAgMCAzMjcgMTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmci
+Pgo8ZyBmaWxsPSIjZjk4MDEyIj4KPHBhdGggZD0ibTcyLjQgNzcuNDV2LTI3LjA3YzAtNS42NS0y
+LjM1LTguNS03LTguNS00LjY3NCAwLTcuMDI0IDIuODI2LTcuMDI0IDguNXYyNy4wN2gtMTMuNzd2
+LTI3LjA3YzAtNS42NS0yLjMwMS04LjUtNi44OTktOC41LTQuNjc2IDAtNyAyLjgyNi03IDguNXYy
+Ny4wN2gtMTMuNzh2LTI4LjY4YzAtNS45IDIuMDUxLTEwLjM3IDYuMTUxLTEzLjQgMy41OTktMi43
+MDEgOC41LTQuMDc2IDE0LjY1LTQuMDc2IDYuMjI1IDAgMTAuODIgMS42IDEzLjc3IDQuODAxIDIu
+NTQ5LTMuMjAxIDcuMTc0LTQuODAxIDEzLjktNC44MDEgNi4xNSAwIDExLjAyIDEuMzUgMTQuNjIg
+NC4wNzYgNC4xIDMuMDI1IDYuMTUgNy41IDYuMTUgMTMuNHYyOC42OHoiLz4KPHBhdGggZD0ibTEz
+Ni4xIDIyLjc1LTMuMDk0LTIuMTE3LTcuNDkyIDEyLjA1Yy01LjM3NS0xLjc5Mi0xMC41OS0xLjc5
+Mi0xMS41Ni0xLjc5Mi0xNy4xIDAtMjYuNTUgMTAuNTktMjYuNTUgMjQuNDMgMCA2LjM1MSAyLjQ0
+MyAxNC45OCAxMS43MyAxOS44N2wtNy4zMjggMTEuODkgMy4wOTUgMS45NTQgNy42NTMtMTIuMjFj
+NS4yMTIgMS43OTIgMTAuMSAxLjc5MiAxMS40IDEuNzkyIDE3LjQzIDAgMjYuNTUtMTAuNTkgMjYu
+NTUtMjMuMjkgMC03Ljk4LTMuNDIxLTE2LjQ1LTExLjczLTIwLjg1em0tMzMuNzEgNDcuMjNjLTMu
+MDk1LTMuNzQ2LTMuMDk1LTkuNjA5LTMuMDk1LTE0LjgyIDAtNy44MTcgMC0yMC41MiAxNC42Ni0y
+MC41MiAzLjA5NSAwIDYuMTg5IDAuNjUxIDguNzk0IDIuNDQzem0yMy4xMy0zMC4yOWMyLjkzMiA0
+LjA3MiAzLjA5NSA5Ljc3MiAzLjA5NSAxNS40NyAwIDcuODE2IDAgMTkuNzEtMTQuNjYgMTkuNzEt
+MS4zMDIgMC01LjIxMSAwLTguNjMxLTIuMjh6Ii8+CjxwYXRoIGQ9Im0xNjUuNiA3OC41NWMtNi45
+NzUgMC0xMi43NS0yLjIyNC0xNy4zLTYuNjUtNC41NTEtNC40MjQtNi44MjYtMTAuMTItNi44MjYt
+MTcuMTIgMC02Ljk3NSAyLjI3NS0xMi42NyA2LjgyNi0xNy4xIDQuNTQ5LTQuNDI0IDEwLjMyLTYu
+NjUgMTcuMy02LjY1czEyLjc3IDIuMjI1IDE3LjM1IDYuNjVjNC42IDQuNDI2IDYuODk5IDEwLjE1
+IDYuODk5IDE3LjEgMCA2Ljk3NS0yLjI5OSAxMi42OC02Ljg5OSAxNy4xMi00LjYgNC40MjYtMTAu
+MzcgNi42NS0xNy4zNSA2LjY1em0wLTM2LjQ1Yy0zLjMyNCAwLTUuODc1IDEuMjUtNy42NzQgMy43
+NzUtMS43NzUgMi41MjUtMi42NzYgNS41LTIuNjc2IDguOTc1IDAgMy40NzUgMC44MjU2IDYuNCAy
+LjUgOC43NzQgMS45MDEgMi43MjUgNC41MjYgNC4wNzYgNy44NSA0LjA3NiAzLjMyNiAwIDUuOTI2
+LTEuMzUgNy44NS00LjA3NiAxLjc1LTIuNCAyLjYyNS01LjMyNiAyLjYyNS04Ljc3NCAwLTMuNDc1
+LTAuODI1Ni02LjQtMi41LTguNzc0LTEuOTI0LTIuNjUxLTQuNTc2LTMuOTc1LTcuOTc1LTMuOTc1
+eiIvPgo8cGF0aCBkPSJtMjI3LjIgNzcuMzJ2LTQuNTUxYy0xLjIyNSAxLjY1LTMuMzI2IDIuOTUx
+LTYuMjc2IDMuOTUxLTIuNjI1IDAuODk5Ni01LjEyNSAxLjM1LTcuNSAxLjM1LTYuNTc0IDAtMTEu
+ODUtMi4yNS0xNS44Mi02Ljc3Ni0zLjk3NS00LjUtNS45NzUtMTAuMS01Ljk3NS0xNi43NSAwLTYu
+NTc0IDEuOTUxLTEyLjA3IDUuODUtMTYuNSAzLjQ0OS0zLjkyNCA5LjEtNi42NSAxNS41Ny02LjY1
+IDcuMzAxIDAgMTEuNTggMi43NSAxNC4xNSA1Ljl2LTM3LjNoMTMuNDJ2NzcuMzJ6bTAtMjUuNzVj
+MC0yLjQ1MS0xLjE3Ni00LjgyNi0zLjUtNy4wNzUtMi4zMjYtMi4yNS00Ljc1LTMuMzc1LTcuMi0z
+LjM3NS0zLjUyNSAwLTYuMzI2IDEuNDUxLTguMzc1IDQuMjk5LTEuNzk5IDIuNTUxLTIuNzAxIDUu
+Njc2LTIuNzAxIDkuMzUgMCAzLjYyNSAwLjkwMTMgNi43IDIuNzAxIDkuMjI1IDIuMDQ5IDIuOTUx
+IDQuODUgNC40MjQgOC4zNzUgNC40MjQgMi4xMjUgMCA0LjQ1MS0xIDYuOTUtMy4wMjUgMi41LTIg
+My43NS00LjA3NCAzLjc1LTYuMjI1eiIvPgo8cGF0aCBkPSJtMjQ0LjggMGgxMy44djc3LjMyaC0x
+My44eiIvPgo8cGF0aCBkPSJtMzI3IDczLjgzaC0yLjc3NGMtMi43NzIgMTUuNTctNS4zMjQgMjMt
+MjQuMjkgMjNoLTE0LjY0Yy01LjIxMiAwLTUuNDM1LTAuNzEyLTUuNDM1LTQuMDd2LTI3LjA3aDku
+ODcyYzEwLjc2IDAgMTEuOTggMy4yNTcgMTEuOTggMTEuOTFoMi43NzN2LTI2Ljg3aC0yLjc3M2Mw
+IDguNjQ5LTEuMjIgMTEuOC0xMS45OCAxMS44aC05Ljg3MnYtMjQuMzJjMC0zLjM1OCAwLjIyMjct
+NC4wNzIgNS40MzUtNC4wNzJoMTQuMmMxNi45NyAwIDE5Ljg1IDUuNTk4IDIxLjYzIDE5Ljc0aDIu
+NzczbC0zLjEwNS0yMi44aC02Mi4xMXYzLjA1M2gyLjU1MmM4LjUzOSAwIDguNzYyIDEuMTIgOC43
+NjIgNC43ODN2NTMuMTJjMCAzLjY2My0wLjIyMTYgNC43ODItOC43NjIgNC43ODJoLTIuNTUydjMu
+MTU1aDYzLjY3bDQuNjU5LTI2LjE1eiIvPgo8L2c+CjxwYXRoIGQ9Im00My42NyAyOS4yMiAxMy42
+OC0xMC0wLjE3Ni0wLjYwMDNjLTI0LjY3IDMuMDI1LTM1LjkgNS4xNzQtNTcuMTcgMTcuNWwwLjIw
+MDcgMC41NDkzIDEuNjk5IDAuMDI2M2MtMC4xNDk3IDEuNjk5LTAuNDI0MyA1LjktMC4wNzQgMTIu
+MjUtMi4zNSA2LjgyNC0wLjA1MSAxMS40NyAyLjA5OSAxNi41MiAwLjM1MDMtNS4yNSAwLjMwMS0x
+MS0xLjI5OS0xNi43Mi0wLjMyNTctNi4yNzUtMC4wNDkzLTEwLjQyIDAuMTAwMy0xMi4wMmwxNC4x
+IDAuMTI1cy0wLjEwMDMgNC4yNSAwLjQyNDMgOC4yNzRjMTIuNiA0LjQyNCAyNS4yNy0wLjAyNDcg
+MzItMTAuOTItMS45LTIuMTI1LTUuNTc2LTQuOTc1LTUuNTc2LTQuOTc1eiIgZmlsbD0iIzMzMyIv
+Pgo8L3N2Zz4K
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAAQAAwBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABQYHCP/EACcQAAEDBAEDAwUAAAAAAAAAAAIBAwQFBgcRCAASIRMUMjhRcXax/9oA
+CAEBAAA/ANg8gpDmb59exXTn3Btql08596TIxECkBNkUamAYqmjdVEcd0u0aFEVE9ZFQ7wW+j7En
+6/H/AJ1OaLx5zXi3HVxQoOYrbnty1nVOoy5llmUuc+73G4bjnvvlrQp40IiIomhROl/iDY+cKjxi
+xrJoGU7YpFFcorBRIMyzjlOsN68CTqTQ71T79qfjr//Z
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQIAIwAjAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
+CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/wAALCAARAAsBAREA/8QAFwAAAwEAAAAA
+AAAAAAAAAAAABAYJCP/EACkQAAEDAwQBAgcBAAAAAAAAAAECAwUEBgcAERIhEwgUIjM4UXFysbL/
+2gAIAQEAAD8APx7E+mJivyZXZktB2qnV35PeWZqYKTepm2PfOBsrqWWyylI2VueXWx321RXFsZaM
+XjyAprE9qqzkUqTFmNqPLTFg9p8auR3T313pGd9XeCKi135RzKtlvRJbIcbVL05WoFJPAslXMqIB
++Djue+tYiw9hLOc5YzcpjuRdtKxJCQka2ChqhlTC6aidrX3GR4+uIKFJUB9lDS5fX1uW/wDl/wD2
+zqsTPyW/1H81/9k=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/gif;base64,R0lGODlhCwARAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O
+Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh
+ISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0
+NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdH
+R0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpa
+WltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1t
+bW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CA
+gIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOT
+k5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaam
+pqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5
+ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zM
+zM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f
+3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy
+8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///yH/C05FVFNDQVBFMi4wAwEA
+AAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLE
+hwA+dgRJsGRDkyEtlkQYEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKFBgg7/
+NWRYMCFEihcjTnS4kWLEhwA+dgRJsKRCkxVJZvwXEAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo
+8J/BgwcHIlyocKFBgg7/NWRYMCFEihcjTnS4kWLEhwA+dgRJsGRFkxVJZvwXEAAh+QQJCgD/ACwA
+AAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWQ4kWBBhBYBRHx4MeJEhx1BavQYMmHGjBxR
+mrSIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChQYIO/zV0OJFgQYQWAUR8
+eDHiRIoaN3ZkODJhxowcUZq0iDAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GDBwciXKhw
+oUGCDv81dDiRYEGEFgFEfHgx4kSKHRlq9BgyYcaMHFGatIgwIAAh+QQJCgD/ACwAAAAACwARAAAI
+MwABCBwo8J/BgwcHIlyocKFBgg7/NWQ4keBEiRYjPiyo8SJFAB05foxosSRHkyATlkQYEAAh+QQJ
+CgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKFBgg7/NWRYMCFBABQhRpRYMeJEhx8Rhnw4
+8qLJiicxWryIMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgcKPCfwYMHByJcqHChwYYOISKUSBBA
+xIoOExbM+E8iw40XLYYUObGiSZEnSXY0iTAgACH5BAkKAP8ALAAAAAALABEAAAg0AAEIHCjwn8GD
+BwciXKhwocGGDiEilEgQQMSKDhMWzPhPIsONFy1m9NixosmCJ0U+NIkwIAAh+QQJCgD/ACwAAAAA
+CwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLDjRctZvTYsaLJjScnmkQY
+EAAh+QQJCgD/ACwAAAAACwARAAAIMwABCBwo8J/BgwcHIlyocKHBhg4hIpRIEEDEig4TFsz4TyLD
+jRlBfrQ4sqLJhyc1YjwYEAAh+QQJCgD/ACwAAAAACwARAAAINAABCBwo8J/BgwcHIlyocKHBhg4h
+IpRIEEDEig4TFsz4TyLDjRctZvT4sKJJkSdFdjSJMCAAIfkECQoA/wAsAAAAAAsAEQAACDQAAQgc
+KPCfwYMHByJcqHChwYYOISKUSBBAxIoOExbM+E8iw40XLWb0+LCiSZEnRXY0iTAgACH5BAEKAP8A
+LAAAAAALABEAAAgyAAEIHCjwn8GDBwciXKhwoUGCDv81ZFgwIUSKFyNOdLgRY0SJFTEC4Eiw5EWT
+IVEiDAgAOw==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG width=28 SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTEuMjYy
+IiBoZWlnaHQ9IjE3LjM3OSIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTEuMjYyIDE3LjM3
+OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDEuMzMzMykiPjx0ZXh0IHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0uODc4OTEgMTMuMDM0KSIgZmlsbD0iIzAwMDAwMCIgZm9udC1mYW1pbHk9IidPcGVuIFNhbnMn
+IiBmb250LXNpemU9IjE4cHgiPjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9n
+Pjwvc3ZnPgo=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_macros-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_macros-moodle.ref
new file mode 100644
index 00000000000..a87551d8fd8
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_macros-moodle.ref
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/LaTeX Macros</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[LaTeX Macros]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>The following commands should not be placed in items: <BR/> and </P><P>Find the \(\rm\LaTeX\) logo </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\rm\TeX\) and \(\rm\LaTeX\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(tilde)&nbsp;and #</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>$ and &</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>& and &sect;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>{ and }</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(space) and (relax)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>(space)&#8239;and&#8239;(thinspace)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&hellip; and &hellip;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&euro; and &euro;</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>\(\rm\TeX\) and \(\rm\LaTeX\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&#95; and &#92;</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_matching-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_matching-moodle.ref
new file mode 100644
index 00000000000..d241782194b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_matching-moodle.ref
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Matching</text>
+ </category>
+</question>
+
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>1</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>2</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer format="html"><text><![CDATA[<p>3</p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer format="html"><text><![CDATA[<p>4</p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Question text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>0</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ <answer><text>1</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ <answer><text>2</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ <answer><text>3</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>4</text></answer>
+ </subquestion>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_mathenv-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_mathenv-moodle.ref
new file mode 100644
index 00000000000..a4e53f8f971
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_mathenv-moodle.ref
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\(\begin {array}{c}$1\\2\end {array}\) </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\($\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\[$\sqrt {25}\]</p>]]></text></feedback>
+ </answer>
+ <answer fraction="10" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\[\begin {array}{c}$1\\2\end {array}\] </P><P>\(\begin {array}{c}$1\\2\end {array}\) {1:MULTICHOICE_VS:=\($\sqrt {25\}\)~6~=7#\[$\sqrt {25\}\]~%10%8}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_minted-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_minted-moodle.ref
new file mode 100644
index 00000000000..2233aa214e9
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_minted-moodle.ref
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Minted</text>
+ </category>
+</question>
+
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[LaTeX Classes]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>In the following \(\rm\LaTeX\) code excerpt, on which line is the class loaded? <PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><span style="color: #177500">% !TEX TS-program = xelatex</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><span style="color: #A90D91">\documentclass{</span>article<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><span style="color: #A90D91">\usepackage</span><span style="color: #836C28">[nostamp]</span><span style="color: #A90D91">{</span>moodle<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #A90D91">\newif\iffvextra</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span><span style="color: #A90D91">\fvextratrue</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><span style="color: #A90D91">\ifxetex</span> <span style="color: #177500">% FOR XELATEX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/></CODE></PRE> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>4</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>yes! <PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><span style="color: #177500">% !TEX TS-program = xelatex</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><mark><span style="color: #A90D91">\documentclass{</span>article<span style="color: #A90D91">}</span></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><span style="color: #A90D91">\usepackage</span><span style="color: #836C28">[nostamp]</span><span style="color: #A90D91">{</span>moodle<span style="color: #A90D91">}</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #A90D91">\newif\iffvextra</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span><span style="color: #A90D91">\fvextratrue</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><span style="color: #A90D91">\ifxetex</span> <span style="color: #177500">% FOR XELATEX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/></CODE></PRE></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>No. On line 3, there is only a comment.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>No. On line 5, the package <CODE>moodle</CODE> is loaded.</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Languages]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the code written in the Python language. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark><span style="color: #A90D91">if</span> <span style="color: #000000">n</span> <span style="color: #000000">&lt;</span> <span style="color: #1C01CE">0</span>:</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span> <span style="color: #A90D91">raise</span> <span style="color: #000000">ValueError</span>(<span style="color: #C41A16">&#39;non negative integer expected&#39;</span>)<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark><span style="color: #000000">fact</span> <span style="color: #000000">=</span> <span style="color: #1C01CE">1</span></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">&nbsp;</span><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><mark><span style="color: #A90D91">for</span> <span style="color: #000000">i</span> <span style="color: #000000">in</span> <span style="color: #A90D91">range</span>(<span style="color: #1C01CE">2</span>, <span style="color: #000000">n</span> <span style="color: #000000">+</span> <span style="color: #1C01CE">1</span>):</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span> <span style="color: #000000">fact</span> <span style="color: #000000">*=</span> <span style="color: #000000">i</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Indeed, this is Python code.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="color: #888888">#!/usr/bin/XXXX</span><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">1</span><BR/><mark><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">strict</span>;</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">2</span><BR/><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">warnings</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">3</span><BR/><mark><span style="color: #008800; font-weight: bold">use</span> <span style="color: #0e84b5; font-weight: bold">IO::Handle</span>;</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">4</span><BR/><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><mark><span style="color: #008800; font-weight: bold">my</span> ( <span style="color: #996633">$remaining</span>, <span style="color: #996633">$tot</span> );</mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">5</span><BR/><mark></mark><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #996633">$remaining</span> <span style="color: #333333">=</span> <span style="color: #996633">$tot</span> <span style="color: #333333">=</span> <span style="color: #007020">shift</span>(<span style="color: #996633">@ARGV</span>);<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">6</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #007020">STDOUT</span><span style="color: #333333">-&gt;</span>autoflush(<span style="color: #0000DD; font-weight: bold">1</span>);<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">7</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #008800; font-weight: bold">while</span> ( <span style="color: #996633">$remaining</span> ) {<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">8</span><BR/> <span style="color: #007020">printf</span> ( <span style="background-color: #fff0f0">&quot;Remaining %s/%s \r&quot;</span>, <span style="color: #996633">$remaining</span><span style="color: #333333">--</span>, <span style="color: #996633">$tot</span> );<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">9</span><BR/> <span style="color: #007020">sleep</span> <span style="color: #0000DD; font-weight: bold">1</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">10</span><BR/>}<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">11</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">&nbsp;</span><BR/><span style="color: #008800; font-weight: bold">print</span> <span style="background-color: #fff0f0">&quot;\n&quot;</span>;<span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: left; float: right">12</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. This is Perl code.</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">1</span><span style="color: #204a87; font-weight: bold">long</span> <span style="color: #000000">some_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">2</span><mark><span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">other_function</span><span style="color: #000000; font-weight: bold">();</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">3</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">4</span><mark><span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">calling_function</span><span style="color: #000000; font-weight: bold">()</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">5</span><span style="color: #000000; font-weight: bold">{</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">6</span> <span style="color: #204a87; font-weight: bold">long</span> <span style="color: #000000">test1</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">7</span><mark> <span style="color: #204a87; font-weight: bold">register</span> <span style="color: #8f5902; font-style: italic">/* int */</span> <span style="color: #000000">test2</span><span style="color: #000000; font-weight: bold">;</span></mark><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">8</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">9</span> <span style="color: #000000">test1</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #000000">some_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">10</span> <span style="color: #204a87; font-weight: bold">if</span> <span style="color: #000000; font-weight: bold">(</span><span style="color: #000000">test1</span> <span style="color: #ce5c00; font-weight: bold">&gt;</span> <span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">)</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">11</span> <span style="color: #000000">test2</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #0000cf; font-weight: bold">0</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">12</span> <span style="color: #204a87; font-weight: bold">else</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">13</span> <span style="color: #000000">test2</span> <span style="color: #ce5c00; font-weight: bold">=</span> <span style="color: #000000">other_function</span><span style="color: #000000; font-weight: bold">();</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">14</span> <span style="color: #204a87; font-weight: bold">return</span> <span style="color: #000000">test2</span><span style="color: #000000; font-weight: bold">;</span><BR/><span style="font-size: 80%; background-color: #f0f0f0; padding: 0 5px 0 5px; display: inline-block; width: 16pt; text-align: right">15</span><span style="color: #000000; font-weight: bold">}</span><BR/></CODE></PRE></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>No. This is C code.</p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multi-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multi-moodle.ref
new file mode 100644
index 00000000000..d3117a85a3b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multi-moodle.ref
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example Quiz</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>false</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="70" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-10" format="html">
+ <text><![CDATA[<p><B>68</B></p>]]></text>
+ </answer>
+ <answer fraction="30" format="html">
+ <text><![CDATA[<p>7</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-70" format="html">
+ <text><![CDATA[<p>8</p>]]></text>
+ </answer>
+ <answer fraction="-20" format="html">
+ <text><![CDATA[<p><CODE>nothing</CODE></p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Select the following numbers that are prime. </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc<BR/>def \(\sqrt {2}\)</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text>
+ </answer>
+ <answer fraction="-30" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+ <answer fraction="-30" format="html">
+ <text><![CDATA[<p>9</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>\(\sqrt {25}\)</p>]]></text></feedback>
+ </answer>
+ <answer fraction="-70" format="html">
+ <text><![CDATA[<p><OL><LI>False </LI><LI>Wrong</LI></OL></p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multiple_categories-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multiple_categories-moodle.ref
new file mode 100644
index 00000000000..7398716585b
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_multiple_categories-moodle.ref
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Category 1</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Q1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text 1 </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Category 2</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Q2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Text 2 </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>C</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>D</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_penalty-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_penalty-moodle.ref
new file mode 100644
index 00000000000..65811bff172
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_penalty-moodle.ref
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Example</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multiple Choice]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>abc: def </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>abc: def</p>]]></text>
+ </generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>abc: def</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>6</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_point_points-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_point_points-moodle.ref
new file mode 100644
index 00000000000..ef374ef1dbf
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_point_points-moodle.ref
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Ifnum</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>.5</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[MWE]]></text>
+ </name>
+ <questiontext format="html"><text/></questiontext>
+ <defaultgrade>3.2</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>A</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>B</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_special_characters-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_special_characters-moodle.ref
new file mode 100644
index 00000000000..6df44274c1c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_special_characters-moodle.ref
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Diacritical marks and ligatures</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Å À Â Ã É È Ë Ê Î à Ñ Õ Ô Ö Ù Ü Û Ç Ş Ţ ŠŰ Ÿ Ă Ĕ Ğ Ĭ Ŏ Ŭ Č Ď Ě Ľ Ň Ř Š Ť Ž ]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Ã¥ à â ã é è ë ê î ï ñ õ ô ö ù ü û ç ÅŸ Å£ Å‘ ű ÿ ă Ä• ÄŸ Ä­ Å Å­ Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž <BR/> Ã… À Â Ã É È Ë Ê ÃŽ à Ñ Õ Ô Ö Ù Ãœ Û Ç Åž Å¢ Å Å° Ÿ Ä‚ Ä” Äž Ĭ ÅŽ Ŭ ÄŒ ÄŽ Äš Ľ Ň Ř Å  Ť Ž <BR/> Å“ æ ß Å’ Æ ẞ Ø Š« ø Å‚ » ¿ ¡ </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>Ã¥ à â ã é è ë ê î ï ñ õ ô ö ù ü û ç ÅŸ Å£ Å‘ ű ÿ ă Ä• ÄŸ Ä­ Å Å­ Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Å À Â Ã É È Ë Ê Î à Ñ Õ Ô Ö Ù Ü Û Ç Ş Ţ ŠŰ Ÿ Ă Ĕ Ğ Ĭ Ŏ Ŭ Č Ď Ě Ľ Ň Ř Š Ť Ž </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>Å À Â Ã É È Ë Ê Î à Ñ Õ Ô Ö Ù Ü Û Ç Ş Ţ ŠŰ Ÿ Ă Ĕ Ğ Ĭ Ŏ Ŭ Č Ď Ě Ľ Ň Ř Š Ť Ž </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>Ã¥ à â ã é è ë ê î ï ñ õ ô ö ù ü û ç ÅŸ Å£ Å‘ ű ÿ ă Ä• ÄŸ Ä­ Å Å­ Ä Ä Ä› ľ ň Å™ Å¡ Å¥ ž </p>]]></text></feedback>
+ </answer>
+</question>
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; ]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; <BR/> &Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; <BR/> &oelig; &aelig; &szlig; &OElig; &AElig; &#7838; &Oslash; &Lstrok; &laquo;&#8239; &oslash; &lstrok; &#8239;&raquo; &iquest; &iexcl; </p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&Aring; &Agrave; &Acirc; &Atilde; &Eacute; &Egrave; &Euml; &Ecirc; &Icirc; &Iuml; &Ntilde; &Otilde; &Ouml; &Ocirc; &Ugrave; &Uuml; &Ucirc; &Ccedil; &#350; &#354; &#336; &#368; &Yuml; &Abreve; &#276; &Gbreve; &#300; &#334; &Ubreve; &Ccaron; &Dcaron; &Ecaron; &Lcaron; &Ncaron; &Rcaron; &Scaron; &Tcaron; &Zcaron; </p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>&aring; &agrave; &acirc; &atilde; &eacute; &egrave; &euml; &ecirc; &icirc; &iuml; &ntilde; &otilde; &ouml; &ocirc; &ugrave; &uuml; &ucirc; &ccedil; &#351; &#355; &#337; &#369; &yuml; &abreve; &#277; &gbreve; &#301; &#301; &#335; &ubreve; &ccaron; &dcaron; &ecaron; &lcaron; &ncaron; &rcaron; &scaron; &tcaron; &zcaron; </p>]]></text></feedback>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tags-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tags-moodle.ref
new file mode 100644
index 00000000000..cb8af5edc68
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tags-moodle.ref
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Moodle Tags</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tic</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <feedback format="html"><text><![CDATA[<p>tac</p>]]></text></feedback>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[multiéàî]]></text></tag>
+ </tags>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>B</text>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>C</text>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ </answer>
+ <tags>
+ <tag><text><![CDATA[quizz-level]]></text></tag>
+ </tags>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>toc</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>2</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p>&laquo;&#8239;&#8239;&raquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ </answer>
+</question>
+<question type="matching">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p>&aelig;</p>]]></text>
+ <answer><text>oui</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p>&oelig;</p>]]></text>
+ <answer><text>non</text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text></text>
+ <answer><text>Ã…</text></answer>
+ </subquestion>
+ <tags>
+ <tag><text><![CDATA[m&aring;tch&iuml;ng]]></text></tag>
+ </tags>
+</question>
+<question type="essay">
+ <name format="html">
+ <text><![CDATA[Title]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <responserequired>0</responserequired>
+ <responseformat>editor</responseformat>
+ <responsefieldlines>15</responsefieldlines>
+ <attachments>0</attachments>
+ <attachmentsrequired>0</attachmentsrequired>
+ <graderinfo format="html"><text><![CDATA[
+ <ul>
+ <li>&aelig;yo </li>
+ <li>&oelig;</li>
+ </ul>
+ ]]></text></graderinfo>
+ <responsetemplate format="html"><text/></responsetemplate>
+ <tags>
+ <tag><text><![CDATA[essay]]></text></tag>
+ </tags>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>&Aring;&OElig;{1:MULTICHOICE:=chip~%10%chop#yes~chap#no.}&#8239;&raquo;&Aring;{1:SHORTANSWER:=B#toc~=C#&laquo;&#8239;&#8239;&raquo;~*}&laquo;&#8239;&Aring;{1:NUMERICAL:=1:0~=2:0#&laquo;&#8239;&#8239;&raquo;~3:0}&OElig;{1:MULTICHOICE_V:=chip#yes~%10%chop~chap#no.}</P><P>&OElig;{1:MULTICHOICE_H:=chip#yes~%10%chop~chap#no.}</P><P></p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <tags>
+ <tag><text><![CDATA[cloze]]></text></tag>
+ </tags>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz-moodle.ref
new file mode 100644
index 00000000000..48d857aeae0
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz-moodle.ref
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVUlEQVQI12NgwAQSHU0MDIyNDPUBDBxfGfgPMLB/B5FAYN8AItcIMDCwdE8EMZlW
+C4AoObAs91cGnosM3D8Y+D+B2FwODPIHGBinuZwGqmGuMMBiEwCKERKuaM1mNQAAAABJRU5ErkJg
+gg==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iqu8zd7v+y
+XhgAAABTSURBVAjXY2DABNMc3QMYGN69ewFk7+hQAJILwOIQcklFIZC8xpADlHBg4AYLcjxiYHFg
+4HjCwPsARHIVMHBeYOAwYJAtYGBoc90BVMHcpoDFJgDhHRLk6uL+ygAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVElEQVQI12NgwAUkZjcxMDAuYpxnwMApwCB3gYHvEQPXFwaeRwwcX0DyPJ9ApH4D
+iNwDIjgOgshMEME6gUGJgcGCgaGIgflGR+cFBt7///9vwLQDABVCEvmq/3YdAAAAAElFTkSuQmCC
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVUlEQVQI12NgwAQSHU0MDIyNDPUBDBxfGfgPMLB/B5FAYN8AItcIMDCwdE8EMZlW
+C4AoObAs91cGnosM3D8Y+D+B2FwODPIHGBinuZwGqmGuMMBiEwCKERKuaM1mNQAAAABJRU5ErkJg
+gg==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAJ1BMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAilU6eAAAADHRSTlMAESIzRGZ3iLvM3e4/H40nAAAAPUlE
+QVQI12NgwA08QATjChDJPgNEmnaAyAIQyaYAIs0YQGQBiGRTAJFmDCDSvbz8VClI6QkGONlxuh3T
+BgCaoQz0SHFqtgAAAABJRU5ErkJggg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iqu8zd7v+y
+XhgAAABTSURBVAjXY2DABNMc3QMYGN69ewFk7+hQAJILwOIQcklFIZC8xpADlHBg4AYLcjxiYHFg
+4HjCwPsARHIVMHBeYOAwYJAtYGBoc90BVMHcpoDFJgDhHRLk6uL+ygAAAABJRU5ErkJggg==
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVUlEQVQI12NgwAQSHU0MDIyNDPUBDBxfGfgPMLB/B5FAYN8AItcIMDCwdE8EMZlW
+C4AoObAs91cGnosM3D8Y+D+B2FwODPIHGBinuZwGqmGuMMBiEwCKERKuaM1mNQAAAABJRU5ErkJg
+gg==
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVElEQVQI12NgwAUkZjcxMDAuYpxnwMApwCB3gYHvEQPXFwaeRwwcX0DyPJ9ApH4D
+iNwDIjgOgshMEME6gUGJgcGCgaGIgflGR+cFBt7///9vwLQDABVCEvmq/3YdAAAAAElFTkSuQmCC
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> {1:MULTICHOICE_HS:=<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAVUlEQVQI12NgwAQSHU0MDIyNDPUBDBxfGfgPMLB/B5FAYN8AItcIMDCwdE8EMZlW
+C4AoObAs91cGnosM3D8Y+D+B2FwODPIHGBinuZwGqmGuMMBiEwCKERKuaM1mNQAAAABJRU5ErkJg
+gg==
+">#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+">~<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iqu8zd7v+y
+XhgAAABTSURBVAjXY2DABNMc3QMYGN69ewFk7+hQAJILwOIQcklFIZC8xpADlHBg4AYLcjxiYHFg
+4HjCwPsARHIVMHBeYOAwYJAtYGBoc90BVMHcpoDFJgDhHRLk6uL+ygAAAABJRU5ErkJggg==
+">#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+">}</P><P><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> {1:SHORTANSWER:=3#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+">~=5#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+">}</P><P><IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAVBAMAAACNnGLAAAAAHlBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAACGjDitAAAACXRSTlMAESJEiJm7zO6nttlqAAAAIklEQVQI12NgwAlEgJjJ
+tRJIMhp4gkXIJAWARFpnmQOmFQA1jwXeV/vvCgAAAABJRU5ErkJggg==
+"> {1:NUMERICAL:=3:0#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAALVBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAESIzRFVmd4iZqrvd7qAo
+0mEAAABeSURBVAjXY2DAASI6BIAkhwP7BiAVqsD4AEgtaABRbAENLECKQyiB8wIDA2s7g10CSAPz
+NbC+KAMQqQUR2sjAEMDAICXAwAbkd7QK+AgwMC7QfneFgYHJgCFCAbvNABJmEbBCn/VAAAAAAElF
+TkSuQmCC
+">~=5:0#<IMG SRC="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAVBAMAAABiXgn+AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAESIzRFVmd4iZqrvM
+3e5GKvWZAAAAUElEQVQI12NgwAAREGolmGT8CqbYHoAprglgSl8BTHVCVFwCUxwNYMobTDNe5CsA
+UtIG9gZAzinHOiCHOyTzThpYzQsHEMn8Gcxhf4CsHQQAyX8PqblssX8AAAAASUVORK5CYII=
+">}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz_with_svg-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz_with_svg-moodle.ref
new file mode 100644
index 00000000000..065da7b2f81
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tikz_with_svg-moodle.ref
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/TikZ</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4zPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij41PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="ddmatch">
+ <name format="html">
+ <text><![CDATA[Matching]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <shuffleanswers>1</shuffleanswers>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4zPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjYwOSkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij40PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij41PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text></answer>
+ </subquestion>
+ <subquestion format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4zPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text>
+ <answer format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"></p>]]></text></answer>
+ </subquestion>
+</question>
+<question type="shortanswer">
+ <name format="html">
+ <text><![CDATA[Short]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <usecase>0</usecase>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Numerical]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>3</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+"></p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>5</text>
+ <tolerance>0</tolerance>
+ <feedback format="html"><text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+"></p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[Cloze]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> {1:MULTICHOICE_HS:=<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4zPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+">#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+">~<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjc3MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij41PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+">#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+">}</P><P><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> {1:SHORTANSWER:=3#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+">~=5#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+">}</P><P><IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi42NDEz
+IiBoZWlnaHQ9IjEzLjI4NCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNi42NDEzIDEzLjI4
+NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3Zn
+Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMgMCAwIC0xLjMzMzMgMCAxMy4yODQpIj48ZyB0
+cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjQ5MSw0Ljk4MSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRl
+KC0yLjQ5MSwtMi40OSkiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsLTIuNDkxKSI+PHRleHQg
+dHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsLTEsMCwxLjY2NCkiIGZpbGw9IiMwMDAwMDAiIGZvbnQt
+ZmFtaWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiPjx0c3BhbiB4PSIwIiB5PSIw
+Ij4xPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPgo=
+"> {1:NUMERICAL:=3:0#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMS43NzMpIiBmaWxsPSIjMDAwMDAwIiBmb250LWZh
+bWlseT0iTE1Sb21hbjEwIiBmb250LXNpemU9IjkuOTYyNnB4IiBmb250LXN0eWxlPSJpdGFsaWMi
+Pjx0c3BhbiB4PSIwIiB5PSIwIj4yPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PC9nPjwvc3Zn
+Pgo=
+">~=5:0#<IMG SRC="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNi43ODgi
+IGhlaWdodD0iMTMuMjg0IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA2Ljc4OCAxMy4yODQi
+IHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+
+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMS4zMzMzIDAgMCAtMS4zMzMzIDAgMTMuMjg0KSI+PGcgdHJh
+bnNmb3JtPSJ0cmFuc2xhdGUoMi41NDUsNC45ODEpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgt
+Mi41NDUsLTIuNDkpIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLC0yLjQ5MSkiPjx0ZXh0IHRy
+YW5zZm9ybT0ibWF0cml4KDEsMCwwLC0xLDAsMi42MykiIGZpbGw9IiMwMDAwMDAiIGZvbnQtZmFt
+aWx5PSJMTVJvbWFuMTAiIGZvbnQtc2l6ZT0iOS45NjI2cHgiIGZvbnQtc3R5bGU9Iml0YWxpYyI+
+PHRzcGFuIHg9IjAiIHk9IjAiPjQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48L2c+PC9zdmc+
+Cg==
+">}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tolerance-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tolerance-moodle.ref
new file mode 100644
index 00000000000..beed570d8c0
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_tolerance-moodle.ref
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Tolerance</text>
+ </category>
+</question>
+
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Num 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1</text>
+ <tolerance>4</tolerance>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>0</text>
+ <tolerance>2</tolerance>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ <feedback format="html"><text><![CDATA[<p>nope</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="numerical">
+ <name format="html">
+ <text><![CDATA[Num 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>1,45E-3</text>
+ <tolerance>1,65e-4</tolerance>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>0</text>
+ <tolerance>0</tolerance>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>*</text>
+ <feedback format="html"><text><![CDATA[<p>nope</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[ClozeNum 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number {1:NUMERICAL:=1:4~=0:3~*#nope}Give a number {1:NUMERICAL:=1:4~=0:2~*#nope}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+<question type="cloze">
+ <name format="html">
+ <text><![CDATA[ClozeNum 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Give a number {1:NUMERICAL:=1,45e-3:1,65E-4~=0:0~*#nope}</p>]]></text>
+ </questiontext>
+ <defaultgrade>1</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_truefalse-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_truefalse-moodle.ref
new file mode 100644
index 00000000000..0b032483e48
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_truefalse-moodle.ref
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Truefalse questions</text>
+ </category>
+</question>
+
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 1]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is a matching question. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;true&rdquo;</p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p> Feedback for students choosing &rdquo;false&rdquo; </p>]]></text></feedback>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 2]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>This is an essay question. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;true&rdquo; </p>]]></text></feedback>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ <feedback format="html"><text><![CDATA[<p>Feedback for students choosing &rdquo;false&rdquo;</p>]]></text></feedback>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 3]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Please answer &rdquo;True&rdquo;. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="100" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="0" format="plain_text">
+ <text>false</text>
+ </answer>
+</question>
+<question type="truefalse">
+ <name format="html">
+ <text><![CDATA[Truefalse Test 4]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p>Please answer &rdquo;False&rdquo;. </p>]]></text>
+ </questiontext>
+ <defaultgrade>3</defaultgrade>
+ <generalfeedback format="html">
+ <text><![CDATA[<p>general feedback</p>]]></text>
+ </generalfeedback>
+ <penalty>1</penalty>
+ <hidden>0</hidden>
+ <answer fraction="0" format="plain_text">
+ <text>true</text>
+ </answer>
+ <answer fraction="100" format="plain_text">
+ <text>false</text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_verbatim-moodle.ref b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_verbatim-moodle.ref
new file mode 100644
index 00000000000..b17eb49367d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/moodle/test/utf8ref/test_verbatim-moodle.ref
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<quiz>
+
+<question type="category">
+ <category>
+ <text>$course$/top/Verbatim</text>
+ </category>
+</question>
+
+<question type="multichoice">
+ <name format="html">
+ <text><![CDATA[Multi]]></text>
+ </name>
+ <questiontext format="html">
+ <text><![CDATA[<p><PRE style="border-top: thin solid; border-bottom: thin solid"><CODE>% !TeX encoding = UTF-8<BR/>% !TeX spellcheck = en_US<BR/>% !TEX TS-program = xelatex<BR/>\documentclass{article}<BR/>\usepackage[nostamp]{moodle}<BR/>\newif\iffvextra<BR/>\fvextratrue<BR/>\ifxetex % FOR XELATEX<BR/> \usepackage{fontspec}<BR/>\else %% FOR PDFLATEX<BR/> \usepackage[utf8]{inputenc} % necessary<BR/> \usepackage[T1]{fontenc} % necessary<BR/>\fi<BR/></CODE></PRE> </p>]]></text>
+ </questiontext>
+ <defaultgrade>1.0</defaultgrade>
+ <generalfeedback format="html"><text/></generalfeedback>
+ <penalty>0.10</penalty>
+ <hidden>0</hidden>
+ <single>true</single>
+ <shuffleanswers>1</shuffleanswers>
+ <answernumbering>abc</answernumbering>
+ <answer fraction="100" format="html">
+ <text><![CDATA[<p>test</p>]]></text>
+ </answer>
+ <answer fraction="0" format="html">
+ <text><![CDATA[<p>toast</p>]]></text>
+ </answer>
+</question>
+
+</quiz>
diff --git a/Master/texmf-dist/source/latex/moodle/makefile b/Master/texmf-dist/source/latex/moodle/makefile
new file mode 100644
index 00000000000..d3bf3576f7b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/moodle/makefile
@@ -0,0 +1,90 @@
+PROJECT_NAME=moodle
+FILE_CLEAN=*.sty *.log *.aux *.auxlock *.out *.blg *.bbl *.toc *.xml *.bcf *.synctex.gz *~ *.nav *.snm *.idx *.ilg *.ind _minted-* *.glo *.gls *.dpth
+LATEX=latex
+PDFLATEX=lualatex
+LATEXFLAGS=-interaction=nonstopmode -shell-escape
+DIFFTOOL=meld
+MAKEINDEX=makeindex
+TESTDIR=test
+RECURSIVE_TARGETS= all clean distclean test
+RERUNLATEX= '(There were undefined references|Rerun to get (cross-references|the bars) right)'
+
+ifndef DEBUG
+ DEBUG=> /dev/null
+endif
+
+.DEFAULT_GOAL := all
+
+.PHONY: all clean distclean test dist install
+
+all: $(PROJECT_NAME).pdf $(PROJECT_NAME).sty
+
+clean: $(TESTDIR)/clean
+ rm -rf $(FILE_CLEAN)
+
+distclean: clean
+
+distclean: $(TESTDIR)/distclean
+ rm -rf *.pdf *.xml *.zip
+ rm -rf texmf/ $(@mkdir -p ./$(PROJECT_NAME)/
+
+test: $(TESTDIR)/test
+
+dist: test $(PROJECT_NAME).zip
+ @mv $(PROJECT_NAME).zip $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").zip
+ @mv $(PROJECT_NAME).tds.zip $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").tds.zip
+ @cp $(PROJECT_NAME).pdf $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").pdf
+ @$(MAKE) clean -C .
+
+$(PROJECT_NAME).zip: $(PROJECT_NAME).tds.zip $(PROJECT_NAME).pdf
+ @mkdir -p ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).dtx ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).ins ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).pdf ./$(PROJECT_NAME)/
+ @cp README.ctan ./$(PROJECT_NAME)/README.md
+ zip -r9 $(PROJECT_NAME).zip $(PROJECT_NAME).tds.zip $(PROJECT_NAME)
+
+$(PROJECT_NAME).tds.zip : $(PROJECT_NAME).pdf $(PROJECT_NAME).sty
+ @mkdir -p ./texmf/tex/latex/$(PROJECT_NAME)/
+ @mkdir -p ./texmf/source/latex/$(PROJECT_NAME)/
+ @mkdir -p ./texmf/doc/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).sty ./texmf/tex/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).dtx ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).ins ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp makefile ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).pdf ./texmf/doc/latex/$(PROJECT_NAME)/
+ @cp README.ctan ./texmf/doc/latex/$(PROJECT_NAME)/README.md
+ @cp LICENSE ./texmf/doc/latex/$(PROJECT_NAME)/
+ @$(MAKE) distclean -C $(TESTDIR)
+ @rsync -avq --exclude='$(TESTDIR)/extra' --exclude='$(TESTDIR)/media' --exclude='$(TESTDIR)/dev_*.tex' $(TESTDIR) ./texmf/doc/latex/$(PROJECT_NAME)
+ @cd texmf/ ; zip -r9 ../$(PROJECT_NAME).tds.zip tex source doc
+
+install: $(PROJECT_NAME).tds.zip
+ @unzip -d ~/texmf ./$(PROJECT_NAME).tds.zip
+
+$(PROJECT_NAME).sty: $(PROJECT_NAME).dtx
+
+$(PROJECT_NAME).pdf: $(PROJECT_NAME).dtx $(PROJECT_NAME).gls
+
+%.glo: %.dtx
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+%.gls: %.glo
+ $(MAKEINDEX) -s gglo.ist -o $@ $< $(DEBUG)
+
+%.pdf: %.tex
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+%.pdf: %.dtx
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+ @if egrep -q $(RERUNLATEX) $(basename $@).log ; then \
+ echo "\trequires a new $(PDFLATEX) pass..."; \
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG); \
+ fi
+
+%.sty: %.ins
+ rm -rf $@
+ $(LATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+$(RECURSIVE_TARGETS:%=$(TESTDIR)/%) :
+ @$(MAKE) $(notdir $@) -C $(dir $@)
diff --git a/Master/texmf-dist/source/latex/moodle/moodle.dtx b/Master/texmf-dist/source/latex/moodle/moodle.dtx
index 02b43f79238..17a7b125b41 100644
--- a/Master/texmf-dist/source/latex/moodle/moodle.dtx
+++ b/Master/texmf-dist/source/latex/moodle/moodle.dtx
@@ -1,7 +1,8 @@
% \iffalse meta-comment
%
% moodle.dtx
-% Copyright 2016 by Anders O.F. Hendrickson (anders.hendrickson@snc.edu)
+% Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+% and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -13,7 +14,7 @@
%
% This work has the LPPL maintenance status `maintained'.
%
-% The Current Maintainer of this work is Anders O.F. Hendrickson.
+% The Current Maintainer of this work is Matthieu Guerquin-Kern.
%
% This work consists of the files moodle.dtx and moodle.ins
% and the derived files moodle.sty and getitems.sty.
@@ -27,27 +28,37 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{moodle}
%<*package>
- [2016/01/11 v0.5 Moodle quiz XML generation]
+ [2021/01/04 v0.8 Moodle quiz XML generation]
%</package>
%
%<*driver>
-\documentclass{ltxdoc}
-\usepackage{moodle}
-\usepackage{amssymb}
-\usepackage{fancyvrb}
+\documentclass[a4paper]{ltxdoc}
+\usepackage{iftex}
+\ifPDFTeX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+ \usepackage[protrusion=true,expansion]{microtype}
+ \usepackage[ttscale=.875]{libertine}
+\else % assuming LuaLaTeX or XeLaTeX
+ \usepackage{fontspec}
+ \setmainfont[Mapping=tex-text]{Linux Libertine O}
+\fi
+%\usepackage{moodle}[2020/07/09]
+\usepackage{amssymb,metalogo,multirow,threeparttable,booktabs,hyperref,tikz,minted,changelog}
+\usetikzlibrary{arrows,positioning,decorations.text}
+%\usemintedstyle{Wombat}
\EnableCrossrefs
\CodelineIndex
\OnlyDescription
\RecordChanges
\begin{document}
\DocInput{moodle.dtx}
- \PrintChanges
- %\PrintIndex
+ %\PrintChanges
\end{document}
%</driver>
% \fi
%
-% \CheckSum{3827}
+% \CheckSum{7442} ^^A Comment \OnlyDescription above to adjust
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -66,9 +77,7 @@
% Right brace \} Tilde \~}
%
%
-% \changes{v0.5}{2016/01/05}{Initial version}
-%
-% \GetFileInfo{moodle.sty}
+% \GetFileInfo{\jobname.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment,\def}
%
@@ -77,8 +86,12 @@
% generating Moodle quizzes via \LaTeX%
% \thanks{This document
% corresponds to \textsf{moodle.sty}~\fileversion, dated \filedate.}}
-% \author{Anders Hendrickson\\ St.~Norbert College, De~Pere, WI, USA \\ \url{anders.hendrickson@snc.edu}}
-% \date{January 11, 2016}
+% \author{Anders Hendrickson\footnote{original author of the package (\texttt{v0.5}), inactive.}\\
+% \texttt{anders.o.f.hendrickson AT gmail.com} \and
+% Matthieu Guerquin-Kern\footnote{current maintainer, author of the updates (\texttt{v0.6}
+% to \texttt{v0.8}), partially funded by \href{https://www.ensea.fr/en/}{ENSEA Graduate School}, France.}\\
+% \href{mailto:guerquin-kern AT crans.org}{guerquin-kern AT crans.org}}
+% \date{January 4, 2021}
%
% \maketitle
%
@@ -87,8 +100,8 @@
% \section{Motivation}
%
% The acronym Moodle stands for ``Modular Object-Oriented Dynamic Learning Environment.''
-% It is an open source learning management system employed by many universities, colleges,
-% and high schools to provide digital access to course materials, such as
+% It is an open source learning management system (LMS) employed by many universities,
+% colleges, and high schools to provide digital access to course materials, such as
% notes, video lectures, forums, and the like; see
% \url{https://moodle.com/moodle-lms/} for more information.
% One of the many useful
@@ -148,28 +161,82 @@
% and the PDF may be previewed onscreen or printed out for ease of proofreading.
% Mathematical graphics can be integrated within the main file through \TikZ,
% and of course \LaTeX\ macros can be customized.
-% Using the present \textsf{moodle.sty} package,
+% Using the present \textsf{moodle} package,
% a quiz author can type a quiz using familiar \LaTeX\ syntax and document
% structure. Upon compilation, \LaTeX\ will generate both a well-organized
% PDF that is easy to proofread and an XML file that can be uploaded directly
% to Moodle. The entire process is far faster than using Moodle's own
% web-based editor, makes it easier to catch one's mistakes,
% and the ultimate source code of one's work is a human-readable |.tex| file
-% that can be archived, browsed, and edited offline.
+% that can be archived, versioned, browsed, and edited offline.
+%
+% Strictly speaking, the \textsf{moodle} package does not generate quizzes:
+% it generates question banks that can be imported in the LMS. The teacher
+% still needs to compose manually a quiz from the question banks. Hopefully,
+% two Moodle features supported by the package make this task easier:
+% categories and tags.
+%
+% In this documentation the LMS is referred to as Moodle (uppercase M and
+% roman font) while the \LaTeX\ package that is documented here is referred
+% to as \textsf{moodle} (all lower case and sans serif font).
%
% \section{Workflow}
-% The process of creating a quiz in Moodle using this package is as follows:
+% The process of creating a quiz in Moodle using this package is depicted in
+% Figure~\ref{fig:workflow}. It follows a few steps:
% \begin{enumerate}
-% \item Write a \LaTeX\ document using |\usepackage{moodle}| as described below.
-% \item Compile the document to PDF using pdf\LaTeX. This will also produce the file
-% \meta{jobname}|-moodle.xml|.
+% \item Write a \LaTeX\ document using |\usepackage{moodle}| as described
+% below.
+% \item Compile the document to PDF using pdf\LaTeX\, \XeLaTeX\ or \LuaLaTeX.
+% This will also produce the file \meta{jobname}|-moodle.xml|.
% \item Open Moodle, navigate to the desired course,
% and under ``Question bank'' select ``Import.''
% \item Select ``Moodle XML format,'' choose the XML file to upload, and press ``Import.''
% \item After Moodle verifies that the questions have been imported correctly,
% you may add them to your quizzes.
% \end{enumerate}
-%
+% \begin{figure}[tbp]
+% \centering
+% \begin{tikzpicture}[node distance=1,auto,bend
+% angle=45,box/.style={rectangle,draw=blue!50,rounded corners=3,top
+% color=white,bottom color=black!20,thick,align=center,text
+% width=2.5cm},elmt/.style={font=\itshape,align=left},
+% cmnt/.style={font=\footnotesize,align=center},
+% bigcmnt/.style={font=\normalsize,align=center},pre/.style={<-,>=stealth',thick},
+% post/.style={->,>=stealth',thick}, prepost/.style={<->,>=stealth',thick}]
+% \draw[white,fill=orange!20,rounded corners=10]
+% (-1.5,-.7)--++(0,1.4)--++(10.3,0)--++(0,-3.3)--++(-6.7,0)--++(-.25,1.725)--cycle;
+% \node[orange!80!black,above] (dev) at (7.5,-2.6) {\textit{Developpement}};
+% \fill[green,fill opacity=.2,rounded corners=10]
+% (-1.5,.7)--++(3,0)--++(0.5,-3.4)--++(6.8,0)--++(0,-2)--++(-10.3,0)--cycle;
+% \node[green!80!black,below] (dev) at (7.5,-2.7) {\textit{Publishing}};
+% \node[box,text width=2cm] (tex) {\texttt{.tex} source file};
+% \node[rectangle,fill=white,draw,align=center,text
+% width=1.5cm,below=of tex] (compfinal) {\LaTeX{}\\ engine};
+% \node[rectangle,fill=white,draw,align=center,text width=1.5cm,right=of tex,xshift=4.5cm]
+% (compdraft) {\LaTeX{}\\ engine};
+% \node[box,right=of compfinal,xshift=.5cm] (pdf) {\texttt{.pdf} file for proofreading};
+% \node[rectangle,fill=white,draw,align=center,text width=2cm,below=of compfinal] (extern)
+% {Picture\\processing};
+% \draw (pdf|-extern) node[box,anchor=center] (xml) {\texttt{.xml} file\\\footnotesize(pictures embedded)};
+% \draw (compdraft|-xml)
+% node[rectangle,fill=white,draw,align=center,text width=1.5cm,anchor=center] (moodle)
+% {Moodle\\Server};
+% \draw (tex) edge [post,bend right=10] node[cmnt,pos=.5,left] {\texttt{final}} (compfinal);
+% \draw (tex) edge [post,bend left=10] node[cmnt,pos=.5,below] {\texttt{draft}} (compdraft);
+% \draw (compdraft) edge [post,bend left=10] (pdf);
+% \draw (compfinal) edge [post] (pdf);
+% \draw (compfinal) edge [post,bend left=10] (xml);
+% \draw (compfinal) edge [post,bend right=30] node[cmnt,black!40,pos=.5,text width=1cm,left]
+% {\texttt{tikz}, \texttt{.png}, \texttt{.jpg}} (extern);
+% \draw (extern) edge [post,green,bend right=30] node[cmnt,black!40,pos=.5,below,right]
+% {\texttt{base64}} (compfinal);
+% \draw (pdf) edge [post,red,bend right=15] node[sloped,cmnt,pos=.5,above] {improve} (tex);
+% \draw (xml) edge [post,red] node[cmnt,pos=.5,below] {import} (moodle);
+% \end{tikzpicture}
+% \caption{Block diagram describing a typical workflow using the \textsf{moodle} package.}
+% \label{fig:workflow}
+% \end{figure}
+%
% \section{Usage}\label{sect:usage}
% \subsection{Example Document}
%
@@ -177,35 +244,34 @@
% and editing Moodle quizzes through the web interface.
% The |xkeyval| package is used to provide a key-value interface.
% Here is a simple example document:
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \documentclass[12pt]{article}
-% \usepackage{moodle}
-%
+% \usepackage[section]{moodle}
+% \moodleregisternewcommands
+% \newcommand\monomial[1]{x^{#1}}
+% \newcommand\sillyanswer{What!?}
% \begin{document}
-%
% \begin{quiz}{My first quiz}
% \begin{numerical}[points=2]{Basic addition}
% What is $8+3$?
% \item 11
% \end{numerical}
-%
-% \begin{shortanswer}[case sensitive=true]{Newton's name}
+% \begin{shortanswer}[usecase]{Newton's name}
% What was Newton's first name?
% \item Isaac
-% \item[fraction=0, feedback={No, silly!}] Fig
-% \item{fraction=0} Sir
+% \item[fraction=0, feedback={\sillyanswer}] Fig
+% \item[fraction=0] Sir
% \end{shortanswer}
-%
% \begin{multi}[points=3]{A first derivative}
-% What is the first derivative of $x^3$?
-% \item $\frac{1}{4} x^4+C$
-% \item* $3x^2$
-% \item $51$
+% What is the first derivative of $\monomial{3}$?
+% \item $\frac{1}{4}\monomial{4}+C$
+% \item[feedback={yes!}]* $3\monomial{2}$
+% \item[feedback={\sillyanswer}] $51$
% \end{multi}
% \end{quiz}
-%
% \end{document}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Key features to note in this first example are that a |quiz| environment
% contains several question environments.
% Each question takes a name as a mandatory argument,
@@ -214,39 +280,102 @@
% such as |itemize| or |enumerate|, in that answers are set off by
% |\item|'s, but the question itself is the text that occurs before
% the first |\item|.
+%
+%^^A \DescribeMacro{\moodleregisternewcommands}\DescribeMacro{\htmlregister}
+%^^A Calling |\moodleregisternewcommands| tells the package to treat
+%^^A specifically the macros defined subsequently.
+%^^A This way, the macros that Moodle's \LaTeX\ renderer does not know
+%^^A about can be properly expanded in the XML file.
+%^^A This mechanism applies only to the macros defined using |\newcommand|
+%^^A and \emph{without} optional argument.
+%^^A Using |\htmlregister|\marg{macroname}, lets you declare a specific
+%^^A macro for expansion. This mechanism, instead, also applies to the
+%^^A macros defined using \TeX's primitive |\def|.
%
+% \subsection{Package Options}
% \DescribeMacro{draft}
-% If the package option |draft| is invoked, by calling |\usepackage[draft]{moodle}|,
-% then no XML file will be generated. This is especially useful while editing a quiz
-% containing graphics, so as to avoid the time spent converting image files.
+% \DescribeMacro{final}
+% If the package option |draft| is invoked, by calling
+% |\usepackage[draft]{moodle}| or |\documentclass[draft]{...}|, then no
+% XML file will be generated. This is especially useful while editing a
+% quiz containing graphics, so as to avoid the time spent converting
+% image files. The package option |final| might be useful if one wants
+% to avoid the option |draft| to be inherited from the |documentclass|.
+%
+% \DescribeMacro{handout}
+% If the package option |handout| is invoked (|\usepackage[handout]{moodle}|),
+% the PDF file is generated clean from teacher-only information (answers,
+% points, penalty, feedback, tags) and, hence, can be given to students for
+% classroom work. In particular, as would Moodle do, answers in
+% \texttt{matching} questions are shuffled and the option \texttt{shuffle}
+% triggers the shuffling of choices offered (\texttt{multi} and
+% \texttt{matching}). This is achieved thanks to the package
+% \texttt{randomlist}, loaded if the option is invoked.
+% The XML file is generated as usual.
+%
+% \DescribeMacro{nostamp}
+% By default, the package will output a stamp as a comment in the XML
+% file. This stamp contains information gathered about the TeX engine,
+% the operating system used and the package version. For instance:
+% \begin{quote}\small
+% |<!-- This file was generated on 2020-11-30 by LuaLaTeX -->|\\
+% |<!-- running on Linux with the package moodle |\texttt{\fileversion}| -->|
+% \end{quote}
+% The package option
+% |nostamp| prevents this stamp to be written in the XML file.
+%
+% \DescribeMacro{section}
+% \DescribeMacro{section*}
+% \DescribeMacro{subsection}
+% \DescribeMacro{subsection*}
+% If the package option |section| is invoked (|\usepackage[section]{moodle}|),
+% then each quiz is represented by a different \LaTeX\ section. Starred
+% variants correspond to unnumbered sections or subsections. To preserve
+% compatibility with Version 0.5 of this package, the default is |subsection*|.
+% Consequently, |\usepackage{moodle}| is equivalent to
+% |\usepackage[subsection*]{moodle}|.
+%
+% \DescribeMacro{tikz} The package option \texttt{tikz} is described in section
+% \ref{subsec:tikz}.
+%
+% \DescribeMacro{svg} The package option \texttt{svg} is described in section
+% \ref{subsec:svg}.
%
-% \newpage
% \subsection{Quiz and Question Environments}
%
% \DescribeMacro{quiz}
% A |.tex| document to generate Moodle quizzes contains one or more
% |quiz| environments, within which various question environments are nested.
-% The required argument to the |quiz| environment names the ``question bank''
-% to which the questions inside will belong after being uploaded to moodle.
+% The required argument to the |quiz| environment names a category for Moodles
+% ``question bank'': after import, the questions defined in this environment
+% will be gathered in this category.
% \begin{center}
-% |\begin{quiz}|\oarg{options}\marg{question bank name}%
+% |\begin{quiz}|\oarg{options}\marg{category name}%
% \end{center}
% There are no |quiz|-specific options,
% but any \meta{options} set with |\begin{quiz}|
% will be inherited by all questions contained within that |quiz| environment.
%
% \DescribeMacro{\moodleset}
-% Options may also be set at any time with |\moodleset|\marg{options};
-% these changes are local to \TeX-groups.
-% \bigskip
+% Options may also be set outside question environments with
+% |\moodleset|\marg{options}; these changes are local to \TeX-groups.
+%
+% \DescribeMacro{\setcategory}\DescribeMacro{\setsubcategory}
+% Although the |quiz| environment defines a category by its own, one can change
+% the current category inside the quiz environment and in between questions,
+% using the macro |\setcategory|\marg{category name}. A subcategory can also be
+% defined with |\setsubcategory|\marg{subcategory name}. The categories and
+% subcategories are reflected in the PDF file as sections, subsections, or
+% subsubsections, in accordance to the package setting |section|, |section*|,
+% |subsection|, or |subsection*|.
%
% The syntax for each question environment is
% \begin{quote}
% |\begin|\marg{question type}\oarg{question options}\marg{question name} \\
% \rule{2em}{0pt}\meta{question text} \\
-% \rule{2em}{0pt}|\item| \meta{item} \\
+% \rule{2em}{0pt}|\item|\oarg{item options} \meta{item} \\
% \rule{2em}{0pt}\quad$\vdots$ \\
-% \rule{2em}{0pt}|\item| \meta{item} \\
+% \rule{2em}{0pt}|\item|\oarg{item options} \meta{item} \\
% |\end|\marg{question type}
% \end{quote}
% The meaning of the \meta{item}s varies depending on the question type,
@@ -268,13 +397,54 @@
% \DescribeMacro{fraction}
% In most question types, it is possible to designate some answers as being
% worth partial credit---that is, some fraction of a completely correct answer.
-% The |fraction| key may be set to any integer from |0| (entirely wrong) to |100| (entirely correct).
+% The |fraction| key may be set to any of the values given in Table~\ref{tab:fraction},
+% from |0| (entirely wrong) to |100| (entirely correct).
+%
+% \begin{table}[tbp]
+% \centering
+% \caption{\href{https://github.com/moodle/moodle/blob/MOODLE\_310\_STABLE/question/engine/bank.php\#L339}{Valid positive options} for the \texttt{fraction} key: $100\cdot(p/q)$.}
+% \label{tab:fraction}
+% \footnotesize
+% \begin{tabular}{l*{10}{l}}
+% \toprule
+% Denominator $q$ & \multicolumn{10}{c}{Numerator $p$}\\
+% \cmidrule{2-11}
+% & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9\\
+% \cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% \cmidrule(lr){5-5}\cmidrule(lr){6-6}\cmidrule(lr){7-7}\cmidrule(lr){8-8}
+% \cmidrule(lr){9-9}\cmidrule(lr){10-10}\cmidrule(lr){11-11}
+% 20 & 0&5&&&&&&&&\\\cmidrule(lr){1-1}
+% 10 & &10&20&30&40&50&60&70&80&90\\\cmidrule(lr){1-1}
+% 9 & &11.11111&&&&&&&&100\\\cmidrule(lr){1-1}
+% 8 & &12.5&&&&&&&100&\\\cmidrule(lr){1-1}
+% 7 & &14.28571&&&&&&100&&\\\cmidrule(lr){1-1}
+% 6 & &16.66667&&&&83.33333&100&&&\\\cmidrule(lr){1-1}
+% 5 & &20&&&80&100&&&&\\\cmidrule(lr){1-1}
+% 4 & &25&&75&100&&&&&\\\cmidrule(lr){1-1}
+% 3 & &33.33333&66.66667&100&&&&&&\\\cmidrule(lr){1-1}
+% 2 & &50&100&&&&&&&\\\cmidrule(lr){1-1}
+% 1 & 0&100&&&&&&&&\\\cmidrule(lr){1-1}
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% In questions where several choices can be selected (see |multi| with the option
+% |multiple|), positive fractions must sum up to exactly 100. It is also possible to set
+% negative fractions (from -100 to 0) for wrong choices, in order to prevent the
+% selection of all choices from leading to a good grade.
+% In this case, the value ranging from -100 to 0 must be the opposite of one of the
+% values listed in Table~\ref{tab:fraction}.
%
+% \DescribeMacro{fractiontol}
+% The package tries to match the |fraction| key to one of the admissible values.
+% To this end, the tolerance is controlled by the |fractiontol| key. It defaults
+% to |0.01| but may be changed. When no admissible fraction value is matched, the
+% package throws an error.
+%
% \DescribeMacro{feedback}
% The |feedback| key sets text that will appear to the student after completing the quiz.
% For example, one might set
% \begin{center}
-% |feedback={A question like this will appear on the exam.}|
+% |feedback={This question might show up in the final exam.}|
% \end{center}
% The desired feedback should be included in braces.
%
@@ -282,13 +452,56 @@
% question, then that feedback will appear to each student regardless of the student's answer.
% Answer-specific feedback (perhaps explaining a common mistake)
% may also be given by setting the |feedback| key \emph{at the individual answer}.
+%
+% \DescribeMacro{tags}
+% The |tags| key sets a keyword for the question that will be taken into account by Moodle for
+% filtering purposes or classification of questions inside the question bank. It is possible
+% for instance to build a quiz with questions cherry-picked among the set of questions holding
+% a particular tag.
+% For example, one might set
+% \begin{center}
+% |tags={easy}|
+% \end{center}
+% The desired tag should be included in braces.
+%
+% Tags can be assigned at two levels. If the |tags| key is set at the quiz level,
+% then that tags will be assigned by default to each question of the quiz.
+% Question-specific tags can be assigned by setting the |tags| key \emph{at the question level}.
+% Since only single tag is supported, the tag a the question-level overrides eventual tags
+% specified at the quiz-level.
%
-% \newpage
% \subsection{Question Types}
%
-% We next discuss the various question types supported by \textsf{moodle.sty}
+% We next discuss the various question types supported by \textsf{moodle}
% and the options that may be set.
+%
+%\subsubsection{True/False}
+%
+% \DescribeMacro{truefalse}
+% The syntax for a True/False question is as follows:
+% \begin{quote}
+% |\begin{truefalse}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% \rule{2em}{0pt}|\item*| \meta{feedback when ``true" is chosen} \\
+% \rule{2em}{0pt}|\item| \meta{feedback when ``false" is chosen} \\
+% |\end{truefalse}|
+% \end{quote}
+% The correct answer is designated by the asterisk |*| after the |\item|;
+% it need not appear first in the list.
+%
+% Answer-specific feedback can also be defined as an item option, similarly to
+% other types.
+% \begin{quote}
+% |\begin{truefalse}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% \rule{2em}{0pt}|\item[feedback={|\meta{When ``true" is chosen}|}]*| \\
+% |\end{truefalse}|
+% \end{quote}
+% Note that, in this example, no feedback is defined for the incorrect answer
+% ``False": the corresponding item can be omitted.
%
+% With the True/False question type, the |penalty| key has no effect.
+%
% \subsubsection{Multiple Choice}
%
% \DescribeMacro{multi}
@@ -319,54 +532,66 @@
% which mirror the usual \LaTeX\ syntax:
% |alph|, |Alph|, |arabic|, |roman|, |Roman|, and |none|.
% Calling |numbering=none| produces an unnumbered list of answers.
-% The Moodle syntax of |abc|, |ABC|, |123|, |iii|, and |IIII| is also acceptable,
-% but note that it requires \emph{four} |I|'s to obtain upper-case Roman numerals this way.
+% The Moodle syntax of |abc|, |ABCD|, |123|, |iii|, and |IIII| is also
+% acceptable,
+% but note that it requires \emph{four} capital letters to obtain
+% upper-case Roman or alphabetic numerals this way.
%
% \DescribeMacro{fraction}
% The |fraction| key can be used to designate some wrong answers
% as being worth partial credit. For example, a question might read thus:
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{multi}{my question}
% Compute $\int 4x^3\,dx$.
% \item* $x^4+C$
% \item[fraction=50] $x^4$
% \item $12x^2$
% \end{multi}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Thus the asterisk |*| is shorthand for |fraction=100|,
% whereas a bare |\item| sets |fraction=0|.
%
-% \DescribeMacro{single}\DescribeMacro{multiple}
+% \DescribeMacro{single}
% By default, the |multi| environment produces
-% a multiple choice question operates with only one correct answer;
+% a multiple choice question with only one correct answer;
% this is called |single| mode, and on Moodle it appears with radio buttons.
-% It is also possible to write questions with more than one correct answer,
-% asking the user to check all correct answers.
-% To do this, use the key |multiple| or |single=false|.
-%
+%
+% \DescribeMacro{multiple}
+% It is also possible to write questions with possibly more than one correct answer,
+% asking the user to check all correct answers. To do this, use the key |multiple|
+% or |single=false|.
% The worth of each correct answers in |multiple| mode may be set by |fraction|,
-% but Moodle will require that all the fractions add up to at least 100.
-% If you simply designate each correct answer with |\item*|, then \textsf{moodle.sty}
-% will divide the 100\% equally among those answers.
-% For example, the following two examples produce equivalent results:
-% \begin{verbatim}
+% but Moodle asks that all the fractions add up to \emph{exactly} 100.
+% If you simply designate each correct answer with |\item*|, then \textsf{moodle}
+% will divide equally among those answers the points lefts for a sum of 100\%.
+% Items that are not given a |fraction| are considered incorrect and selecting them
+% results in negative points such that the sum of all incorrect answers is -100\%.
+% For example, the following two examples are equivalent:
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{multi}[multiple]{my question}
% Which numbers are prime?
+% \item[fraction=20] 2
% \item* 5
-% \item 6
% \item* 7
+% \item[fraction=-10] 1
+% \item 6
% \item 8
% \end{multi}
-% \end{verbatim}
-% \begin{verbatim}
+%
% \begin{multi}[multiple]{my question}
% Which numbers are prime?
-% \item[fraction=50] 5
-% \item 6
-% \item[fraction=50] 7
-% \item 8
+% \item[fraction=20] 2
+% \item[fraction=40] 5
+% \item[fraction=40] 7
+% \item[fraction=-10] 1
+% \item[fraction=-45] 6
+% \item[fraction=-45] 8
% \end{multi}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
+% Note that, in this example, negative fractions are set for wrong choices. This
+% prevents students selecting all options to obtain a good grade with no merit.
%
% \subsubsection{Numerical}
%
@@ -387,8 +612,41 @@
% \begin{quote}\footnotesize
% |\item[fraction=0,feedback={You forgot to antidifferentiate!}]| \meta{incorrect answer}
% \end{quote}
+%
+% \DescribeMacro{tolerance}
+% The |tolerance| key can be used to specify the validity of answers within some margin.
+% This key can be set at different levels: quiz, question, item.
+% For example, with the question
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{numerical}[tolerance=0.01]{my question}
+% Approximate value of $\sqrt{2}$?
+% \item[tolerance={1e-1}] 1.4142
+% \item[fraction=20,feedback={twice this!}] 7.0711e-1
+% \item[fraction=0,feedback={Wrong!}] *
+% \end{numerical}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
+% In this example,
+% \begin{itemize}
+% \item any answer in the range $[1.4042,1.4242]$ will be validated,
+% \item any answer in the range $[0.69711,0.71711]$ will get the specific feedback
+% \emph{twice this!} and 20\% of points,
+% \item any other answer is incorrect and will get the specific feedback
+% \emph{Wrong!}.
+% \end{itemize}
+%
+% When feedback is to be given for any non-specified answer, one can add a \emph{last} answer
+% item containing the wilcard character |*| only. In this case, the |tolerance| key is irrelevant.
+%
+% Both answers and tolerance can be specified with the comma (|,|) as a decimal separator.
+% Exponent notation is accepted. After import, Moodle will recognize indifferently |0.000165|,
+% |0,000165|, |1.65E-4|, |1.65e-4|, |1,65E-4|, and |1,65e-4|.
+%
+% If the \textsf{siunitx} package is loaded, \textsf{moodle} will detect it and
+% numbers will be rendered nicely in the PDF output.
%
-% \newpage
+% Units, unit-handling and multipliers are currently unsupported.
+%
% \subsubsection{Short Answer}
% A short answer question resembles a numerical question: the student is to fill
% in a text box with a missing word or phrase.
@@ -403,25 +661,40 @@
% You can make the text box appear as part of the question with the
% control sequence |\blank|. For example,
% your question might read
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{shortanswer}{Leibniz}
% Newton's rival was Gottfried Wilhelm \blank.
% \item Leibniz
% \item Leibniz.
% \end{shortanswer}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Note that as the blank occurred at the end of a sentence,
% we included two answers,
% lest students get the question wrong merely by
% including or omitting a period.
%
% \DescribeMacro{case sensitive}\DescribeMacro{usecase}
-% By default, Moodle ignores the distinction between upper- and lower-case letters
-% when grading a short answer question.
+% The default setting when creating a Short Answer question in Moodle
+% is to ignore the distinction between upper- and lower-case letters
+% when grading a short answer question. This default is preserved by
+% \textsf{moodle}.
% You can make a question case-sensitive with the key |case sensitive|
% or its shorter synonym |usecase|.
+%
+% The wildcard character |*| can used to grab answers that match
+% a specific pattern. For instance:
+% \begin{itemize}
+% \item ``\emph{Sir Isaac Newton}'', ``\emph{Isaac Newton}'' and
+% ``\emph{Newton}'' will match the pattern |*Newton|,
+% \item ``\emph{Gaston}'' and ``\emph{Wellington}'' will match the
+% pattern |*ton|,
+% \item ``\emph{Isaac}'' and ``\emph{Isaac Newton}'' will match the
+% pattern |Isaac*|,
+% \item any non empty answer will match the pattern |*| (wildcard alone).
+% \end{itemize}
%
-% \subsubsection{Essay Questions}
+% \subsubsection{Essay}\label{subsubsect:essay}
% Instructors may ask essay questions on a Moodle quiz,
% although Moodle's software is not up to the task of grading them!
% Instead each essay question answer must be graded manually by the
@@ -443,22 +716,23 @@
% If the |response required| key is set, Moodle will insist that the student
% enter something in the blank before accepting the quiz as completed.
%
-% \newpage
% \DescribeMacro{response format}
% Moodle offers five different ways for students to enter and/or upload their
% answers to an essay question. You may choose one of these five options:
% \begin{description}
-% \item[{\tt html}] An editor with the ability to format HTML responses
+% \item[{\ttfamily html}] An editor with the ability to format HTML responses
% including markup for italics, boldface, etc. This is the default.
-% \item[{\tt file}] A file picker allowing the student to upload a file, such as
-% a PDF or DOC file, containing the essay.
-% \item[{\tt html+file}] The same HTML editor as above, but with the ability
-% to upload files as well. This permits some students to type answers
-% directly into the web form, and others to compose their essays in
-% another program first.
-% \item[{\tt text}] This editor allows only for entering plain text without any markup.
-% \item[{\tt monospaced}] This yields a plain text editor, without any markup,
-% and with a fixed-width font. This could be useful for entering code snippets, for example.
+% \item[{\ttfamily file}] A file picker allowing the student to upload a
+% file, such as a PDF or DOC file, containing the essay.
+% \item[{\ttfamily html+file}] The same HTML editor as above, but with the
+% ability to upload files as well. This permits some students to type
+% answers directly into the web form, and others to compose their
+% essays in another program first.
+% \item[{\ttfamily text}] This editor allows only for entering plain text
+% without any markup.
+% \item[{\ttfamily monospaced}] This yields a plain text editor, without any
+% markup, and with a fixed-width font. This could be useful for
+% entering code snippets, for example.
% \end{description}
%
% \DescribeMacro{response field lines}
@@ -473,16 +747,16 @@
% You may also require the student to upload a certain number of attachments
% by setting |attachments required| to |0|, |1|, |2|, or |3|.
%
-% \DescribeMacro{response template}
+% \DescribeMacro{template}
% Finally, you may preload the essay question with a template that the student
-% will edit and/or type over, with the key |response template=|\marg{template}.
+% will edit and/or type over, with the key |template=|\marg{template}.
% The \meta{template} should be enclosed in braces.
%
-% \subsection{Matching Questions}
+% \subsubsection{Matching}
%
% A matching question offers a series of subquestions
% and a set of possible answers from which to choose.
-% If there are $m$ questions and $n$ possible answers,
+% If there are $m$ questions and $n\geq m$ possible answers,
% a matching question will look like this:
%
% \begin{quote}
@@ -508,19 +782,18 @@
% permute the questions and answers; by default |shuffle=true|.
%
% \DescribeMacro{drag and drop}\DescribeMacro{dd}
-% Moodle has two formats for matching questions.
-% The older matching question offered a dropdown box
-% for choosing the answer to each question;
-% the newer ``drag and drop matching'' format
+% The standard matching question offered by Moodle corresponds to
+% a dropdown box for choosing the answer to each question.
+% There also exists a ``drag and drop matching'' plugin for Moodle that
% shows all questions in one column,
% all answers in a second column, and allows students to drag the correct
% answer to the question using a mouse.
-% To enable drag-and-drop matching, use the key `|drag and drop|' or `|dd|' for
-% short. The default is |dd=false|. If you choose the older format,
-% then due to the limitations of dropdown boxes, no \LaTeX\ or HTML code can be used
-% in the answers.
+% In this package, to enable drag-and-drop matching, use the key
+% `|drag and drop|' or `|dd|' for short. The default is |dd=false|.
+% If you choose the standard format, then due to the limitations of
+% dropdown boxes, no \LaTeX\ or HTML code can be used in the answers.
%
-% \subsection{Cloze Questions}
+% \subsubsection{Cloze Questions and Subquestions}
%
% A ``cloze question'' has one or more subquestions embedded within a passage of text.
% For example, you might ask students to fill in several missing words within
@@ -528,10 +801,10 @@
% To encode cloze questions in \LaTeX\ using this package is easy:
% you simply nest one or more |multi|, |shortanswer|, or |numerical| environments
% within a |cloze| environment, as in the following example:
-% \begin{verbatim}
-% \begin{cloze}{my cloze question} \\
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{cloze}{my cloze question}
% Thanks to calculus, invented by Isaac
-% \begin{shortanswer}
+% \begin{shortanswer}[usecase]
% \item Newton
% \end{shortanswer},
% we know that the derivative of $x^2$ is
@@ -542,80 +815,207 @@
% \end{multi}
% and that $\int_0^2 x^2\,dx$ equals
% \begin{numerical}
-% \item[tolerance=0.0004] 2.667
+% \item[tolerance={4e-4}] 2.667
% \end{numerical}.
% Thanks, Isaac!
% \end{cloze}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Note that when used as a subquestion within a cloze question,
% |\begin{multi}| is \emph{not} followed by name in braces;
% the same is true for the |shortanswer| and |numerical|
% environments.
%
-% \DescribeMacro{vertical}\DescribeMacro{horizontal}
-% Within a cloze question, by default a multiple choice question is implemented
-% as an inline dropdown box. This is visually compact, but it also prevents the
-% use of mathematical or HTML formatting.
+% \DescribeMacro{single=true}\DescribeMacro{single=false}\DescribeMacro{multiple}
+% Before Moodle version 3.5, within a cloze question, a multiple choice question
+% was necessarily of type |single|, i.e. with a single good answer. If you intend
+% to export your quiz to Moodle 3.5+, the option |multiple| can be used, when
+% multiple good answers are to be found.
+%
+% \DescribeMacro{vertical}\DescribeMacro{horizontal}\DescribeMacro{inline}
+% Within a cloze question, by default, a multiple choice question is implemented
+% as an |inline| dropdown box. This is visually compact, but it also prevents
+% the use of mathematical or HTML formatting.
% Adding the option |vertical| displays the subquestion as a vertical column
% of radio buttons instead; likewise the option |horizontal| creates a horizontal
% row of radio buttons.
+% The option |inline| is incompatible with |multiple| or |single=false|
+% (dropdown boxes don't let you pick up several answers!).
+%
+% \DescribeMacro{shuffle}
+% Starting from Moodle version 3.0, within a cloze question, the items of a
+% multiple choice question can be shuffled. Setting |shuffle=false| will
+% guarantee that the answer appear in the order they were typed; the
+% default is |shuffle=true|.
+%
+% \DescribeMacro{case sensitive}\DescribeMacro{usecase}
+% Within a cloze question, the short answer question can be made case sensitive.
+% This option, disabled by default, is selected with |case sensitive| or |usecase|.
+%
+%\subsubsection{Description}
+%
+% The Moodle description type is not really a question. It is more like a label.
+% One can set a |feedback| that the student gets when reviewing the submission.
+% Tags can be set as well.
+%
+% For descriptions, \textsf{moodle} redefines the existing |description| environment.
+%
+% The syntax for a Description question is as follows:
+% \begin{quote}
+% |\begin{description}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% |\end{description}|
+% \end{quote}
+%
+% \subsection{Summary of the Key Options}
+%
+% Table~\ref{tab:key-options} summarizes the key options available at the question
+% and answer levels depending on the question type. For the essay questions,
+% please refer to section~\ref{subsubsect:essay}.
+%
+% \begin{table}[tbp]
+% \centering
+% \caption{Options offered at the question and answer levels for each question type.}
+% \label{tab:key-options}
+% \small
+% \begin{tabular}{*{14}{l}}
+% \toprule
+% & \multicolumn{10}{l}{Question} & \multicolumn{3}{l}{Answer}\\
+% \cmidrule(lr){2-11}\cmidrule(lr){12-14}
+% Question type & \rotatebox{90}{points} &
+% \rotatebox{90}{penalty} & \rotatebox{90}{feedback} & \rotatebox{90}{tags} &
+% \rotatebox{90}{shuffle} & \rotatebox{90}{numbering} & \rotatebox{90}{multiple} &
+% \rotatebox{90}{usecase} & \rotatebox{90}{tolerance} &\rotatebox{90}{dd} &
+% \rotatebox{90}{fraction} & \rotatebox{90}{feedback} &
+% \rotatebox{90}{tolerance}\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}
+% \cmidrule(lr){4-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}\cmidrule(lr){7-7}
+% \cmidrule(lr){8-8}\cmidrule(lr){9-9}\cmidrule(lr){10-10}\cmidrule(lr){11-11}
+% \cmidrule(lr){12-12}\cmidrule(lr){13-13}\cmidrule(lr){14-14}
+% \href{https://docs.moodle.org/35/en/Multiple_Choice_question_type}
+% {Multichoice} & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ &
+% $\bullet$ & $\bullet$ & $\bullet$ & & & & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Numerical_question_type}{Numerical}
+% & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & &
+% & & $\bullet$ & & $\bullet$ & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Short-Answer_question_type}{Short
+% Answer} & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & &
+% & $\bullet$ & & & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Matching_question_type}{Matching}
+% & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & &
+% & & & $\bullet$ & $\bullet$ & \\
+% \href{https://docs.moodle.org/35/en/True/False_question_type}
+% {True/False} & $\bullet$ & & $\bullet$ & $\bullet$ & & &
+% & & & & & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Description_question_type}
+% {Description} & & & $\bullet$ & $\bullet$ & & &
+% & & & & & \\
+% ^^A\href{https://docs.moodle.org/35/en/Essay_question_type}{Essay} & \\\hline%
+% \href{https://docs.moodle.org/35/en/Embedded_Answers_(Cloze)_question_type}{Cloze}
+% & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & &
+% & & & & & \\\cmidrule(lr){1-1}
+% \hspace{1em}Numerical & $\bullet$ & & & & & &
+% & &$\bullet$ & & $\bullet$ & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Short Answer & $\bullet$ & & & & & &
+% & $\bullet$ & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (regular) & $\bullet$ & & & & $\bullet$ & & $\bullet$
+% & & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (horizontal)& $\bullet$ & & & & $\bullet$ & & $\bullet$
+% & & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (vertical)& $\bullet$ & & & & $\bullet$ & &
+% & & & & $\bullet$ & $\bullet$ \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
%
% \section{Conversion to HTML}
%
% Questions should be typed as usual for \LaTeX,
-% including |\$| to obtain dollar signs, |$|'s for math shifts,
-% |$$|'s for display math, et cetera.
+% including |\$| to obtain dollar signs, |$|'s or |\(|...|\)| for math shifts,
+% |$$|'s or |\[|...|\]| for display math, et cetera.
% The package \textsf{moodle.sty} automatically converts
% this \LaTeX\ code into HTML for web display.
%
-% The following table lists \LaTeX\ commands and environments that
-% will be converted to HTML:
-% \begin{center}
-% \begin{tabular}{lll}
-% |~| & |\#| & |\$| \\
-% |\&| & |\\| & |\S| \\
-% |\{| & |\}| & {\tt\catcode`\ =12\relax\catcode`\\=12\relax\ }\\
-% |\emph| & |\textbf| & |\par| \\
-% |\ldots| & |\dots| & |\relax| \\
-% |\euro| & |\texteuro| \\
-% |\begin{center}| \\
-% |\begin{enumerate}| \\
-% |\begin{itemize}| \\
-% |\begin{tikzpicture}| \\
-% \end{tabular}
-% \end{center}
-% Single and double quotation marks and the diacritical commands |\^|, |\'|, |\`|, |\"|, |\~|, and |\H| are also handled,
-% as are the characters |\aa|, |\ae|, |\o|, |\ss|, |\l|, and their capitalizations.
+% Table~\ref{tab:html} lists \LaTeX\ macros, commands, and environments that
+% are specifically converted to HTML.
+% \begin{table}[tbp]
+% \centering
+% \caption{Conversion of \LaTeX\ material to HTML.}
+% \label{tab:html}
+% \begin{tabular}{llll}
+% \toprule
+% \multicolumn{2}{l}{Macros} & Commands & Environnments \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% |~| & |\#| &|\emph{}| & |\begin{center}|\\
+% |\$| & |\&| &|\textbf{}| & |\begin{enumerate}|\\
+% |\\| & |\par| &|\textit{}| & |\begin{itemize}|\\
+% |\&| & |\S| & |\texttt{}| & |\begin{tikzpicture}|\\
+% |\{| & |\}| & |\textsc{}| & \\
+% |\|\textvisiblespace & |\relax| & |\underline{}| &\\
+% |\,| & |\thinspace| & |\textsuperscript{}| & \\
+% |\dots| & |\ldots| & |\up{}| & \\
+% |\euro| & |\texteuro| & |\fup{}| & \\
+% |\TeX| & |\LaTeX|& |\textsubscript{}| & \\
+% |\_| & |\textbackslash| & |\url{}| & \\
+% & & |\href{}{}| & \\
+% & & |\tikz[]{}| & \\
+% & & |\includegraphics[]{}| & \\
+% & & |\verbatiminput{}| & \\
+% & & |\VerbatimInput[]{}| & \\
+% & & |\LVerbatimInput[]{}| & \\
+% & & |\BVerbatimInput[]{}| & \\
+% & & |\inputminted[]{}{}| & \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% Single and double quotation marks, french quotation marks, inverted exclamation and
+% question marks, and the diacritical
+% commands |\^|, |\'|, |\`|, |\"|, |\~|, |\c|, |\H|, |\u| and |\v| are also handled,
+% as are the characters |\aa|, |\ae|, |\l|, |\oe|, |\o|, |\ss|, and their
+% capitalizations. See Tables~\ref{tab:diacritical}, \ref{tab:ligatures}, and
+% \ref{tab:other} for more details.
%
% In addition, |<| and |>| will be converted to |&lt;| and |&gt;| \emph{within math mode only}.
% If they should be typed outside of math mode, they will be passed as typed to
% the HTML, and probably interpreted by students' browsers as HTML tags
% or other unpredicated results.
%
-% Be aware that \emph{\textsf{moodle.sty} does not know how to convert any
+% Be aware that \emph{\textsf{moodle} does not know how to convert any
% other \TeX\ or \LaTeX\ commands to HTML.}
% If other sequences are used, they may be passed verbatim to the XML file
% or may cause unpredicted results.
+% \DescribeMacro{\htmlregister}The |\htmlregister| command lets you specify
+% the macros that must be expanded in the XML file. It works only when no
+% optional argument is used.
+%
+% \DescribeMacro{\moodleregisternewcommands}
+% When the list of macros is long, it becomes cumbersome to record them
+% individually for expansion.
+% Calling |\moodleregisternewcommands| triggers the automatic
+% expansion of macros defined subsequently using |\newcommand|,
+% |\renewcommand|, |\providecommand|, or their starred variants.
+% Again, this works only if the macros are defined \emph{without} optional
+% argument.
%
% If you think of another \LaTeX\ command that should be changed to an HTML equivalent,
-% please contact the author at \url{anders.hendrickson@snc.edu}
+% please contact the maintainer at \url{guerquin-kern AT crans.org}
% so that it may be added to a future revision of the package.
%
% \section{Graphics}
-% The \textsf{moodle.sty} package can handle two kinds of graphics seamlessly.
+% The \textsf{moodle} package can handle two kinds of graphics seamlessly.
% External graphics files may be included with the |\includegraphics| command
-% from the |graphicx| package,
-% and graphics may be generated internally using \TikZ. In either case, the
-% graphics will be embedded in base-64 encoding directly within
+% from the |graphicx| package, and graphics may be generated internally using \TikZ.
+% In either case, the graphics will be embedded in base-64 encoding directly within
% the Moodle~XML produced. This prevents the hassle of managing separate
% graphics files on the Moodle server, as Moodle will store the picture
% within the question in the question bank.
%
+% \subsection{Default \texttt{includegraphics}}
% \DescribeMacro{\includegraphics}\DescribeMacro{height}\DescribeMacro{width}
% When using |\includegraphics|, the only options currently supported
% are |height| and |width|. Attempts to use other |\includegraphics| options,
% such as |scale| or |angle|, will affect the PDF but not the XML output.
-% The dimensions set by |height| and |width| are \TeX\ dimensions such as |4in| or |2.3cm|.
+% The dimensions set by |height| and |width| are \TeX\ dimensions such as \texttt{4\,in}
+% or \texttt{2.3\,cm}.
% In order to prepare the image for web viewing, this package converts those
% dimensions to pixels using a default of
% 103 pixels per inch.\footnote{This
@@ -627,11 +1027,50 @@
% That value may be changed by setting the |ppi| key (e.g., |ppi=72|);
% this is probably best done for the entire document with a |\moodleset| command,
% rather than image-by-image.
-%
-% The mechanism used is somewhat fragile and relies upon one \TikZ\ library and three free external programs.
+% \DescribeMacro{\graphicspath}
+% You can use |\graphicspath{{|\emph{path}|}}| to specify a directory where the
+% pictures to be included are located.
+%
+% A special rule was added for the inclusion of GIF pictures (|.gif| extension).
+% These files are passed as-is to the XML, preserving potential animations.
+% However, as pdf\TeX\ engines do not support the GIF format, the picture is
+% passed to the PDF output after a conversion to the PNG format. When the GIF
+% file is animated, only its first frame is passed to the PDF.
+%
+%^^A \DescribeMacro{\DeclareGraphicsAlien} Users may declare other graphic
+%^^A formats with the command |\DeclareGraphicsAlien|\marg{alien extension}
+%^^A \marg{native extension}\marg{command line for conversion}.
+%
+% \subsection{\TikZ\ Pictures}
+% When \TikZ\ is loaded and used to define pictures, \textsf{moodle} invokes
+% the |external| \TikZ\ library, so that each |tikzpicture| environment is compiled
+% to a freestanding PDF file.
+%
+% \subsection{Package Option \texttt{tikz}}\label{subsec:tikz}
+% \DescribeMacro{tikz}
+% The \textsf{moodle} package admits a \texttt{tikz} option which has the following effects:
+% \begin{itemize}
+% \item the package \texttt{tikz} is loaded.
+% \item \texttt{includegraphics} is embedded in a \TikZ\ picture. Consequences are that
+% \begin{itemize}
+% \item the pictures encoded in the XML file are resampled. This prevents encoding
+% images at a higher resolution than rendered by Moodle.
+% \item the full set of \texttt{includegraphics} options is accessible,
+% e.g.~|scale=.5|, |angle=90|, or |width=.2\textwidth|.
+% \end{itemize}
+% \item \DescribeMacro{\embedaspict} a macro |\embedaspict{...}| is provided for the
+% inclusion of inline \LaTeX\ material as images. This can serve as a workaround to
+% overcome limitations of this package---like the conversion of tabulars to HTML---
+% or limitations of Moodle itself.
+% For the definition of this macro, the package \texttt{varwidth} is loaded.
+% \item optimizations of the \TikZ-external library are disabled. Compilation might get
+% sensibly slower.
+% \end{itemize}
+%
+% \subsection{External Tools}
+% The mechanisms used for handling graphics are somewhat fragile and rely upon
+% three free external programs.
% \begin{enumerate}
-% \item \textsf{moodle.sty} invokes |\usetikzlibrary{external}|,
-% so that each |tikzpicture| environment is compiled to a freestanding PDF file.
% \item GhostScript (\url{www.ghostscript.com}) is used to convert the PDF output
% from \TikZ\ into a PNG raster graphics file.
% The default command line is presumed to be |gswin64c.exe|
@@ -639,75 +1078,459 @@
% or |gs| (if |\ifwindows| returns false).
% If your system requires a different command line to invoke Ghostscript,
% \DescribeMacro{\ghostscriptcommand}
-% you may change it by invoking |\ghostscriptcommand|\marg{executable filename}.
-% \item When external graphics files such as JPG or GIF are included,
+% you may change it by invoking:
+% \begin{quote}
+% |\ghostscriptcommand|\marg{executable filename}
+% \end{quote}
+% \item When external graphics files such as PDF are included,
% the open-source ImageMagick software (\url{www.imagemagick.org})
% converts each file to PNG format.
% The command line for ImageMagick is the nondescript word |convert|,
% \DescribeMacro{\imagemagickcommand}
% but may be changed by invoking |\imagemagickcommand|\marg{executable filename}.
-% \item Finally, the OpenSSL toolkit (\url{www.openssl.org}) is used to base64-encode
-% the PNG file so that it can be included directly in the text of the XML file.
-% The command line is presumed to be |openssl|, but can be changed with
-% \DescribeMacro{\opensslcommand}
-% |\opensslcommand|\marg{executable filename}.
+% \item OptiPNG (\url{http://optipng.sourceforge.net/}) is used to optimize the PNG images.
+% The command line is presumed to be |optipng|, but can be changed with
+% \DescribeMacro{\optipngcommand} |\optipngcommand|\marg{executable filename}.
% \end{enumerate}
%
% Please note the following vital points to make the graphics handling work:
% \begin{itemize}
% \item As of now, graphics are only supported when compiling directly to a PDF
-% with |pdflatex|. Including PS graphics or using \TikZ\ with the DVI$\to$PS workflow is not
+% with |pdflatex|. Including PS graphics or using \TikZ\ with the DVI$\to$PS workflow is not
% yet supported.
-% \item Filenames should not contains spaces or special characters like |_| or |\|.
-% \item You must have Ghostscript, ImageMagick, and OpenSSL installed on your system
-% to fully use the graphics-handling capabilities of \textsf{moodle.sty}.
+%^^A \item Filenames should not contains spaces or, under windows, special characters like |_| or |\|.
+% \item You must have Ghostscript and ImageMagick installed on your system
+% to fully use the graphics-handling capabilities of \textsf{moodle}.
+% \item If OptiPNG is not installed, the corresponding system calls will fail with otherwise no
+% impact on the compilation process: PNG files are passed unoptimized to the XML output.
% \item \LaTeX\ must be able to call system commands; that is, |\write18| must be enabled.
% For Mik\TeX, this means adding |--enable-write18| to the command line of |pdflatex|;
% for \TeX Live, this means adding |--shell-escape=true|.
+% \item Due to security issues with old versions of Ghostcript, some systems default to a
+% policy that prevents the conversion of PDF and PS to PNG. Assuming that, as a user of
+% \textsf{moodle} which requires shell escape capabilities, you either use a sandboxed
+% environment or trust the files handled at the system-level, you may want to disable this
+% over-zelous security policy. For example,
+% \href{https://stackoverflow.com/a/52661288/14608059}{see this}.
+% \item Users of the |circuitikz| package must enclose their circuits' \TikZ\ code in the
+% |tikzpicture| environment instead of |circuitikz|. That is required,
+% as of \TikZ\ 2.1, by the |external| library.
% \end{itemize}
+%
+% \subsection{Package Option \texttt{svg}}\label{subsec:svg}
+%
+% \paragraph{Important Notice} \emph{The \texttt{svg} option is an experimental feature
+% introduced in \textsf{moodle} v0.8. It has been tested exclusively under Linux, with
+% TeXLive 2020, Inkscape v1.0.1 and Scour 0.38.2.}
+%
+% \DescribeMacro{svg} The \textsf{moodle} package admits an experimental \texttt{svg}
+% option which has the following effects:
+% \begin{itemize}
+% \item |\includegraphics| can be used to import SVG graphic files directly
+% (extension |.svg| or |.SVG|). In this case, the SVG file is passed as-is to the
+% XML output and is converted using \href{https://inkscape.org/}
+% {Inkscape} (must be installed) for inclusion in the PDF output.
+% \item the graphic files in PDF format are converted to the SVG format using
+% \href{https://inkscape.org/}{Inkscape} (must be installed), rather than beeing
+% rasterized. Before inclusion to the XML output, the SVG file is optimized using
+% the \href{https://github.com/scour-project/scour}{Scour} utility. This
+% optimization step is optional in the sense that, if the Scour call fails,
+% the unoptimized SVG file will be passed to the XML output.
+% Two processes benefit from this PDF$\to$SVG conversion:
+% \begin{itemize}
+% \item inclusion of PDF graphics with |\includegraphics|, and
+% \item Tikz pictures that are externalized.
+% \end{itemize}
+% \end{itemize}
+%
+% \DescribeMacro{\PDFtoSVGcommand}\DescribeMacro{\SVGtoPDFcommand}
+% \DescribeMacro{\optiSVGcommand} The call of external tools can be changed using
+% the macros |\PDFtoSVGcommand| \marg{\dots}, |\SVGtoPDFcommand|\marg{\dots} and
+% |\optiSVGcommand|\marg{\dots}.
+%
+% \section{Verbatim Code}
+% Because, for HTML translation, \textsf{moodle} parses the body of questions, the use of
+% verbatim code results in compilation errors. This is why the use of |\verb|,
+% |\begin{verbatim}| and other standard utilities is not supported.
+%
+% However, using the following three utilities, verbatim code can be imported from an external file:
+% \begin{enumerate}
+% \item \DescribeMacro{\verbatiminput}|\verbatiminput|\marg{filename} from the \textsf{verbatim}
+% package inserts verbatim code in both the PDF and the XML for moodle, without fancy additions.
+% \item \DescribeMacro{\VerbatimInput}The macro |\VerbatimInput|\marg{options}\marg{filename} from
+% \textsf{fancyvrb} or \textsf{fvextra} does more, with several options and settings offered
+% (see below).
+% The variants \DescribeMacro{\BVerbatimInput}|\VBerbatimInput| and
+% \DescribeMacro{\LVerbatimInput}|\LVerbatimInput| are also supported, with identical
+% effect on the XML output.
+% The variants with a star are unsupported and result in errors when used.
+% \item \DescribeMacro{\inputminted}On top of that |\inputminted|\oarg{options}\marg{lang}
+% \marg{filename}from the \textsf{minted} package offers syntaxic highlighting tailored to the
+% specified language.
+% \end{enumerate}
+% The \textsf{moodle} package handles these three commands to pass the code in the output XML.
+%
+% With |\VerbatimInput| and |\inputminted|, the options that are taken care of for XML
+% generation are listed in Table~\ref{tab:verbatim-options}. Using |\fvset|\marg{key=value,...},
+% options can be set globally. Equivalently, with \textsf{minted},
+% |\setminted|\oarg{lang}\marg{key=value,...} is available.
+%
+% \begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[b]
+% \caption{Options and corresponding values considered for XML generation of verbatim material
+% with \texttt{VerbatimInput} and \texttt{inputminted}.}
+% \label{tab:verbatim-options}
+% \begin{tabular}{ll}
+% \toprule
+% Option keys & Possible values\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}
+% ^^A\texttt{commentchar} & \meta{character}\\
+% \texttt{gobble} & \meta{integer}\\
+% \texttt{autogobble}\tnote{1} & \texttt{true} or \texttt{false}\\
+% \texttt{tabsize} & \meta{integer}\\
+% \texttt{numbers} & \texttt{none}, \texttt{left}, \texttt{right}, or \texttt{both}\tnote{2}\\
+% \texttt{firstnumber} & \texttt{auto}, \texttt{last}, or \meta{integer}\\
+% \texttt{firstline} & \meta{integer}\\
+% \texttt{lastline} & \meta{integer}\\
+% \texttt{numberblanklines} & \texttt{true} or \texttt{false}\\
+% \texttt{highlightlines}\tnote{2} & \marg{coma-separated list of integers or ranges}\\
+% \texttt{style}\tnote{1} & \meta{string}\\
+% \bottomrule
+% \end{tabular}
+%\begin{tablenotes}
+%\item[1] \texttt{autogobble}, \texttt{numbers=both}, and \texttt{style} are offered only by \textsf{minted}.
+%\item[2] line highlighting is offered only with \textsf{fvextra} or \textsf{minted} loaded.
+%\end{tablenotes}
+%\end{threeparttable}
+%\end{table}
+%
+% In order to define the verbatim code from the \LaTeX\ document itself, it is still possible
+% to use, outside the scope of the \textsf{moodle} questions, the environments |filecontents*| (from the
+% \textsf{filecontents} package or \LaTeX\ kernel itself since 2019) or |VerbatimOut|
+% (from the \textsf{fancyvrb} and \textsf{fvextra} packages).
+%
+% When code decorated with left-side line numbers is placed in question items, the output PDF could
+% show a collision between numbers of the item and the first line. To avoid this, |\LVerbatimInput| or
+% |\BVerbatimInput| can be used. Instead, when \textsf{minted} is used, the ``left-right'' mode can be
+% enforced with the \LaTeX\ command:
+% \begin{quote}
+% |\RecustomVerbatimEnvironment{Verbatim}{LVerbatim}{}|
+% \end{quote}
+%
+% When using utilies from \textsf{fancyvrb}, \textsf{fvextra}, or \textsf{minted}, \textsf{moodle} sets
+% framing options for the display of code in the output PDF:
+% \begin{quote}
+% |\fvset{frame=lines,label={[Beginning of code]End of code},|\\
+% | framesep=3mm,numbersep=9pt}|
+% \end{quote}
+% These settings can be overidden using |\fvset| after the preamble.
+%
+% \section{Calculated Questions}
+% Moodle's calculated questions are not supported by this package.
+%
+% However, as \href{https://github.com/avohns/python-latex-moodle-quiz}{demonstrated by A.
+% Vohns}, an advanced scripting language may be used to generate a series of questions sharing
+% the same prototype.
+%
+% We suggest to apply a specific tag to these questions. After import in Moodle, when creating
+% a quizz, this tag can be selected to narrow down a random selection of question.
+% This would mimic the behavior of calculated questions while bringing the flexibility of your
+% favorite scripting language.
+%
+% Here are two examples inspired from the work of A. Wohns. The first one relies on the
+% native Lua capabilities of \LuaLaTeX.
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{quiz}[tags={calculated}]{Example Quiz}
+% \directlua{
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=topline]{latex}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% function clozenum_print(pair,op,result)
+% tex.print("\\begin{numerical}$"..pair[1].." "..op.." "..pair[2].."
+% =$".."\\item ",result,"\\end{numerical}")
+% end
+% function cloze_print(pair,points)
+% tex.print("\\begin{cloze}[points="..points.."]{Arithmetic Quiz
+% ("..pair[1]..", "..pair[2]..")}Solve the following tasks!\\\\")
+% clozenum_print(pair,"+",pair[1]+pair[2])
+% clozenum_print(pair,"-",pair[1]-pair[2])
+% clozenum_print(pair,"*",pair[1]*pair[2])
+% if pair[1]/pair[2]==math.floor(pair[1]/pair[2]) then
+% clozenum_print(pair,":",math.floor(pair[1]/pair[2]))
+% end
+% tex.print("\\end{cloze}")
+% end
+% for x = 2,4 do
+% for y = 2,4 do
+% if x>y then
+% if x/y==math.floor(x/y) then points=4 else points=3 end
+% cloze_print({x,y},points)
+% end
+% end
+% end
+% \end{VerbatimOut}
+% \inputminted[]{lua}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% }
+% \end{quiz}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=bottomline]{latex}{minted.doc.out}
+% The second example makes use of the \textsf{python} package (|\usepackage{python}|).
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{quiz}[tags={calculated}]{Example Quiz}
+% \begin{python}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=topline]{latex}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% def clozenum_print(pair,op,result):
+% print(rf"""\begin{{numerical}}
+% ${pair[0]} {op} {pair[1]} =$\item {result}
+% \end{{numerical}}""")
+% def cloze_print(pair,points):
+% print(rf"""\begin{{cloze}}[points={points}]{{Arithmetic Quiz
+% {(pair[0],pair[1])}}}Solve the following tasks!\\""")
+% clozenum_print([x,y],"+",x+y)
+% clozenum_print([x,y],"-",x-y)
+% clozenum_print([x,y],"*",x*y)
+% if pair[0]/pair[1] == pair[0]//pair[1]:
+% clozenum_print([x,y],":",x//y)
+% print("\end{cloze}")
+% for x in range(2,5):
+% for y in range(2,5):
+% if x > y:
+% if x/y == x//y:
+% points=4
+% else:
+% points=3
+% cloze_print([x,y],points)
+% \end{VerbatimOut}
+% \inputminted[]{python}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \end{python}
+% \end{quiz}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=bottomline]{latex}{minted.doc.out}
+% These two codes yield the same XML content.
%
-% \newpage
% \section{Known Limitations and Call for Bug Reports}
-% Some features of Moodle quizzes have not yet been implemented in \textsf{moodle.sty}.
+% Table~\ref{tab:support-limitations} lists some different features supported, limitations, and
+% bugs.
+%
+%\begin{table}[tbp]
+%\centering
+%\begin{threeparttable}[b]
+%\caption{Content enrichment (pictures, equations) support after XML import in Moodle v3.5.7,
+% depending on the question type.}
+%\label{tab:support-limitations}
+%\begin{tabular}{lccc}
+% \toprule
+% & \multicolumn{3}{l}{XML rendering in\dots}\\\cmidrule(lr){2-4}
+%Question type & Question & Answer & Feedback\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}
+%\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% \href{https://docs.moodle.org/35/en/Multiple_Choice_question_type}{Multichoice}
+%& yes & yes & yes \\
+% \href{https://docs.moodle.org/35/en/Numerical_question_type}{Numerical}
+%& yes & no\tnote{1} & yes \\
+% \href{https://docs.moodle.org/35/en/Short-Answer_question_type}{Short Answer}
+% & yes & no\tnote{1} & yes \\
+% Matching (\href{https://docs.moodle.org/35/en/Matching_question_type}{std})
+%& yes & no\tnote{2} & no\tnote{3} \\
+% Matching (\href{https://docs.moodle.org/35/en/Drag_and_drop_matching_question_type}{dd})
+% & yes & yes\tnote{4} & no\tnote{3} \\
+% \href{https://docs.moodle.org/35/en/Essay_question_type}{Essay}
+%& yes & yes\tnote{5,6} & yes\tnote{5} \\
+% \href{https://docs.moodle.org/35/en/True/False_question_type}{True/False}
+%& yes & no & yes \\
+% \href{https://docs.moodle.org/35/en/Description_question_type}{Description}
+%& yes & $\varnothing$ & yes \\
+%\href{https://docs.moodle.org/35/en/Embedded_Answers_(Cloze)_question_type}{Cloze} &
+%yes & $\varnothing$& $\varnothing$ \\\cmidrule(lr){1-1}
+%\hspace{1em}Numerical & yes & no\tnote{1} & yes \\
+%\hspace{1em}Short Answer & yes & no\tnote{1} & yes\tnote{7} \\
+%\hspace{1em}Multi (regular) & yes & no\tnote{2} & yes\tnote{7} \\
+%\hspace{1em}Multi (horizontal) & yes & yes & yes \\
+%\hspace{1em}Multi (vertical) & yes & yes & yes \\\bottomrule
+%\end{tabular}
+%\begin{tablenotes}
+%\item[1] Moodle prompts the student for an answer and then compares it to the
+%solutions provided. This is text-only.
+%\item[2] Moodle uses a dropdown list to let one choose among the possible
+%answers. This forbids either picture inclusion and \LaTeX\ rendering.
+%\item[3] Not supported by Moodle (in this context, answer-specific feedback
+%represents lots of possible combinations).
+%\item[4] The drag-and-drop-matching plugin seems broken before version 1.6
+%20190409. Moodle's XML import fails with a \textsf{dmlwriteexception} when
+%the field content exceeds few hundreds characters. This prevents the inclusion
+%of most base64 images and maybe some complicated equations.
+%\item[5] For this question type and in the context of XML generation, the
+%Answer column represents the ``template" while the Feedback column represents
+%the ``notes for the grader". Obviously, the grading process is not automatic
+%and there is no answer-specific feedback.
+%\item[6] Picture and \LaTeX\ rendering could be done, but only after
+%submission and only if the keyval ``response format" is set to ``html".
+%\item[7] Moodle only reveals the feedback when hovering the checkmark or X
+%mark with the mouse.
+%\end{tablenotes}
+%\end{threeparttable}
+%\end{table}
+%
+% Tables~\ref{tab:diacritical}, \ref{tab:ligatures}, and \ref{tab:other} describe the current
+% support for some special characters, accents and other diacritical marks.
+%
+%\begin{table}[tbp]
+% \centering
+% \caption{Support for diacritical marks
+% in a UTF8-coded \TeX~document compiled with (pdf)\LaTeX\ (packages
+% \texttt{inputenc} with option \texttt{utf8} and \texttt{fontenc} with option \texttt{T1}),
+% \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:diacritical}
+% \begin{threeparttable}[t]
+% \begin{tabular}{*{6}{l}}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX\ or \LuaLaTeX & (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}
+% \aa & \AA & \verb|\aa| & \verb|\AA| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`a & \`A & \verb|\`a| & \verb|\`A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^a & \^A & \verb|\^a| & \verb|\^A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~a & \~A & \verb|\~a| & \verb|\~A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \'e & \'E & \verb|\'e| & \verb|\'E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`e & \`E & \verb|\`e| & \verb|\`E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"e & \"E & \verb|\"e| & \verb|\"E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^e & \^E & \verb|\^e| & \verb|\^E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^i & \^I & \verb|\^i| & \verb|\^I| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"i & \"I & \verb|\"i| & \verb|\"I| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~n & \~N & \verb|\~n| & \verb|\~N| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~o & \~O & \verb|\~o| & \verb|\~O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"o & \"O & \verb|\"o| & \verb|\"O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^o & \^O & \verb|\^o| & \verb|\^O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`u & \`U & \verb|\`u| & \verb|\`U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"u & \"U & \verb|\"u| & \verb|\"U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^u & \^U & \verb|\^u| & \verb|\^U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \c{c} & \c{C} & \verb|\c{c}| & \verb|\c{C}| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \c{s} & \c{S} & \verb|\c{s}| & \verb|\c{S}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \c{t} & \c{T} & \verb|\c{t}| & \verb|\c{T}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \H{o} & \H{O} & \verb|\H{o}| & \verb|\H{O}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \H{u} & \H{U} & \verb|\H{u}| & \verb|\H{U}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \"y & \"Y & \verb|\"y| & \verb|\"Y| & Unicode and \LaTeX & \LaTeX only\\
+% \u{a} & \u{A} & \verb|\u{a}| & \verb|\u{A}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{e} & \u{E} & \verb|\u{e}| & \verb|\u{E}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{g} & \u{G} & \verb|\u{g}| & \verb|\u{G}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{\i} & \u{I} & \verb|\u{\i}| & \verb|\u{I}| & Unicode and \LaTeX & \LaTeX\ only\tnote{1}\\
+% \u{o} & \u{O} & \verb|\u{o}| & \verb|\u{O}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{c} & \v{C} & \verb|\v{c}| & \verb|\v{C}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{d} & \v{D} & \verb|\v{d}| & \verb|\v{D}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{e} & \v{E} & \verb|\v{e}| & \verb|\v{E}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{l} & \v{L} & \verb|\v{l}| & \verb|\v{L}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{n} & \v{N} & \verb|\v{n}| & \verb|\v{N}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{r} & \v{R} & \verb|\v{r}| & \verb|\v{R}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{s} & \v{S} & \verb|\v{s}| & \verb|\v{S}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{t} & \v{T} & \verb|\v{t}| & \verb|\v{T}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{z} & \v{Z} & \verb|\v{z}| & \verb|\v{Z}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[1] \XeLaTeX\ renders correctly |\u{i}|, that is, without a superscript dot.
+% Instead, with (pdf)\LaTeX\ the rendering of |\u{i}| is flawed by the
+% superposition of the superscript dot and the breve diacritical mark.
+% Both engines render |\u{\i}| as expected.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+%\begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[t]
+% \caption{Support for ligatures in a UTF8-coded \TeX~document compiled with (pdf)\LaTeX\ (packages
+% \texttt{inputenc} with option \texttt{utf8}, \texttt{fontenc} with option \texttt{T1}),
+% \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:ligatures}
+% \begin{tabular}{llllll}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX \ or \LuaLaTeX& (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-6}\cmidrule(lr){6-6}
+% \ae & \AE & \verb|\ae| & \verb|\AE| & Unicode and \LaTeX & \LaTeX\ only\\
+% \oe & \OE & \verb|\oe| & \verb|\OE| & Unicode and \LaTeX & \LaTeX\ only\\
+% \ss & \SS & \verb|\ss| & \verb|\SS| & Unicode and \LaTeX\tnote{1} & \LaTeX\ only\tnote{2}\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}[b]
+% \item[1] the Libertine font, used in this documentation and available for instance via the
+% package |libertine|, defines the glyph \SS. Most fonts do not define this glyph.
+% \item[2] \LaTeX\ defines the \verb|\SS| macro but (pdf)\LaTeX\ renders it as a doubled capital S.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+%\begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[b]
+% \caption{Support for other glyphs and punctuation marks in a UTF8-coded \TeX~document compiled
+% with (pdf)\LaTeX\ (packages \texttt{inputenc} with option \texttt{utf8}, \texttt{fontenc} with
+% option \texttt{T1}), \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:other}
+% \begin{tabular}{llllll}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX\ or \LuaLaTeX & (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}
+% \l & \L & \verb|\l| & \verb|\L| & Unicode and \LaTeX & \LaTeX\ only\\
+% \o & \O & \verb|\o| & \verb|\O| & Unicode and \LaTeX & \LaTeX\ only\\
+% « & & \verb|\guillemotleft|\tnote{1} & & Unicode and \LaTeX & \LaTeX\ only\\
+% » & & \verb|\guillemotright|\tnote{1} & & Unicode and \LaTeX & \LaTeX\ only\\
+% ¿ & & \verb|\textquestiondown| & & Unicode and \LaTeX & \LaTeX\ only\\
+% ¡ & & \verb|\textexclamdown| & & Unicode and \LaTeX & \LaTeX\ only\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[1] the package |babel| loaded with option |french| defines |\og| and |\fg| for
+% the same symbols. These are also supported by \textsf{moodle}.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+% Some features of Moodle quizzes have not yet been implemented in \textsf{moodle}.
% Here is a non-exhaustive list.
% \begin{itemize}
% \item Moodle's feature of designating feedback for correct,
% partially correct, and incorrect answers.
-% \item Calculated questions; that is, automatically generated numerical questions
-% using randomly chosen numbers.
+%^^A \item Calculated questions; that is, automatically generated numerical questions
+%^^A using randomly chosen numbers.
% \item Hints
-% \item Keywords
-% \item So-called ``description'' questions.
-% \item Shuffled answers in multiple choice cloze subquestions.
+% \item Multiple keywords (tags) for questions
% \end{itemize}
-% I have used Version 0.5 for one semester's teaching,
-% but if other users adopt this package, I fully expect them to find bugs.
-% \emph{Please} send all bugs you find to \url{anders.hendrickson@snc.edu},
-% so that I can fix them for subsequent versions.
+% The authors have used this package together with a limited number of colleagues
+% for a few semesters of teaching. If other users adopt this package, we fully expect them
+% to find bugs. \emph{Please} send all bugs you find to \url{guerquin-kern@crans.org},
+% so that we can fix them for subsequent versions.
%
% \section{Compatibility}
-% This package has been written for and tested with the implementation of
+% This package has been originally written for and tested with the implementation of
% Moodle 2.9 run by Moodlerooms for St.~Norbert College in January 2016.
-% Future versions of this package will probably include some support for
-% specifying your version of Moodle in the |.tex| file to help ensure compatability.
+% Since then, it has been successfully combined with Moodle 3.5.
+% Future versions of this package might include some support for
+% specifying your version of Moodle in the |.tex| file to help ensure compatibility.
%
% As the ultimate purpose of this package is the generation of XML files,
-% future versions of \textsf{moodle.sty} will attempt to maintain backwards
-% compatability with earlier versions of regarding the XML output, apart from
+% future versions of \textsf{moodle} will attempt to maintain backwards
+% compatability with earlier versions regarding the XML output, apart from
% bug fixes.
% Backwards compatibility of the PDF output is not yet guaranteed, however,
% in case the author or users discover better ways for the PDF to display
% the underlying XML data to be proofread.
%
% In other words, compiling your current |.tex| file with a future version
-% of \textsf{moodle.sty} should produce the same XML file it does now
+% of \textsf{moodle} should produce the same XML file it does now
% (apart from bug fixes),
% but it might produce a more informative, and hence different,
% PDF output.
%
%
% \section{Unrelated Tip: Quality of Moodle \TeX\ Images}
-% This has nothing to do with |moodle.sty|, but is a Frequently Asked Question
+% This has nothing to do with \textsf{moodle}, but is a Frequently Asked Question
% in is own right.
% On some servers, at least, Moodle's default ``\TeX\ Filter'' for
% displaying mathematical notation is of abysmally poor quality, rending mathematics
@@ -716,40 +1539,201 @@
% but turn ``MathJax'' \emph{on}. This forces \TeX\ code to be rendered by MathJax
% instead of Moodle, producing much higher-quality results.
%
+% ^^A\clearpage
+% \changes{v0.5}{2016/01/05}{Initial version}
+% \changes{v0.6}{2019/02/18}{Bux-fixing release}
+% \changes{v0.7}{2020/07/09}{Feature extensions}
+% \changes{v0.8}{2021/01/04}{Bug fixes and feature extensions}
+% \begin{changelog}[title={Version History},author={Matthieu Guerquin-Kern}]
+% \begin{version}[version=0.8,date=2021-01-04]
+% \added
+% \item Support for inclusion of GIF pictures.
+% \item Added package option |svg| to avoid the rasterization of vector graphics.
+% \item New macro |\setsubcategory| to define subcategories, reflected in PDF and XML.
+% \item Package option |handout| for sharing PDF with students.
+% \item Extensions can be omitted when including pictures.
+% \item Description question type.
+% \item \LuaLaTeX\ is now supported (and recommended for UTF8-coded sources).
+% \item Examples of ways to reproduce the behavior of calculated questions.
+% \item Command to trigger the automatic recording of new commands.
+% \item Mechanism to match |fraction| key to values accepted by Moodle.
+% \item A |fractiontol| key to control the tolerance in this mechanism.
+% \item Support for inverted punctuation marks |¿| and |¡|.
+% \item Support for |\_| and |\textbackslash|.
+% \item Support for the wildcard character as an answer in numerical questions.
+% \changed
+% \item Template of Essay questions is now shown in PDF.
+% \item The macro |\setcategory| is reflected by a new section in PDF.
+% \item In matching questions, warnings are raised if the number of items is insufficient.
+% \item Improved display of matching questions in PDF.
+% \item The package \textsf{iftex} is now required.
+% \item An error is thrown when |fraction| is set to an invalid value.
+% \item In numerical questions, the tolerance can be set in exponent form.
+% \item Nicer PDF rendering of numbers in numerical questions if \textsf{siunitx} is loaded.
+% \item Included PNG and JPEG files are now directly converted to base64.
+% \fixed
+% \item TeX's inline math (|$...$|) can now contain escaped dollar signs (|\$|).
+% \item Closing braces escaped in cloze subquestions outside math environment.
+% \item The scope of the |tolerance| key is now respected.
+% \end{version}
+% \begin{version}[version=0.7,date=2020-09-06]
+% \added
+% \item Support for inclusion of verbatim code.
+% \item Package option \texttt{tikz}.
+% \item Support for |\"Y| and |\"y|.
+% \item New commands converted to XML.
+% \item Adding a stamp comment in XML, package option offered to disable
+% this behavior.
+% \item Support for the |\tikz| command.
+% \item A different directory can be specified for picture inclusion.
+% \item Warn user of the \texttt{babel} package set for french that autospacing
+% must be deactivated.
+% \item Square bracket math delimiters are recognized and converted properly.
+% \item Support of breve and caron diacritical marks.
+% \changed
+% \item In multi with multiple answers allowed, choosing all options no longer
+% results in a good grade. An automatic penalty mechanism is introduced.
+% Can be overridden by manually setting fractions.
+% \removed
+% \item Irrelevant \texttt{penalty} tag in cloze subquestions.
+% \fixed
+% \item Non-integer fractions can now be specified in cloze subquestions.
+% \item Signifiantly squeeze PNG images size by skipping ancillary data.
+% \item Enumerate or itemize environment can now be nested in question items.
+% \item Several pictures can be included in a question without being mixed
+% in the XML file.
+% \item management and rendering of fraction in questions.
+% \item Correctly handling a \LaTeX\ starting the last item of a question.
+% \item Closing braces escaped in cloze subquestions. This allows \LaTeX\
+% equations or images to be included.
+% \item Image inclusion with MacOS.
+% \end{version}
+% \begin{version}[version=0.6b,date=2019-11-27]
+% \added
+% \item New package options to set section or subsection at the quiz level.
+% \item True/False question type is now supported.
+% \item Moodle tags can now be specified for questions (and rendered in PDF
+% as well).
+% \item In cloze questions, the \texttt{multiresponse} subquestion type is
+% now supported.
+% \removed
+% \item External dependency on \texttt{OpenSSL}.
+% \item Irrelevant tags were written in XML for matching questions.
+% \fixed
+% \item \TikZ\ externalization now works when using \XeLaTeX.
+% \item It is now possible to set points manually among several correct
+% answers in multichoice questions.
+% \item General feedbacks can now contain backslashes.
+% \item Several quizzes can now be defined in a single source file, each
+% specifying a category for Moodle's question bank.
+% \item Correct encoding information in now written in XML depending on
+% the \LaTeX\ compiler used.
+% \end{version}
+% \begin{version}[version=0.6a,date=2019-06-21]
+% \added
+% \item \XeLaTeX\ is now recommended when using UTF8-encoded sources (support
+% of accents).
+% \item Feedbacks are now displayed in the PDF file produced.
+% \item The \texttt{optipng} utility is used (and required) to reduce the size
+% of images embedded in the XML file.
+% \item Question options and settings are now displayed in the PDF file
+% \item Supporting more \LaTeX\ macros for symbols and accents (mostly
+% diacritical marks and ligatures).
+% \item Introduce shuffle options in cloze-multi subquestions.
+% \item Package option \texttt{final}.
+% \changed
+% \item In draft mode, \TikZ\ externalization in no longer triggered.
+% \fixed
+% \item In the different question types, the feedback fields are now converted
+% for HTML allowing \LaTeX\ equation and images.
+% \item Documentation improvements (limitations and previously undocumented
+% features).
+% \end{version}
+% \shortversion{version=0.5,date=2016-01-05,simple,changes=Initial version,author={Anders O.F. Hendrickson}}
+% \end{changelog}
+%
% \StopEventually{}
%
% \section{Implementation}
% \subsection{Packages, Options, and Utilities}
% \begin{macrocode}
\newif\ifmoodle@draftmode
+\newif\ifmoodle@handout
+\newif\ifmoodle@stampmode
+\newif\ifmoodle@tikz
\newif\ifmoodle@tikzloaded
+\newif\ifmoodle@svg
+\newif\ifmoodle@section
+\newif\ifmoodle@subsection
+\newif\ifmoodle@numbered
%%DECLARATION OF OPTIONS
\DeclareOption{draft}{\moodle@draftmodetrue}
+\DeclareOption{handout}{\moodle@handouttrue}
+\DeclareOption{final}{\moodle@draftmodefalse}
+\DeclareOption{nostamp}{\moodle@stampmodefalse}
+\DeclareOption{tikz}{\moodle@tikztrue}
+\DeclareOption{svg}{\moodle@svgtrue}
+\DeclareOption{section}{\moodle@sectiontrue\moodle@numberedtrue}
+\DeclareOption{section*}{\moodle@sectiontrue\moodle@numberedfalse}
+\DeclareOption{subsection}{\moodle@sectionfalse\moodle@numberedtrue}
+\DeclareOption{subsection*}{\moodle@sectionfalse\moodle@numberedfalse}
\moodle@draftmodefalse
+\moodle@handoutfalse
+\moodle@stampmodetrue
+\moodle@tikzfalse
\moodle@tikzloadedfalse
+\moodle@svgfalse
+\moodle@subsectiontrue
+\moodle@numberedfalse
\ProcessOptions
\RequirePackage{environ} %To be able to take environment body as a macro argument
\RequirePackage{xkeyval} %For key-handling
\RequirePackage{amssymb} %For \checkmark symbol
-\RequirePackage{trimspaces} %To remove extra spaces from strings
+%\RequirePackage{trimspaces} %To remove extra spaces from strings (loaded by environ)
\RequirePackage{etex} %Expansion control, detokenization, etc.
\RequirePackage{etoolbox}%List management
\RequirePackage{xpatch} %To patch commands easily in HTML mode
\RequirePackage{array} %For formatting tables in the LaTeX mode of Clozes
\RequirePackage{ifplatform} % To choose Ghostscript commands
-\RequirePackage{ifpdf} % Needed to know whether we can convert output from PDF to PNG
-
+\@ifpackageloaded{iftex}{}{\RequirePackage{iftex}}
+% iftex already required by recent versions of ifplatform. Needed to know:
+% 1) whether we can convert output from PDF to PNG (ifpdf),
+% 2) when output pdf is latin1-encoded (ifpdf)
+% 3) when output xml is utf8-encoded (if?tex)
+\@ifundefined{ifpdf}{\RequirePackage{ifpdf}}{}% old iftex would not define the conditional
+\RequirePackage{shellesc} %Luatex-compatible way of getting system access
+\RequirePackage{fancybox} %For fancy LaTeX tags
\RequirePackage{getitems} %To gather the header and items
+\ifmoodle@handout
+ \RequirePackage[seed=42]{randomlist} %To randomize answers in matching questions
+\fi
+\ifmoodle@svg
+ \RequirePackage{graphicx} %To include graphics
+\fi
\let\xa=\expandafter
\def\@star{*}%
\def\@hundred{100}%
+\def\@fifty{50}%
\def\@moodle@empty{}%
\def\@relax{\relax}%
+\def\@moodle@par{\par}%
+
+% Taken from https://tex.stackexchange.com/questions/47576/combining-ifxetex-and-ifluatex-with-the-logical-or-operation
+\@ifundefined{ifTUTeX}{
+ \newif\ifTUTeX % a new conditional starts as false
+ \ifnum 0\ifXeTeX 1\fi\ifLuaTeX 1\fi>0%
+ \TUTeXtrue
+ \fi
+}{}%
+\newif\ifpdfoutput % a new conditional starts as false
+\ifnum 0\ifTUTeX 1\fi\ifPDFTeX\ifpdf 1\fi\fi>0%
+ \pdfoutputtrue
+\fi
% \end{macrocode}
% As the package involves a fair bit of file processing,
% we automate the naming of auxiliary files.
@@ -787,9 +1771,42 @@
\newwrite\moodle@outfile
\def\openmoodleout{%
\immediate\openout\moodle@outfile=\outputfilename\relax
- \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \ifPDFTeX % latin1-based engines (pdflatex or latex)
+ \writetomoodle{<?xml version="1.0" encoding="iso-8859-1"?>}%
+ \else
+ \ifTUTeX % UTF8-based engines (XeTeX or LuaTeX)
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \else % what shall we do?
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ %\stop
+ \fi
+ \fi
+ \ifmoodle@stampmode
+ \def\moodle@stamp{This file was generated on \the\year-\two@digits\month-\two@digits\day}
+ \ifPDFTeX % pdflatex or latex
+ \ifpdf % pdflatex
+ \g@addto@macro{\moodle@stamp}{ by pdfLaTeX }%
+ \else % latex
+ \g@addto@macro{\moodle@stamp}{ by LaTeX }%
+ \fi
+ \else
+ \ifXeTeX % xetex
+ \g@addto@macro{\moodle@stamp}{ by XeLaTeX }%
+ \else
+ \ifLuaTeX % luatex
+ \g@addto@macro{\moodle@stamp}{ by LuaLaTeX }%
+ \else
+ \g@addto@macro{\moodle@stamp}{ a TeX engine }%
+ \fi
+ \fi
+ \fi
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \def\moodle@stamp{running on \platformname}%
+ \g@addto@macro{\moodle@stamp}{ with the package moodle v0.8 }%
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \fi
+ \immediate\write\moodle@outfile{}%
\writetomoodle{<quiz>}%
- \writetomoodle{ }%
}%
\def\closemoodleout{%
\writetomoodle{ }%
@@ -797,6 +1814,7 @@
\immediate\closeout\moodle@outfile
}%
% \end{macrocode}
+%
% To both make this |.sty| file and the XML output more readable,
% we create a mechanism for writing to the output file with indents.
% The macro |\calculateindent|\marg{$n$} globally defines
@@ -836,27 +1854,71 @@
% We now create the main |quiz| environment that will contain
% the questions we write. It outputs to XML as a |<question type="category">| tag.
% \begin{macrocode}
-\newenvironment{quiz}[2][]%
- {\setkeys{moodle}{#1}%
- \@moodle@ifgeneratexml{%
- \openmoodleout%
- \setcategory{#2}%
- }{}%
- \subsection*{#2}%
- \begin{enumerate}%
- }
- {\end{enumerate}%
- \@moodle@ifgeneratexml{\closemoodleout}{}}
-
-{\catcode`\$=12\catcode`\ =12%
-\gdef\setcategory#1{%
+{\catcode`\$=12\catcode`\ =12% in this context we cannot indent with spaces...
+\gdef\moodle@write@category@xml#1{%
+\@moodle@ifgeneratexml{%
+\writetomoodle{ }%
\writetomoodle{<question type="category">}%
\writetomoodle{ <category>}%
-\writetomoodle{ <text>$module$/#1</text>}%
+\writetomoodle{ <text>$course$/top/#1</text>}%
\writetomoodle{ </category>}%
\writetomoodle{</question>}%
\writetomoodle{ }%
+}{}%
}}%
+\newcommand*\@enumeratename{enumerate}%
+\newenvironment{quiz}[2][]{%
+ \setkeys{moodle}{#1}%
+ \gdef\setcategory##1{%
+ % At first call (end of \begin{quiz}) enumerate is not started yet
+ \ifx\@currenvir\@enumeratename
+ % In case no question is defined between two calls of \setcategory
+ \def\@noitemerr{\@latex@warning{Empty question list}}%
+ \end{enumerate}%
+ \fi
+ \gdef\moodle@currentcategory{##1}%
+ \moodle@write@category@xml{##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \section{##1}%
+ \else
+ \section*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \gdef\setsubcategory##1{%
+ \def\@noitemerr{\@latex@warning{Empty question list}}%
+ \end{enumerate}%
+ \moodle@write@category@xml{\moodle@currentcategory/##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsubsection{##1}%
+ \else
+ \subsubsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \setcategory{#2}%
+}{%
+ \end{enumerate}%
+ \let\setcategory\relax
+ \let\setsubcategory\relax
+}%
+
% \end{macrocode}
% The next utility takes a single macro control sequence |#1|,
% and allows that macro's current value to persist
@@ -888,6 +1950,19 @@
}%
}
% \end{macrocode}
+% Now the macros |openmoodleout| and |closemoodleout| are triggered at Begin and End Document, respectively
+% \begin{macrocode}
+\AfterEndPreamble{
+ \@moodle@ifgeneratexml{%
+ \openmoodleout%
+ }{}%
+}
+\AtEndDocument{
+ \@moodle@ifgeneratexml{%
+ \closemoodleout%
+ }{}%
+}
+% \end{macrocode}
%
% \subsection{Key-Value Pairs for Quiz Questions}
%
@@ -902,7 +1977,7 @@
% to the output XML file.
%
% The ordinary version |\generate@moodle@write@code| passes its output text |#3|
-% through the HTMLizer, producing HTML code, while the starred version
+% through the HTMLizer, producing HTML code, while the starred variant
% |\generate@moodle@write@code*| passes |#3| verbatim as text.
%
% For example,
@@ -951,6 +2026,23 @@
}%
}%
+\def\generate@moodle@write@html@noptag#1<#2>#3{%
+ % No <P>..</P> introduced
+ % #1 = NAME for \moodle@writeNAME
+ % #2 = HTML tag
+ % #3 = what, exactly, to write
+ \xa\gdef\csname moodle@write#1\endcsname{%
+ \xa\def\xa\test@iii\xa{#3}%
+ \ifx\test@iii\@moodle@empty
+ \writetomoodle[2]{ <#2 format="html"><text/></#2>}%
+ \else
+ \xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{#3}%
+ \writetomoodle[2]{ <#2 format="html">}%
+ \writetomoodle[4]{ <text><![CDATA[\moodle@htmltowrite]]></text>}%
+ \writetomoodle[2]{ </#2>}%
+ \fi
+ }%
+}%
\def\generate@moodle@write@data*#1<#2>#3{%
% #1 = NAME for \moodle@writeNAME
@@ -961,16 +2053,33 @@
}%
}%
+\def\generate@moodle@write@tags#1{%
+ % #1 = NAME for \moodle@writeNAME
+ % #3 = what, exactly, to write
+ \xa\gdef\csname moodle@writetags\endcsname{%
+ %\xa\xa\xdef\xa\xa\ds\xa\xa{Encountered '\string #1'}\show\ds
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{\moodle@tags}%
+ \writetomoodle[2]{ <tags>}%
+ \writetomoodle[4]{ <tag><text><![CDATA[\moodle@htmltowrite]]></text></tag>}%
+ \writetomoodle[2]{ </tags>}%
+ \fi
+ }%
+}%
+
% \end{macrocode}
% \subsubsection{Keys for all question types}
% \begin{macrocode}
%% QUESTIONNAME
\define@cmdkey{moodle}[moodle@]{questionname}{}%
- \gdef\moodle@writequestionname{%
- \writetomoodle[2]{<name>}%
- \writetomoodle[4]{ <text>\moodle@questionname</text>}%
- \writetomoodle[2]{</name>}%
- }%
+% \gdef\moodle@writequestionname{%
+% \writetomoodle[2]{<name>}%
+% \writetomoodle[4]{ <text>\moodle@questionname</text>}%
+% \writetomoodle[2]{</name>}%
+% }%
+%\generate@moodle@write@code{questionname}<name>{\moodle@questionname}%
+\generate@moodle@write@html@noptag{questionname}<name>{\moodle@questionname}%
%% QUESTIONTEXT
%I tried to use questiontext as a key, but it doesn't seem to work.
@@ -986,9 +2095,9 @@
\generate@moodle@write@code{questiontext}<questiontext>{\moodle@questiontext}%{%
%% PENALTY FOR WRONG ATTEMPT
- \define@cmdkey{moodle}[moodle@]{penalty}[0.1000000]{}%
+ \define@cmdkey{moodle}[moodle@]{penalty}[0.10]{}%
\generate@moodle@write@code*{penalty}<penalty>{\moodle@penalty}%
- \moodleset{penalty}%
+ \moodleset{penalty=0.10}%
%% FEEDBACK
% Moodle allows for feedback tailored to each question,
@@ -1002,7 +2111,7 @@
\define@cmdkey{moodle}[moodle@]{feedback}[]{}%
\generate@moodle@write@code{generalfeedback}<generalfeedback>{\moodle@feedback}%
\generate@moodle@write@code{feedback}<feedback>{\moodle@feedback}%
- \moodleset{feedback}%
+ \moodleset{feedback={}}%
%% DEFAULT GRADE
%The next line creates \moodle@defaultgrade,
@@ -1028,7 +2137,14 @@
\moodle@writehidden%
}%
-% TO DO: 'tags' (i.e., keywords)
+%% TAGS
+ %The next line creates \moodle@tags,
+ %which defines a "tag" (i.e., keyword) for the question.
+ %Key calls like [tags={random}] set \moodle@tags.
+ \define@cmdkey{moodle}[moodle@]{tags}[]{}%
+ \generate@moodle@write@tags{\csname moodle@tags\endcsname}%
+ \moodleset{tags}%
+% TODO: handle multiple 'tags' for one question
% \end{macrocode}
% \subsubsection{Keys for all answers}
@@ -1039,13 +2155,18 @@
%the XML within the answer tag, like <answer fraction="75">.
\moodleset{fraction=100} %This sets the default.
% \end{macrocode}
+% \begin{macrocode}
+%% FRACTIONTOL -- the tolerance for fractions with respect to valid values
+ \define@cmdkey{moodle}[moodle@]{fractiontol}[0.1]{}%
+ \moodleset{fractiontol=0.1} %This sets the default.
+% \end{macrocode}
% \subsubsection{Keys for multiple choice questions}
% \begin{macrocode}
%% SINGLE and MULTIPLE -- for multichoice, is there 1 right answer or more than 1?
\define@boolkey{moodle}[moodle@]{single}[true]{}%
\generate@moodle@write@code*{single}<single>{\ifmoodle@single true\else false\fi}%
- \moodleset{single}%
+ \moodleset{single=true}%
%The key 'multiple' is an antonym to 'single'.
\define@boolkey{moodle}[moodle@]{multiple}[true]{\ifmoodle@multiple\moodle@singlefalse\else\moodle@singletrue\fi}%
@@ -1054,15 +2175,15 @@
\generate@moodle@write@code*{shuffle}<shuffleanswers>{\ifmoodle@shuffle 1\else 0\fi}%
\moodleset{shuffle=true}%
-%% TO DO: CORRECTFEEDBACK
-%% TO DO: PARTIALLYCORRECTFEEDBACK
-%% TO DO: INCORRECTFEEDBACK
-%% TO DO: NUMCORRECT key
+%% TODO: CORRECTFEEDBACK
+%% TODO: PARTIALLYCORRECTFEEDBACK
+%% TODO: INCORRECTFEEDBACK
+%% TODO: NUMCORRECT key
%% NUMBERING -- for numbering of multichoice questions
\define@choicekey{moodle}{numbering}%
{alpha,alph,Alpha,Alph,arabic,roman,Roman,%
- abc,ABC,123,iii,IIII,none}[abc]{%
+ abc,ABCD,123,iii,IIII,none}[abc]{%
\def\moodle@numbering{#1}%
\def\test@@i{#1}%
\ifx\test@@i\@moodle@alpha
@@ -1070,9 +2191,9 @@
\ifx\test@@i\@moodle@alph
\def\moodle@numbering{abc}\fi
\ifx\test@@i\@moodle@Alpha
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@Alph
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@arabic
\def\moodle@numbering{123}\fi
\ifx\test@@i\@moodle@roman
@@ -1094,7 +2215,7 @@
\def\@moodle@roman{roman}%
\def\@moodle@Roman{Roman}%
\def\@moodle@abc{abc}%
- \def\@moodle@ABC{ABC}%
+ \def\@moodle@ABCD{ABCD}%
\def\@moodle@arabicnumbers{123}%
\def\@moodle@iii{iii}%
\def\@moodle@IIII{IIII}%
@@ -1103,7 +2224,7 @@
\ifx\moodle@numbering\@moodle@abc
\renewcommand\theenumii{\alph{enumii}}%
\fi
- \ifx\moodle@numbering\@moodle@ABC
+ \ifx\moodle@numbering\@moodle@ABCD
\renewcommand\theenumii{\Alph{enumii}}%
\fi
\ifx\moodle@numbering\@moodle@arabicnumbers
@@ -1119,7 +2240,7 @@
\renewcommand\labelenumii{$\bullet$~}%
\fi
}
- %TO DO: * In the PDF, how should 'none' in a multi look different from
+ %TODO: * In the PDF, how should 'none' in a multi look different from
% short answer or numerical options?
% * Instead of \theenumi and \labelenumi,
% use \@enumdepth to automatically set the correct depth.
@@ -1140,7 +2261,7 @@
%tolerance is given within the answer tag,
%like <answer fraction=100 tolerance=0.03>.
-% TO DO: implement unit-handling for numerical questions!
+% TODO: implement unit-handling for numerical questions!
% \end{macrocode}
% \subsubsection{Keys for short answer questions}
% \begin{macrocode}
@@ -1215,7 +2336,7 @@
%% RESPONSE REQUIRED
\define@boolkey{moodle}[moodle@]{response required}[true]{}%
- % TO DO: Make synonym 'required'
+ % TODO: Make synonym 'required'
\generate@moodle@write@code*{responserequired}<responserequired>{\csname ifmoodle@response required\endcsname 1\else 0\fi}%
\moodleset{response required=false}%
@@ -1245,7 +2366,7 @@
%% RESPONSE TEMPLATE
\define@key{moodle}{template}{\long\def\moodle@responsetemplate{#1}}%
- \generate@moodle@write@code{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
+ \generate@moodle@write@html@noptag{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
\moodleset{template={}}%
% \end{macrocode}
% \subsubsection{Hint tags}
@@ -1269,7 +2390,7 @@
}%
\moodleset{clearwrong=false}%
-% TO DO: Implement hints
+% TODO: Implement hints
% \end{macrocode}
%
% \subsection{Answer handling}
@@ -1305,21 +2426,6 @@
% \subsubsection{Not yet implemented}
%
% \begin{macrocode}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TRUE/FALSE QUESTIONS %%%%%%%%%%%%%%%%%
-
-% TODO: implement the \writetruefalsequestion
-% and a front-end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% DESCRIPTION 'QUESTIONS' %%%%%%%%%%%%%
-
-% TODO: implement the \writedescription and a suitable front-end.
-% Should this be \begin{description}...\end{description},
-% or should \begin{quiz}...\end{quiz} just scoop up all
-% text outside question environments and package it in descriptions?
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% CALCULATED %%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1354,48 +2460,142 @@
% \end{Verbatim}
%
% \begin{macrocode}
-\def\moodle@makefrontend#1{%
+
+\def\moodle@makelatextagbox#1{%
+% \ifmoodle@tikzloaded
+% \tikzset{external/export next=false}
+% \tikz[baseline]{\node[draw,minimum height=1.2em,rounded corners,fill=black!20] {\tiny #1};}
+% % Fancy but interferes with the tikzexternalize counter
+% \else
+ \Ovalbox{\tiny #1}
+ %\ovalbox{\tiny #1}
+ %\shadowbox{\tiny #1}
+% \fi
+}%
+
+\def\moodle@makelatextag@qtype#1{%
+ \doublebox{\tiny \textsc{#1}}
+}%
+
+\def\moodle@makelatextag@value#1#2{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname~#2}
+}%
+
+\def\moodle@makelatextag@key#1{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname}
+}%
+
+\def\moodle@marks#1{point\ifdim#1pt=1pt \else s\fi}
+
+\def\moodle@makefrontend#1#2{%
\NewEnviron{#1}[2][]{%
\bgroup
\setkeys{moodle}{##1,questionname={##2}}%
\expandafter\gatheritems\xa{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{#1}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{#1}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ #2\par
\noindent
\moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
\csname moodle@#1@latexprocessing\endcsname
%Now, writing information to XML
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname write#1question\endcsname
\bgroup
\gdef\moodle@answers@xml{}%
\setkeys{moodle}{feedback={}}%
\xa\loopthroughitemswithcommand\xa{\csname save#1answer\endcsname}%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \csname write#1question\endcsname
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
}
% \end{macrocode}
%
-% \subsubsection{Essay Question Front-End}
-% The essay question is the only question type whose front end
+% \subsubsection{Description Question Front-End}
+% Description and essay questions are the only question types whose front end
% is not yet created by |\moodle@makefrontend|.
-% This is because of what it must do with its |\item|'s.
+% This is because of what need to be done with their contents.
+%
+% Description blocks can be empty. In this case, nothing is done.
+%
+% \begin{macrocode}
+\let\description\relax% remove the meaning of existing \description and \enddescription
+\let\enddescription\relax
+\NewEnviron{description}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \let\moodle@questiontext=\BODY
+ \trim@spaces@in\moodle@questiontext
+ \ifx\moodle@questiontext\@empty\relax\else%
+ %First, the LaTeX processing.
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout\else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}%
+ \fi
+ \par
+ \noindent
+ \fi
+ \moodle@makelatextag@qtype{description}\par
+ \noindent
+ \moodle@questiontext\par
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \fbox{\parbox{\linewidth}{\emph{\moodle@feedback}}}%
+ \fi
+ \fi
+ %Now, writing information to memory.
+ \@moodle@ifgeneratexml{%
+ \writetomoodle{<question type="description">}%
+ \moodle@writecommondata
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \fi
+ \egroup
+}%
+% \end{macrocode}
+%
+% \subsubsection{Essay Question Front-End}
+% The front end is not yet created by |\moodle@makefrontend| because of
+% what must must be done with the |\item|'s.
%
% \begin{macrocode}
\def\moodle@essay@latexprocessing{%
% Moodle cannot automatically grade an essay,
% but if the user puts \item's in, we can list them in an itemize as notes.
+ \par\noindent \emph{Notes for grader:}
+ \moodle@questionheader
\ifnum\c@numgathereditems>0\relax
- \par\noindent Notes: (not included in XML)
\begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
\loopthroughitemswithcommand{\moodle@print@essay@answer}%
\end{itemize}%
\fi
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
}
\NewEnviron{essay}[2][]{%
@@ -1404,13 +2604,35 @@
\expandafter\gatheritems\expandafter{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{essay}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{essay}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \moodle@makelatextag@key{responseformat}
+ \fi
+ \par
\noindent
- \moodle@questionheader
- \csname moodle@essay@latexprocessing\endcsname
+ \ifx\moodle@responsetemplate\@empty\relax\else%
+ \par\noindent \emph{Template:}
+ \par\fbox{\parbox{\linewidth}{\moodle@responsetemplate}}\par
+ \fi
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \ifmoodle@handout\else
+ \csname moodle@essay@latexprocessing\endcsname
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \writeessayquestion
\bgroup
\gdef\moodle@answers@xml{}%
%
@@ -1430,12 +2652,15 @@
%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \writeessayquestion
+ \moodle@writeanswers% The 'answers' XML really contains the grader info.
+ \moodle@writeresponsetemplate%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
-%%%% TO DO
+%%%% TODO
%%%% To make essay work will be tough.
%%%% Every line from \ifnum\c@numgathereditems=0\relax through its \else and \fi,
%%%% with the exception of
@@ -1477,9 +2702,6 @@
\moodle@writeresponsefieldlines%
\moodle@writeattachmentsallowed%
\moodle@writeattachmentsrequired%
- \moodle@writeanswers% The 'answers' XML really contains the grader info.
- \moodle@writeresponsetemplate%
- \writetomoodle{</question>}%
}%
\def\moodle@print@essay@answer#1{%
@@ -1488,6 +2710,7 @@
\def\moodle@savegraderinfo#1{%
+ %\def\ds{#1}\show\ds
\bgroup
\moodle@savegraderinfo@int#1\moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
@@ -1498,7 +2721,8 @@
\moodle@savegraderinfo@int@int%
}%
\def\moodle@savegraderinfo@int@int#1\moodle@answer@rdelim{%
- \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{#1}%
+ \def\moodle@answertext{#1}
+ \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
%\trim@spaces@in\moodle@answertext
\ifnum\c@numgathereditems>1\relax
\addto@xml[6]{\moodle@answers@xml}{<li>\moodle@answertext@html</li>}%
@@ -1512,17 +2736,21 @@
%
% \begin{macrocode}
\def\blank{\rule{1in}{0.5pt}}%
-% TO DO: Make an optional argument for width? This wouldn't affect Moodle,
+% TODO: Make an optional argument for width? This wouldn't affect Moodle,
% only the appearance in the PDF. It doesn't seem worth it.
-% \NewEnviron{shortanswer}[2][]{%
+%\NewEnviron{shortanswer}[2][]{%
% \bgroup
% \setkeys{moodle}{#1,questionname={#2}}%
% \expandafter\gatheritems\xa{\BODY}%
% \let\moodle@questionheader=\gatheredheader
% %First, the LaTeX processing.
-% \bigskip\par\noindent
-% \fbox{\textbf{\moodle@questionname}}\par
+% \item \textbf{\moodle@questionname}
+% \csname ifmoodle@case sensitive\endcsname
+% \framebox{\tiny Case-Sensitive}\relax
+% \fi
+% \framebox{\tiny\csname moodle@default grade\endcsname~points}
+% \framebox{\tiny\csname moodle@penalty\endcsname~penalty}\par
% \noindent
% \moodle@questionheader
% \csname moodle@shortanswer@latexprocessing\endcsname
@@ -1532,7 +2760,8 @@
% \bgroup
% \gdef\moodle@answers@xml{}%
% \setkeys{moodle}{feedback={}}%
-% \xa\loopthroughitemswithcommand\xa{\csname saveshortansweranswer\endcsname}%
+% \xa\loopthroughitemswithcommand\xa{\csname
+% saveshortansweranswer\endcsname}%
% \passvalueaftergroup{\moodle@answers@xml}%
% \egroup
% \csname writeshortanswerquestion\endcsname
@@ -1540,16 +2769,33 @@
% \egroup
% }%
-\moodle@makefrontend{shortanswer}%
+\moodle@makefrontend{shortanswer}{\moodle@makelatextag@shortanswer}%
% LATEX PROCESSING
-\def\moodle@shortanswer@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
- \end{itemize}%
+
+\def\moodle@makelatextag@shortanswer{%
+ \csname ifmoodle@case sensitive\endcsname
+ \moodle@makelatextagbox{Case-Sensitive}\relax
+ \else
+ \moodle@makelatextagbox{Case-Insensitive}\relax
+ \fi
}
+\ifmoodle@handout
+ \let\moodle@shortanswer@latexprocessing\relax
+\else
+ \def\moodle@shortanswer@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@shortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\moodle@print@shortanswer@answer@int#1\@rdelim
}%
\newcommand\moodle@print@shortanswer@answer@int[1][]{%
@@ -1558,9 +2804,13 @@
}%
\def\moodle@print@shortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \item #1\quad$\checkmark$%
+ \item #1$~\checkmark$%
\else
- \item #1\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ \item #1$~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}
\fi
}%
@@ -1577,10 +2827,14 @@
}%
\def\saveshortansweranswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
\addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -1590,40 +2844,63 @@
\writetomoodle{<question type="shortanswer">}%
\moodle@writecommondata%
\moodle@writeusecase%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
% \subsubsection{Numerical Question Front-End}
%
% \begin{macrocode}
-\moodle@makefrontend{numerical}%
+\moodle@makefrontend{numerical}{\moodle@makelatextag@numerical}%
% LATEX PROCESSING
-\def\moodle@numerical@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
- \end{itemize}%
+
+\def\moodle@makelatextag@numerical{}
+
+\AtEndPreamble{
+ \@ifpackageloaded{siunitx}{\def\moodle@printnum{\num[omit-uncertainty,copy-decimal-marker]}}{\let\moodle@printnum\trim@spaces}%
}
+\ifmoodle@handout
+ \let\moodle@numerical@latexprocessing\relax
+\else
+ \def\moodle@numerical@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@numerical@answer#1{%
- \moodle@print@numerical@answer@int#1\@rdelim
+ \let\moodle@feedback=\@empty
+ \bgroup
+ \moodle@print@numerical@answer@int#1\@rdelim
+ \egroup
}%
\newcommand\moodle@print@numerical@answer@int[1][]{%
\setkeys{moodle}{#1}%
\moodle@print@numerical@answer@int@int%
}%
\def\moodle@print@numerical@answer@int@int#1\@rdelim{%
- \ifdim0pt=\moodle@tolerance pt\relax
- \def\moodle@numericalprint@tolerance{}%
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \item \test@i
\else
- \edef\moodle@numericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \item \moodle@printnum{#1}%
+ \ifnum\z@=\moodle@tolerance\else
+ $\,\pm\,$\moodle@printnum{\moodle@tolerance}%
+ \fi
\fi
\ifx\moodle@fraction\@hundred
- \item $#1\moodle@numericalprint@tolerance\quad\checkmark$%
+ $~\checkmark$%
\else
- \item $#1\moodle@numericalprint@tolerance$\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ $~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
\fi
}%
@@ -1640,11 +2917,17 @@
}%
\def\savenumericalanswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
\addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
- \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \ifx\moodle@answertext\@star\else
+ \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \fi
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -1654,8 +2937,6 @@
\gdef\writenumericalquestion{%
\writetomoodle{<question type="numerical">}%
\moodle@writecommondata%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
@@ -1670,57 +2951,155 @@
% \item 11
% \end{multi}%
-\moodle@makefrontend{multi}
+\moodle@makefrontend{multi}{\moodle@makelatextag@multi}%
% LATEX PROCESSING
+
+\def\moodle@makelatextag@multi{%
+ \ifmoodle@multiple
+ \moodle@makelatextagbox{Multiple}\relax%
+ \else
+ \moodle@makelatextagbox{Single}\relax%
+ \fi
+ \ifmoodle@handout\else
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
+
\def\moodle@multi@latexprocessing{%
- \moodle@countcorrectanswers
- \begin{enumerate}\moodle@obeynumberingstyle
- %\renewcommand{\theenumi}{\alph{enumi}}%
- \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
- \end{enumerate}%
+ \moodle@countcorrectanswers%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ \begin{enumerate}\moodle@obeynumberingstyle%
+ %\renewcommand{\theenumi}{\alph{enumi}}%
+ \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@multi@loop=\ForEachRandomItem
+ \else
+ \let\moodle@multi@loop=\ForEachFirstItem
+ \fi
+ \moodle@multi@loop{answerlist}{Answer}{\Answer}%
+ \fi
+ \end{enumerate}%
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
}
\def\moodle@print@multichoice@answer#1{%
- \moodle@print@multichoice@answer@int#1\@rdelim
+ \let\moodle@feedback=\@empty%
+ \moodle@print@multichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@multichoice@answer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@print@multichoice@answer@int@int
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@print@multichoice@answer@int@int%
}%
\def\moodle@print@multichoice@answer@int@int#1#2\@rdelim{%
\def\test@i{#1}%
- \ifmoodle@single
- \ifx\test@i\@star
- \item #2$~\checkmark$%
+ \def\test@ii{#2}%
+ \def\moodle@answertext{\item }%
+ \ifx\test@i\@star%
+ \g@addto@macro\moodle@answertext{#2}%
+ \ifmoodle@single%
+ \setkeys{moodle}{fraction=100}%
\else
- \item #1#2%
+ \setkeys{moodle}{fraction=\moodle@autopoints}%
\fi
\else
- \ifx\test@i\@star
- \item #2%
- \setkeys{moodle}{fraction=\moodle@autopoints}%
- \else
- \item #1#2%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext%
+ \trim@spaces@in\moodle@answertext%
+ \ifmoodle@handout\else
+ \ifmoodle@single%
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \ifx\moodle@fraction\@hundred%
+ \trim@spaces@in\moodle@answertext%
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else%
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
+ \else% multiple
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \moodle@checkfraction
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
\fi
- $~(\moodle@fraction\%)$
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
+ \else
+ \ifx\moodle@feedback\@empty\relax\else%
+ \g@addto@macro\moodle@answertext{\hfill \emph{$\rightarrow$ \moodle@feedback}}%
+ \fi
+ \moodle@answertext
\fi
}%
-% COMMON UTILITY: COUNTING CORRECT ANSWERS
- \newcounter{moodle@numcorrectanswers}%
+% COMMON UTILITY: COUNTING CORRECT ANSWERS (AND A BIT MORE...)
+ \newcounter{moodle@numcorrectanswers}% count the stars
+ \newcounter{moodle@numincorrectanswers}% count the items without fraction key indicated
\newlength{\moodle@pointspercorrect}%
+ \newlength{\moodle@pointsperincorrect}%
+ \newlength{\moodle@sumofpositivefractions}% sums user-set positive fractions
+ \newlength{\moodle@sumofnegativefractions}% sums user-set negative fractions
\def\moodle@countcorrectanswers{%
\setcounter{moodle@numcorrectanswers}{0}%
+ \setcounter{moodle@numincorrectanswers}{0}%
\global\setlength{\moodle@pointspercorrect}{100pt}%
+ \global\setlength{\moodle@pointsperincorrect}{-100pt}%
+ \global\setlength{\moodle@sumofpositivefractions}{0pt}%
+ \global\setlength{\moodle@sumofnegativefractions}{0pt}%
\loopthroughitemswithcommand{\moodle@countcorrectanswers@a}%
- \ifnum0=\c@moodle@numcorrectanswers\relax
- \PackageError{moodle}{No correct answers given for multiple choice question.}{Please mark at least one answer correct.}%
- \gdef\moodle@autopoints{0}%
+ \global\advance\moodle@pointspercorrect by-\moodle@sumofpositivefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofpositivefractions}%
+ \ifnum0=\c@moodle@numcorrectanswers\relax%
+ % autopoints will never be used but we check if the sum of positive fractions is 100%
+ \ifdim\moodle@pointspercorrect<-\moodle@fractiontol pt\relax%
+ \PackageWarning{moodle}{Positive fractions sum up to more than 100 (here: \ds)}%
+ \else
+ \ifdim\moodle@pointspercorrect>\moodle@fractiontol pt\relax%
+ \PackageError{moodle}{Positive fractions sum up to less than 100 (here: \ds)}%
+ \fi
+ \fi
\else
- \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax
- \edef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \ifdim0pt<\moodle@pointspercorrect\relax\else%
+ % we have starred items so the sum of user-set positive fractions must be less than 100%
+ % otherwise, starred items would lead to penalties
+ \PackageError{moodle}{Positive fractions sum up to 100 or more (here: \ds):
+ there is no positive points left to be given to starred items.}%
+ \fi
+ \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax%
\fi
+ \gdef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \global\advance\moodle@pointsperincorrect by-\moodle@sumofnegativefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofnegativefractions}%
+ \ifnum0=\c@moodle@numincorrectanswers\relax%
+ % autosanctions will never be used and
+ % we do not care about the sum of negative fractions (might be less than -100)
+ \else
+ \ifdim0pt<\moodle@pointsperincorrect\relax%
+ % we have items without fractions set: to prevent auto sanctions from becoming bonuses,
+ % such items are neutralized.
+ \PackageWarning{moodle}{Negative fractions sum up to -100 or less (here: \ds):
+ items with no fraction key set will be considered as neutral.}%
+ \global\setlength{\moodle@pointsperincorrect}{0pt}%
+ \fi
+ \global\divide\moodle@pointsperincorrect by \c@moodle@numincorrectanswers\relax%
+ \fi
+ \gdef\moodle@autosanctions{\strip@pt\moodle@pointsperincorrect}%
}
\def\moodle@countcorrectanswers@a#1{%
%The grouping is to keep key answer-specific key changes local.
@@ -1729,34 +3108,79 @@
\egroup
}%
\newcommand\moodle@countcorrectanswers@b[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@countcorrectanswers@c%
+ %\ifx&#1&%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@countcorrectanswers@c%
+ %\fi
}%
\def\moodle@countcorrectanswers@c#1#2\moodle@answer@rdelim{%
\def\test@i{#1}%
\ifx\test@i\@star
\stepcounter{moodle@numcorrectanswers}%
\else
- \global\addtolength{\moodle@pointspercorrect}{-\moodle@fraction pt}%
+ \ifx\moodle@fraction\@empty\relax%
+ \stepcounter{moodle@numincorrectanswers}%
+ \else
+ \ifdim0pt<\moodle@fraction pt\relax%
+ \global\addtolength{\moodle@sumofpositivefractions}{\moodle@fraction pt}%
+ \else
+ \global\addtolength{\moodle@sumofnegativefractions}{\moodle@fraction pt}%
+ \fi
+ \fi
\fi
}%
- \def\moodle@setautopoints#1pt{%
- \gdef\moodle@autopoints{#1}%
+ \newlength{\test@fraction}%
+ \newlength{\test@lower}%
+ \newlength{\test@upper}%
+ \def\moodle@fractionerror{%
+ \def\ds{\moodle@fraction}%
+ \PackageError{moodle}{the current fraction is not a valid value (here: \ds)}%
+ }
+ {\catcode`|=3\relax
+ \gdef\moodle@validfractionlist{0|5|10|11.11111|12.5|14.28571|16.66667|20|25|30|33.33333|40|50|60|66.66667|70|75|80|83.33333|90|100}}%
+ \def\moodle@isfractionnear#1{%
+ \setlength{\test@lower}{#1 pt}%
+ \addtolength{\test@lower}{-\moodle@fractiontol pt}%
+ \setlength{\test@upper}{#1 pt}%
+ \addtolength{\test@upper}{\moodle@fractiontol pt}%
+ \ifdim\test@upper>\test@fraction\relax
+ \ifdim\test@lower<\test@fraction\relax
+ \gdef\test@fractionmatched{#1}%
+ \fi
+ \fi
+ }
+ \def\moodle@checkfraction{%
+ %\def\test@i{#1}%
+ \setlength{\test@fraction}{\moodle@fraction pt}%
+ % take the absolute value
+ \ifdim0pt>\test@fraction\relax%
+ \setlength{\test@fraction}{-\moodle@fraction pt}%
+ \fi
+ % test if the fraction is an admissible value
+ \let\test@fractionmatched\@empty
+ \forlistloop{\moodle@isfractionnear}{\moodle@validfractionlist}%
+ \ifx\test@fractionmatched\@empty\relax
+ \moodle@fractionerror%
+ \fi
+ \ifdim\moodle@fraction pt<-\moodle@fractiontol pt\relax%
+ \setkeys{moodle}{fraction=-\test@fractionmatched}%
+ \else
+ \setkeys{moodle}{fraction=\test@fractionmatched}%
+ \fi
}
-
-% TODO: What if rounding errors make the percentages not add to 100%? Will Moodle complain?
-% TODO: Verify that negative scores are handled correctly.
% TODO: Put these macros in same order as other sections'.
% SAVING ANSWERS TO MEMORY
\def\savemultianswer#1{%
\bgroup
- \savemultianswer@int#1\moodle@answer@rdelim
+ \savemultianswer@int#1 \moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savemultianswer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
\savemultianswer@int@int%
}%
\def\savemultianswer@int@int#1#2\moodle@answer@rdelim{%
@@ -1771,12 +3195,23 @@
\else
\def\moodle@answertext{#1#2}%
\fi
+ \ifx\moodle@fraction\@empty\relax%
+ \ifmoodle@single\relax
+ \setkeys{moodle}{fraction=0}%
+ \else% multiple
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \fi
+ \trim@spaces@in\moodle@answertext
\trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="html">}%
\xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
\addto@xml[4]{\moodle@answers@xml}{ <text><![CDATA[<p>\moodle@answertext@html</p>]]></text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -1788,50 +3223,351 @@
\moodle@writesingle%
\moodle@writeshuffle%
\moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
-% \subsubsection{Matching Question Front-End}
+% \subsubsection{True/False Question Front-End}
%
% \begin{macrocode}
-\let\answer=\hfill
+% True/False has structure
+% \begin{truefalse}[options]{name}%
+% This is a matching question.
+% \item[feedback={feedback for student answering incorrectly "true"}] % first item is for true
+% \item* this is an other way of specifying answer-specific feedback
+% \end{truefalse}%
+
+%\moodle@makefrontend{truefalse}{}% We dont use the generic frontend because truefalse has no tunable penalty
-\moodle@makefrontend{matching}
+\NewEnviron{truefalse}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \expandafter\gatheritems\xa{\BODY}%
+ \let\moodle@questionheader=\gatheredheader
+ %First, the LaTeX processing
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{truefalse}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{truefalse}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \fi
+ \par
+ \noindent
+ \moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \moodle@truefalse@latexprocessing
+ %Now, writing information to XML
+ \@moodle@ifgeneratexml{%
+ \setkeys{moodle}{penalty=1}%
+ \xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname writetruefalsequestion\endcsname
+ \bgroup
+ \gdef\moodle@answers@xml{}%
+ \setkeys{moodle}{feedback={}}%
+ \xa\loopthroughitemswithcommand\xa{\xa\savetruefalseanswer}%
+ \ifnum\c@numgathereditems=1\relax%
+ \setcounter{currentitemnumber}{2}%
+ \savetruefalseanswer{}
+ \fi
+ \passvalueaftergroup{\moodle@answers@xml}%
+ \egroup
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \egroup
+ }%
% LATEX PROCESSING
-\def\moodle@matching@latexprocessing{%
+
+\def\moodle@truefalse@latexprocessing{%
+% \ifnum\c@numgathereditems>2\relax%
+% \PackageError{moodle}{Expecting at max two answers with truefalse type}
+% \fi
+ \setcounter{moodle@numcorrectanswers}{0}%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@truefalse@answer}%
+ \ifnum\c@currentitemnumber=2%
+ \item \textbf{False}%
+ \fi
+ \end{itemize}
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \ifnum\c@moodle@numcorrectanswers=0\relax%
+ \PackageError{moodle}{No answer is explicitly marked as correct (*). Be sure one answer leads to points.}%
+ \fi
+ \ifnum\c@moodle@numcorrectanswers>1\relax%
+ \PackageError{moodle}{Two answers are explicitly marked as correct (*). Be sure only one answer leads to points.}%
+ \fi
+}
+
+ \def\moodle@print@truefalse@answer#1{% here # is all what comes after "\item", that is "[options]* text"
+ \let\moodle@feedback=\@empty
+ \moodle@print@truefalse@answer@int#1\@rdelim % add an end delimiter:
+ }%
+ \newcommand\moodle@print@truefalse@answer@int[1][]{% with the optional argument, catch options and set them as keys
+ \setkeys{moodle}{#1}%
+ \moodle@print@truefalse@answer@int@int% applies to the rest: "* text\@rdelim"
+ }%
+ \def\moodle@print@truefalse@answer@int@int#1\@rdelim{% this is just to treat appart the case where nothing follows
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \moodle@print@truefalse@answer@int@int@empty
+ \else
+ \moodle@print@truefalse@answer@int@int@int#1\@rdelim
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@empty{%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ ~\hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@int#1#2\@rdelim{%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifnum\c@currentitemnumber<3%
+ \def\test@i{#1}%
+ %\trim@spaces@in\test@i
+ \ifx\test@i\@star
+ \ifmoodle@handout\else
+ ~$\checkmark$%
+ \fi
+ \stepcounter{moodle@numcorrectanswers}%
+ \else
+ ~%
+ \fi
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}%
+ \trim@spaces@in\test@ii
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star%
+ \hfill \emph{$\rightarrow$ #2}%
+ \else%
+ \hfill \emph{$\rightarrow$ #1#2}%
+ \fi
+ \fi
+ \else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ \fi
+ }%
+
+% SAVING ANSWERS TO MEMORY
+\def\savetruefalseanswer#1{%
\bgroup
- \let\answer=\hfill
- \begin{enumerate}\renewcommand{\theenumi}{\alph{enumi}}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@matching@answer}%
- \end{enumerate}%
+ \savetruefalseanswer@int#1\moodle@answer@rdelim
+ \passvalueaftergroup{\moodle@answers@xml}%
\egroup
-}
- \long\def\moodle@print@matching@answer#1{%
- \moodle@print@matching@answer@int#1\@rdelim
+}%
+ \newcommand\savetruefalseanswer@int[1][]{%
+ \setkeys{moodle}{#1}%
+ \savetruefalseanswer@int@int%
}%
- \newcommand\moodle@print@matching@answer@int[1][]{%
- \moodle@print@matching@answer@int@int\relax
+ \def\savetruefalseanswer@int@int#1\moodle@answer@rdelim{%
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \savetruefalseanswer@int@int@empty
+ \else
+ \savetruefalseanswer@int@int@int#1\moodle@answer@rdelim
+ \fi
+ }%
+ \def\savetruefalseanswer@int@int@empty{%
+ \setkeys{moodle}{fraction=0}%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax\else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
}%
- \long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
- \item #1\hfill #2%
+ \def\savetruefalseanswer@int@int@int#1#2\moodle@answer@rdelim{%
+ \def\test@i{#1}%
+ \ifx\test@i\@star
+ \setkeys{moodle}{fraction=100}%
+ \else
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#2}%
+ \else%
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#1#2}%
+ \fi%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
}%
+% WRITING QUESTION TO XML FILE
+\gdef\writetruefalsequestion{%
+ \writetomoodle{<question type="truefalse">}%
+ \moodle@writecommondata%
+}%
+% \end{macrocode}
+%
+% \subsubsection{Matching Question Front-End}
+%
+% \begin{macrocode}
+%\let\answer=\hfill
+
+\moodle@makefrontend{matching}{\moodle@makelatextag@matching}%
+
+% LATEX PROCESSING
+
+\def\moodle@makelatextag@matching{%
+ \ifmoodle@handout\else
+ \ifmoodle@draganddrop
+ \moodle@makelatextagbox{Drag and drop}\relax%
+ \fi
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
+
+\def\moodle@matching@latexprocessing{%
+ \bgroup
+ %\let\answer=\hfill
+ \par%\noindent
+ \ifmoodle@handout
+ \NewList{questionlist}
+ \NewList{answerlist}
+ \fi
+ \def\matching@table@text{}%
+ % \ifnum\c@numgathereditems>2\relax%
+% \PackageError{moodle}{Expecting at max two answers with truefalse type}
+% \fi
+ \setcounter{moodle@numcorrectanswers}{0}% Here this counter is for "questions" (items on the left column)
+ \loopthroughitemswithcommand{\moodle@print@matching@answer}%
+ \ifnum\c@numgathereditems<3%
+ \PackageWarning{moodle}{Moodle expects at least three "answers" with matching type}
+ \fi
+ \ifnum\c@moodle@numcorrectanswers<2%
+ \PackageWarning{moodle}{Moodle expects at least two "questions" with the matching type}
+ \fi
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@matching@loop=\ForEachRandomItem
+ \else
+ \let\moodle@matching@loop=\ForEachFirstItem
+ \fi
+ \moodle@matching@loop{questionlist}{Question}{
+ \xdef\test@i{\Question}%
+ \ExtractRandomItem{answerlist}{Answer}%
+ \ifx\test@i\@empty
+ \xdef\matching@table@text{\expandonce\matching@table@text & & $\bullet$~\expandonce\Answer\\}%
+ \else
+ \xdef\matching@table@text{\expandonce\matching@table@text\expandonce\Question~$\bullet$ & & $\bullet$~\expandonce\Answer\\}%
+ \fi
+ }%
+ \fi
+ \begin{tabular}{@{}>{\raggedleft}p{.45\linewidth}p{.1\linewidth}p{.45\linewidth}@{}}%
+ \matching@table@text
+ \end{tabular}%
+ \par
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \egroup
+}
+
+\long\def\moodle@print@matching@answer#1{%
+ \moodle@print@matching@answer@int#1 \@rdelim
+}%
+\newcommand\moodle@print@matching@answer@int[1][]{%
+ \moodle@print@matching@answer@int@int
+}%
+\long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
+ \def\test@i{#1}%
+ \trim@spaces@in\test@i
+ \ifmoodle@handout
+ \ifx\test@i\@empty
+ \InsertLastItem{questionlist}{\@empty}%
+ \else
+ \InsertLastItem{questionlist}{#1}%
+ \fi
+ \InsertLastItem{answerlist}{#2}%
+ \else
+ \ifx\test@i\@empty
+ \g@addto@macro\matching@table@text{&&$\bullet$~#2\\}%
+ \else
+ \stepcounter{moodle@numcorrectanswers}%
+ \xa\g@addto@macro\xa\matching@table@text\xa{\test@i~$\bullet$&\leavevmode\cleaders\hb@xt@.44em{\hss$\cdot$\hss}\hfill\kern\z@&$\bullet$~#2\\}%
+ \fi
+ \fi
+}%
+
% SAVING ANSWERS TO MEMORY
\long\def\savematchinganswer#1{%
\bgroup
- \savematchinganswer@int#1\moodle@answer@rdelim%
+ \savematchinganswer@int#1 \moodle@answer@rdelim%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savematchinganswer@int[1][]{%
\setkeys{moodle}{#1}%
- \xa\savematchinganswer@int@int\space%
+ \savematchinganswer@int@int%\space
}%
\long\def\savematchinganswer@int@int#1\answer#2\moodle@answer@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
% Note that #1 may simply be \relax.
\def\moodle@subquestiontext{#1}%
\def\moodle@subanswertext{#2}%
@@ -1854,9 +3590,12 @@
% \show\moodle@subanswertext
\addto@xml[4]{\moodle@answers@xml}{ <answer><text>\moodle@subanswertext</text></answer>}%
\fi
- \ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
- \fi
+% \ifx\moodle@feedback\@empty\relax\else
+% \trim@spaces@in\moodle@feedback
+% \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+% \addto@xml[4]{\moodle@answers@xml}{ <feedback
+%format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+% \fi
\addto@xml[2]{\moodle@answers@xml}{</subquestion>}%
}%
@@ -1868,12 +3607,9 @@
\writetomoodle{<question type="matching">}%
\fi
\moodle@writecommondata%
- \moodle@writesingle%
+% \moodle@writesingle% %irrelevant for the matching type
\moodle@writeshuffle%
- \moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
-% \gdef\moodle@answ
+% \moodle@writeanswernumbering% %irrelevant for the matching type
}%
% \end{macrocode}
%
@@ -1896,6 +3632,8 @@
% LATEX PROCESSING
% SAVING ANSWERS TO MEMORY
+\newif\ifmoodle@clozemode
+\moodle@clozemodefalse
\NewEnviron{cloze}[2][]{%
\bgroup
\setkeys{moodle}{default grade=1}%
@@ -1903,9 +3641,30 @@
% A cloze question won't have any \item's in it, so we just use \BODY.
\moodle@enableclozeenvironments
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{cloze}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{cloze}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ \par
\noindent
\BODY
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ %\csname moodle@cloze@latexprocessing\endcsname
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\BODY}% Save the question text as HTML.
@@ -1927,6 +3686,7 @@
\gdef\writeclozequestion{%
\writetomoodle{<question type="cloze">}%
\moodle@writecommondata%
+ \moodle@writetags%
\writetomoodle{</question>}%
}%
% \end{macrocode}
@@ -1934,7 +3694,6 @@
% \subsubsection{Cloze Multiple Choice Questions}
%
% \begin{macrocode}
-% TODO: Guard against [single=false] option
\NewEnviron{clozemulti}[1][]{%
\bgroup
@@ -1947,40 +3706,88 @@
\def\moodle@clozemulti@output{}%
\xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\moodle@questionheader}%
\def\clozemulti@coding{}%
- \edef\clozemulti@coding{\otherlbrace\csname moodle@default grade\endcsname:}%
+ \edef\clozemulti@coding{\csname moodle@default grade\endcsname:}%
+ \ifmoodle@multiple
+ \PackageWarning{moodle}{Cloze Multiresponse only supported by Moodle 3.5+}
+ \g@addto@macro{\clozemulti@coding}{MULTIRESPONSE}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{MULTICHOICE}%
+ \fi
\ifcase\moodle@multi@mode\relax
- % Case 0: dropdown box style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE:}%
+ % Case 0: dropdown box style
+ \ifmoodle@shuffle
+ \g@addto@macro{\clozemulti@coding}{_}%
+ \fi
\or
% Case 1: vertical style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_V:}%
+ \ifmoodle@multiple
+ \PackageError{moodle}{Vertical mode (dropdown box) incompatible with multiresponse.}
+ \else
+ \g@addto@macro{\clozemulti@coding}{_V}%
+ \fi
\else
% Case 2: horizontal radio buttons
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_H:}%
+ \g@addto@macro{\clozemulti@coding}{_H}%
+ \fi
+ \ifmoodle@shuffle
+ \PackageWarning{moodle}{Cloze Multi Shuffling only supported by Moodle 3.0+}
+ \g@addto@macro{\clozemulti@coding}{S:}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozemultichoiceanswer}%
\egroup
- \xa\g@addto@macro\xa\clozemulti@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\clozemulti@coding}%
+ %\xa\g@addto@macro\xa\clozemulti@coding\xa{\clozerbrace}%
+ \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\xa\clozelbrace\clozemulti@coding\clozerbrace}%
+ %\show\moodle@clozemulti@output
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozemulti@output}%
\def\endclozemulti@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{multi}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@multi
+ \fi
\def\cloze@multichoice@table@text{}%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ %\let\moodle@feedback=\@empty
\loopthroughitemswithcommand{\moodle@print@clozemultichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@clozemult@loop=\ForEachRandomItem
+ \else
+ \let\moodle@clozemult@loop=\ForEachFirstItem
+ \fi
+ \moodle@clozemult@loop{answerlist}{Answer}{
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\Answer}%
+ }%
+ \fi
\ifcase\moodle@multi@mode\relax
%Case 0: dropdown box style
- \begin{tabular}[t]{|l|}\firsthline% (\firsthline is from the array package.)
+ \par\noindent
+ \ifmoodle@handout
+ \begin{tabular}[t]{|p{.45\linewidth}|}
+ \else
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+% answer & feedback \\\hline\hline
+ \fi
+ \firsthline% (\firsthline is from the array package.)
\cloze@multichoice@table@text%
\end{tabular}%
+ \par%
\or
%Case 1: vertical style
+ \par\noindent
\begin{itemize}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
\cloze@multichoice@table@text%
\end{itemize}%
+ \par%
\else
%Case 2: horizontal radio buttons
\par{\cloze@multichoice@table@text}\par%
@@ -1994,40 +3801,75 @@
\def\moodle@print@clozemultichoice@answer#1{%
- \moodle@print@clozemultichoice@answer@int#1\@rdelim%
+ \let\moodle@feedback=\@empty
+ \moodle@print@clozemultichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@clozemultichoice@answer@int[1][]{%
+ \setkeys{moodle}{fraction=0,#1}%
\moodle@print@clozemultichoice@answer@int@int%
}%
\def\moodle@print@clozemultichoice@answer@int@int#1#2\@rdelim{%
+ \def\moodle@answertext{}%
% Case 0: "(answer) \\ \hline"
% Case 1: "\item (answer)"
% Case 2: "$\bullet~$(answer)\hfill"
\ifcase\moodle@multi@mode\relax
\relax% Case 0
\or
- \g@addto@macro\cloze@multichoice@table@text{\item}% Case 1
+ \g@addto@macro\moodle@answertext{\item}% Case 1
\else
- \g@addto@macro\cloze@multichoice@table@text{$\bullet~$}% Case 2
+ \g@addto@macro\moodle@answertext{$\bullet~$}% Case 2
\fi
\def\test@i{#1}%
\ifx\test@i\@star
- \g@addto@macro\cloze@multichoice@table@text{#2$~\checkmark$}%
+ \setkeys{moodle}{fraction=100}%
+ \g@addto@macro\moodle@answertext{#2}%
\else
- \g@addto@macro\cloze@multichoice@table@text{#1#2}%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
+ \ifmoodle@handout\else
+ \ifx\moodle@fraction\@hundred
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
\fi
\ifcase\moodle@multi@mode\relax
- \g@addto@macro{\cloze@multichoice@table@text}{\\ \hline}% Case 0
- \or
- \relax% Case 1
+ % Case 0
+ \ifmoodle@handout\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext &\expandonce\emph{\expandonce\moodle@feedback}}%
+ \fi
+ \g@addto@macro\moodle@answertext{\\\hline}
+ \or % Case 1
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext \hfill \expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \else % otherwise
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext\,\expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \g@addto@macro\moodle@answertext{\hfill}% Case 2
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
\else
- \g@addto@macro{\cloze@multichoice@table@text}{\hfill}% Case 2
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\moodle@answertext}%
\fi
}%
\def\saveclozemultichoiceanswer#1{%
\bgroup
- \saveclozemultichoiceanswer@int#1\moodle@answer@rdelim
+ \saveclozemultichoiceanswer@int#1 \moodle@answer@rdelim
\egroup
}%
\newcommand\saveclozemultichoiceanswer@int[1][]{%
@@ -2046,17 +3888,18 @@
\def\moodle@answertext{#1#2}%
\fi
\trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozemulti@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\expandonce\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2075,23 +3918,35 @@
\def\moodle@clozenumerical@output{}%
\xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\moodle@questionheader}%
\def\clozenumerical@coding{}%
- \edef\clozenumerical@coding{\otherlbrace\csname moodle@default grade\endcsname:NUMERICAL:}%
+ \edef\clozenumerical@coding{\csname moodle@default grade\endcsname:NUMERICAL:}%
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozenumericalanswer}%
\egroup
- \xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\clozenumerical@coding}%
+ %\xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\xa\clozelbrace\clozenumerical@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozenumerical@output}%
\def\endclozenumerical@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@numerical@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@numerical@table@text\hline%
- \end{tabular}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{numerical}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@numerical
+ \par
+ \noindent
+ \def\cloze@numerical@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+% answer & feedback \\\hline\hline
+ \cloze@numerical@table@text%
+ \end{tabular}%
+ \par%
+ \fi
\def\endclozenumerical@code{\relax}%
\fi
\passvalueaftergroup\endclozenumerical@code%
@@ -2100,6 +3955,7 @@
}[\endclozenumerical@code]%
\def\moodle@print@clozenumerical@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozenumerical@answer@int#1\@rdelim
\egroup
@@ -2110,17 +3966,23 @@
}%
\def\moodle@print@clozenumerical@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozenumericalprint@fraction{$\checkmark$}%
+ \def\moodle@clozenumericalprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozenumericalprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozenumericalprint@fraction{$(~\moodle@fraction\%)$}%
\fi
- \ifdim0pt=\moodle@tolerance pt\relax
+ \ifnum\z@=\moodle@tolerance
\def\moodle@clozenumericalprint@tolerance{}%
\else
- \edef\moodle@clozenumericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \edef\moodle@clozenumericalprint@tolerance{$\,\pm\,$\moodle@printnum{\moodle@tolerance}}%
\fi
- \xdef\moodle@clozenumericalprint@line{$#1\moodle@clozenumericalprint@tolerance$ & \moodle@clozenumericalprint@fraction}%
- \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\}%
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \xdef\moodle@clozenumericalprint@line{#1~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \else
+ \xdef\moodle@clozenumericalprint@line{\moodle@printnum{#1}\moodle@clozenumericalprint@tolerance~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \fi
+ \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\\hline}%
}%
@@ -2142,15 +4004,20 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozenumerical@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \ifx\moodle@answertext\@star
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext}%
+ \else
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \fi
\ifx\moodle@feedback\@empty\else
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\moodle@feedback}%
+ %\trim@spaces@in\moodle@feedback
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2177,29 +4044,38 @@
\xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\moodle@questionheader}%
\def\clozeshortanswer@coding{}%
\ifnum\count0=1\relax
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
\else
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozeshortansweranswer}%
\egroup
- \xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\clozeshortanswer@coding}%
+ %\xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\xa\clozelbrace\clozeshortanswer@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozeshortanswer@output}%
\def\endclozeshortanswer@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@shortanswer@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
- \ifnum\count0=1\relax
- \marginpar{\tiny\mbox{(Case-Sensitive)}}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{shortanswer}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@shortanswer
+ \par
+ \noindent
+ \def\cloze@shortanswer@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+% answer & feedback \\\hline\hline
+ \cloze@shortanswer@table@text%
+ \end{tabular}%
+ \par%
\fi
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@shortanswer@table@text\hline%
- \end{tabular}%
\def\endclozeshortanswer@code{\relax}%
\fi
\passvalueaftergroup\endclozeshortanswer@code%
@@ -2208,6 +4084,7 @@
}[\endclozeshortanswer@code]%
\def\moodle@print@clozeshortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozeshortanswer@answer@int#1\@rdelim
\egroup
@@ -2218,12 +4095,13 @@
}%
\def\moodle@print@clozeshortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozeshortanswerprint@fraction{$\checkmark$}%
+ \def\moodle@clozeshortanswerprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozeshortanswerprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozeshortanswerprint@fraction{$~(\moodle@fraction\%)$}%
\fi
- \xdef\moodle@clozeshortanswerprint@line{#1 & \moodle@clozeshortanswerprint@fraction}%
- \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\}%
+ \xdef\moodle@clozeshortanswerprint@line{#1~\moodle@clozeshortanswerprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\\hline}%
}%
@@ -2245,15 +4123,15 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozeshortanswer@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2270,15 +4148,20 @@
\catcode`\&=12\gdef\otherampersand{&}%
\catcode`\^=12\gdef\othercaret{^}%
\catcode`\$=12\gdef\otherdollar{$}%
- \catcode`\%=12\gdef\otherpercent{%}}%
+ \catcode`\%=12\gdef\otherpercent{%}
+ \catcode`\%=12\gdef\otherlbracket{[}
+ \catcode`\%=12\gdef\otherrbracket{]}}%
{\catcode`\ =12\gdef\otherspace{ }}%
-{\tt\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
+{\ttfamily\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
{\catcode`\[=1\catcode`\]=2\catcode`\{=12\catcode`\}=12%
- \gdef\otherlbrace[{]\gdef\otherrbrace[}]]
-
+ \gdef\otherlbrace[{]\gdef\otherrbrace[}]\gdef\clozelbrace[{]\gdef\clozerbrace[}]]%
\edef\@otherlbrace{\otherlbrace}%
\edef\@otherrbrace{\otherrbrace}%
+\edef\@otherlbracket{\otherlbracket}%
+\edef\@otherrbracket{\otherrbracket}%
+\edef\@clozelbrace{\clozelbrace}%
+\edef\@clozerbrace{\clozerbrace}%
\edef\@otherdollar{\otherdollar}%
\edef\@otherbackslash{\otherbackslash}%
\edef\@othertilde{\othertilde}%
@@ -2381,9 +4264,16 @@
% \end{macrocode}
%
% \subsection{Level-Tracking}
+%
+% \subsubsection{TeX groups}
+% While parsing, we'll need to keep track of how deeply nested in \TeX\ groups we are.
+% \begin{macrocode}
+\newcount\grouplevel
+% \end{macrocode}
+%
+% \subsubsection{Math mode}
% While parsing, we'll need to keep track of whether
-% we are in math mode (and how many levels deep the math mode might be nested),
-% and also how deeply nested in \TeX\ groups we are.
+% we are in math mode (and how many levels deep the math mode might be nested).
% \begin{macrocode}
\newcount\moodle@mathmodedepth
\moodle@mathmodedepth=0\relax
@@ -2393,12 +4283,15 @@
\else
#2%
\fi
-}
-
-\newcount\grouplevel
+}%
+% \end{macrocode}
+%
+% \subsubsection{Nested Lists}
+% While parsing, we'll need to keep track levels of nested list.
+% \begin{macrocode}
+\newcount\moodle@listdepth
+\moodle@listdepth=0\relax
-\newif\ifhtmlizer@active
-\htmlizer@activefalse
% \end{macrocode}
%
% \subsection{Separation}
@@ -2436,6 +4329,8 @@
% \subsection{Main Code: the HTMLizer}
%
% \begin{macrocode}
+\newif\ifhtmlizer@active
+\htmlizer@activefalse
\newif\ifhtmlize@actioncs
\newif\ifhtmlize@expandcs
\newif\ifhtmlize@passcs
@@ -2456,7 +4351,7 @@
\advance\grouplevel by 1\relax
\bgroup
\ultradetokenize@to@macro\htmlize@texttoscan{#1}%
- \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i
+ \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i%
\egroup
\advance\grouplevel by -1\relax
}%
@@ -2502,7 +4397,13 @@
\gdef\htmlize@scrap{\converttohtml@int}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\htmlize@blockinbraces}}%
\g@addto@macro\htmlize@scrap{\g@addto@macro\htmlize@output}%
- \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \ifmoodle@clozemode
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherbackslash\otherrbrace}}%
+% \moodle@ifmathmode{\xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherbackslash}}}%
+% {}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \fi
\g@addto@macro\htmlize@scrap{\htmlize@recursive@i}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\htmlize@remainder@detokenized\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i}%
% Okay, that's done. It's stored in a global macro.
@@ -2519,10 +4420,10 @@
\htmlize@displaymathshift@replace#1#2#3\htmlize@rdelim@iii%
\else
% Single dollar sign, so we're entering inline math mode.
- % We grab everything between $$...$$, sanitize it, and add it verbatim to
+ % We grab everything between $...$, sanitize it, and add it verbatim to
% our output.
\htmlize@inlinemathshift@replace#1#2#3\htmlize@rdelim@iii%
- \fi
+ \fi% \ifx\test@ii\@otherdollar
% Now we resume work.
% The \htmlize@xxxxxxmathshift@replace macro stored the remaining text in \htmlize@remaining@text.
% Note that since we never detokenized and retokenized #1#2#3,
@@ -2647,9 +4548,9 @@
%\edef\ds{Must pass on \xa\string\@htmlize@cs}\show\ds
\g@addto@macro\htmlize@output{#1}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
+ \fi% \ifhtmlize@expandcs
+ \fi% \ifhtmlize@actioncs
+ \fi% \ifx\@htmlize@cs\@@begin@cs
\else%
\ifx\test@i\@othertilde%
% The ~ becomes non-breaking space &nbsp;
@@ -2664,7 +4565,7 @@
\else
\g@addto@macro\htmlize@output{\otherampersand lsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@lsinglequote%
\else
\ifx\test@i\@rsinglequote%
\ifx\test@ii\@rsinglequote%
@@ -2674,7 +4575,7 @@
\else
\g@addto@macro\htmlize@output{\otherampersand rsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@rsinglequote%
\else
\ifx\test@i\@doublequote
\g@addto@macro\htmlize@output{\otherampersand rdquo;}%
@@ -2689,20 +4590,20 @@
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherampersand gt;}}%
{\g@addto@macro\htmlize@output{>}}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \else
+ \else
% Default case: write first token to output, call self on remaining tokens.
\g@addto@macro\htmlize@output{#1}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
+ \fi% \ifx\test@i\@gt
+ \fi% \ifx\test@i\@lt
+ \fi% \ifx\test@i\@doublequote
+ \fi% \ifx\test@i\@rsinglequote%
+ \fi% \ifx\test@i\@lsinglequote%
+ \fi% \ifx\test@i\@othertilde%
+ \fi% \ifx\test@i\@otherbackslash%
+ \fi% \ifx\test@i\@otherdollar%
+ \fi% \ifx\test@i\@otherlbrace%
+ \fi% \ifx\test@i\@@htmlize@stop
\htmlize@next@i
}%
@@ -2721,16 +4622,38 @@
\edef\inlinemathleftdelim{\otherbackslash(}%
\def\inlinemathrightdelim#1{\advancemathmodecounter{-1}%
\g@addto@macro\htmlize@output{\otherbackslash)}}%
-\edef\displaymathleftdelim{<CENTER>\otherbackslash[}%
+\edef\displaymathleftdelim{\otherbackslash[}%
\def\displaymathrightdelim#1{\advancemathmodecounter{-1}%
- \g@addto@macro\htmlize@output{\otherbackslash]</CENTER>}}%
+ \g@addto@macro\htmlize@output{\otherbackslash]}}%
+\long\def\htmlize@inlinemath@recursive@i#1#2#3\htmlize@rdelim@i{%
+ % inspired by \htmlize@recursive@i
+ \def\test@i{#1}%
+ \ifx\test@i\@@htmlize@stop
+ \let\htmlize@next@i=\relax
+ \else
+ \ifx\test@i\@otherbackslash
+ \g@addto@macro\mathtext{#1#2}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#3\htmlize@rdelim@i}%
+ \else
+ \ifx\test@i\@otherdollar
+ \let\htmlize@next@i=\relax
+ \g@addto@macro\aftertext{#2#3}%
+ \else
+ \g@addto@macro\mathtext{#1}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#2#3\htmlize@rdelim@i}%
+ \fi
+ \fi
+ \fi
+ \htmlize@next@i
+}
{\catcode`\$=12\relax%
- \gdef\htmlize@inlinemathshift@replace$#1$#2\htmlize@rdelim@iii{%
+ \gdef\htmlize@inlinemathshift@replace#1#2\htmlize@rdelim@iii{%
%\def\ds{inline math shift has '#1' and '#2'}\show\ds
\xa\g@addto@macro\xa\htmlize@output\xa{\inlinemathleftdelim}%
\advancemathmodecounter{1}%
- \def\mathtext{#1}%
- \def\aftertext{#2}%
+ \gdef\mathtext{}%
+ \gdef\aftertext{}%
+ \htmlize@inlinemath@recursive@i#2\htmlize@rdelim@i%
\xdef\htmlize@remaining@text{\expandonce\mathtext%
\otherbackslash inlinemathrightdelim{}%
\expandonce\aftertext}%
@@ -2746,6 +4669,7 @@
\expandonce\aftertext}%
}%
}
+
% \end{macrocode}
%
% \subsection{Engines for Control Sequences}
@@ -2847,6 +4771,25 @@
\xa\g@addto@macro\xa\htmlize@activate@css\xa{\htmlize@scrap}%
\xa\def\csname html@\string#1\endcsname% %And this \def\html@\oldcsname is follows by the remainder of the definition.
}
+\def\html@action@newcommand#1[#2][#3]#4{%
+ %\message{>>> Defining #1[#2][#3]{...} ^^J}
+ \ifmoodle@draftmode
+ \else
+ \xa\html@action@def\csname #1\endcsname{\csname moodle@#1@int\endcsname}%
+ \fi
+ % Note that \htmlize@do@actioncs will 'patch' this by putting
+ % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
+ % at the end. We want those 3 tokens to occur instead after
+ % the graphics filename.
+ \xa\csdef{moodle@#1@int}##1##2##3{\csname moodle@#1@int@int\endcsname}%
+ % This gobbles up those three spurious tokens,
+ % which we will re-insert after our work is done.
+ \xa\newcommand\csname moodle@#1@int@int\endcsname[#2][#3]{%
+ #4%
+ % Now we re-insert the code to get the HTMLizing going again.
+ \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
+ }%
+}
% \end{macrocode}
%
% \subsubsection{Engine for expansion control sequences}
@@ -2868,6 +4811,24 @@
}
\let\htmlregister=\htmlize@record@expand
% \end{macrocode}
+% Often users define a list of macros at the end of the preamble.
+% It can be cumbersome to record individually these macros for expansion.
+% By calling |\moodleregisternewcommands| they trigger the automatic
+% expansion of macros defined subsequently using |\newcommand|,
+% |\renewcommand|, |\providecommand| or their starred variants.
+% \begin{macrocode}
+\def\moodleregisternewcommands{%
+ %% INSPIRED FROM
+ %https://tex.stackexchange.com/questions/73271/how-to-redefine-or-patch-the-newcommand-command
+ \newcommand*{\saved@ifdefinable}{}
+ \let\saved@ifdefinable\@ifdefinable
+ \renewcommand{\@ifdefinable}[2]{%
+ \saved@ifdefinable{##1}{##2}%
+ \htmlregister{##1}
+ }%
+ \let\@@ifdefinable\@ifdefinable
+}%
+% \end{macrocode}
% On the other hand, if an alternate version of the macro is
% needed for HTML purposes, you can define its HTML version with
% |\html@def\mymacro...|
@@ -2901,20 +4862,50 @@
\htmlize@record@environment{shortanswer}
\html@newenvironment{center}{\xdef\htmlize@afteraction@hook{<CENTER>\expandonce\BODY</CENTER>}}%
-\html@newenvironment{enumerate}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<OL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</OL>}%
-}%
-\html@newenvironment{itemize}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<UL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</UL>}%
+
+\def\moodle@save@getitems@state{%
+ \global\xa\xdef\csname moodle@currentitemnumber@level@\the\moodle@listdepth\xa\endcsname\xa{\thecurrentitemnumber}%
+ \global\xa\xdef\csname moodle@numgathereditems@level@\the\moodle@listdepth\xa\endcsname\xa{\thenumgathereditems}%
+ \moodle@saveitems{\thenumgathereditems}%
+}%
+\def\moodle@restore@getitems@state{%
+ \setcounter{numgathereditems}{\csname moodle@numgathereditems@level@\the\moodle@listdepth\endcsname}%
+ \setcounter{currentitemnumber}{\csname moodle@currentitemnumber@level@\the\moodle@listdepth\endcsname}%
+ \moodle@restoreitems{\thenumgathereditems}%
+}%
+\def\moodle@saveitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{moodle@level@\the\moodle@listdepth @item@#1}{getitems@item@#1}%
+ \xa\moodle@saveitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
+}%
+\def\moodle@restoreitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{getitems@item@#1}{moodle@level@\the\moodle@listdepth @item@#1}%
+ \global\xa\let\csname moodle@level@\the\moodle@listdepth @item@#1\endcsname=\@undefined
+ \xa\moodle@restoreitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
+}%
+\def\moodle@makelistenv#1#2{%
+ \html@newenvironment{#1}{%
+ \advance\moodle@listdepth by 1\relax
+ \moodle@save@getitems@state%
+ \xa\gatheritems\xa{\BODY}%
+ \gdef\htmlize@afteraction@hook{<#2>}%
+ \loopthroughitemswithcommand{\moodle@itemtoLI}%
+ \g@addto@macro\htmlize@afteraction@hook{</#2>}%
+ \moodle@restore@getitems@state%
+ \advance\moodle@listdepth by -1\relax
+ }%
}%
+
+\moodle@makelistenv{enumerate}{OL}%
+\moodle@makelistenv{itemize}{UL}%
+
\def\moodle@itemtoLI#1{%
- \g@addto@macro\htmlize@afteraction@hook{<LI>#1</LI>}%
+ \g@addto@macro\htmlize@afteraction@hook{<LI>#1}%
+ \trim@spaces@in\htmlize@afteraction@hook%
+ \g@addto@macro\htmlize@afteraction@hook{</LI>}%
}%
% \end{macrocode}
@@ -2925,11 +4916,15 @@
\def\advancemathmodecounter#1{%
\global\advance\moodle@mathmodedepth by #1\relax
}
+\def\openclozemode{%
+ \global\moodle@clozemodetrue\relax
+}
+\def\endclozemode{%
+ \global\moodle@clozemodefalse\relax
+}
\htmlize@record@action{\advancemathmodecounter}%
-
-
-
-
+\htmlize@record@action{\openclozemode}%
+\htmlize@record@action{\endclozemode}%
\htmlize@record@action{\relax}%
\html@action@def\#{\g@addto@macro\htmlize@output{\otherhash}}%
@@ -2942,15 +4937,32 @@
}%
\html@action@def\}{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherrbrace}}%
- {\g@addto@macro\htmlize@output{\otherrbrace}}%
+ {\ifmoodle@clozemode\g@addto@macro\htmlize@output{\otherbackslash}\fi
+ \g@addto@macro\htmlize@output{\otherrbrace}}%
+ }%
+\html@action@def\[{%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash\otherlbracket}%
+ }%
+\html@action@def\]{%
+ \g@addto@macro\htmlize@output{\otherbackslash\otherrbracket}%
+ \advancemathmodecounter{-1}
+ }%
+\html@action@def\({%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash(}%
+ }%
+\html@action@def\){%
+ \g@addto@macro\htmlize@output{\otherbackslash)}%
+ \advancemathmodecounter{-1}
}%
\html@action@def\ldots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\ldots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\dots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\dots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\ {%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherspace}}%
@@ -2959,12 +4971,25 @@
\html@action@def\${%
\g@addto@macro\htmlize@output{\otherdollar}%
}%
-
\html@action@def\clozetilde{%
\xa\g@addto@macro\xa\htmlize@output\xa{\othertilde}%
}%
+\html@action@def\clozelbrace{%
+ \openclozemode
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherlbrace}%
+ }%
+\html@action@def\clozerbrace{%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherrbrace}%
+ \endclozemode
+ }%
+\html@action@def\TeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash TeX\otherbackslash)}
+ }%
+\html@action@def\LaTeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash LaTeX\otherbackslash)}
+ }%
-
+{\catcode`;=12\relax\gdef\othersemicol{;}}
%Diacritical marks over vowels
{\catcode`|=3\relax
@@ -2974,32 +4999,40 @@
\g@addto@macro\htmlize@activate@css{%
\def#1##1{%
\ifinlist{##1}{\htmlize@vowels}%
- {\g@addto@macro\htmlize@output{\otherampersand##1#2;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand##1#2\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string#1##1}}%
}%
}%
}
\htmlize@define@diacritic{\^}{circ}%
\htmlize@define@diacritic{\'}{acute}%
-\htmlize@define@diacritic{\"}{uml}%
\htmlize@define@diacritic{\`}{grave}%
+%Diaeresis/Tréma/Umlaut
+{\catcode`|=3\relax
+ \gdef\htmlize@diaeresis{a|e|i|o|u|y|A|E|I|O|U|Y|}}
+\html@action@def\"#1{%
+ \ifinlist{#1}{\htmlize@diaeresis}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1uml\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\"#1}}%
+}%
+
%Hungarian long-umlaut diacritics
\def\@o{o}\def\@O{O}\def\@u{u}\def\@U{U}%
\html@action@def\H#1{%
\bgroup
\def\test@i{#1}%
\ifx\test@i\@O
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash336\othersemicol}%
\else
\ifx\test@i\@o
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash337\othersemicol}%
\else
- \ifx\test@i\U
- \def\toadd{\otherampersand\otherhash368;}%
+ \ifx\test@i\@U
+ \def\toadd{\otherampersand\otherhash368\othersemicol}%
\else
- \ifx\test@i\u
- \def\toadd{\otherampersand\otherhash369;}%
+ \ifx\test@i\@u
+ \def\toadd{\otherampersand\otherhash369\othersemicol}%
\else
\def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
\fi
@@ -3010,50 +5043,275 @@
\egroup
}%
+%Cedilla
+\def\@c{c}\def\@C{C}\def\@s{s}\def\@S{S}\def\@t{t}\def\@T{T}%
+\html@action@def\c#1{%
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@c
+ \def\toadd{\otherampersand ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@C
+ \def\toadd{\otherampersand Ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@s
+ \def\toadd{\otherampersand\otherhash351\othersemicol}%
+ \else
+ \ifx\test@i\@S
+ \def\toadd{\otherampersand\otherhash350\othersemicol}%
+ \else
+ \ifx\test@i\@t
+ \def\toadd{\otherampersand\otherhash355\othersemicol}%
+ \else
+ \ifx\test@i\@T
+ \def\toadd{\otherampersand\otherhash354\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+}%
%Tilde over a, n, o
{\catcode`|=3\relax
\gdef\htmlize@tilde{A|N|O|a|n|o|}}
\html@action@def\~#1{%
\ifinlist{#1}{\htmlize@tilde}%
- {\g@addto@macro\htmlize@output{\otherampersand#1tilde;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1tilde\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string\~#1}}%
- }%
+}%
+
+% breve diacritics
+{\catcode`|=3\relax
+ \gdef\htmlize@breve{A|G|U|a|g|u|}}
+\def\@e{e}\def\@E{E}\def\@i{i}\def\@ii{\i}\def\@I{I}\def\@o{o}\def\@O{O}%
+\html@action@def\u#1{%
+ \ifinlist{#1}{\htmlize@breve}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1breve\othersemicol}}%
+ {
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@E
+ \def\toadd{\otherampersand\otherhash276\othersemicol}%
+ \else
+ \ifx\test@i\@e
+ \def\toadd{\otherampersand\otherhash277\othersemicol}%
+ \else
+ \ifx\test@i\@I
+ \def\toadd{\otherampersand\otherhash300\othersemicol}%
+ \else
+ \ifx\test@i\@i
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@ii
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@O
+ \def\toadd{\otherampersand\otherhash334\othersemicol}%
+ \else
+ \ifx\test@i\@o
+ \def\toadd{\otherampersand\otherhash335\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+ }%
+}%
+
+% caron diacritics
+{\catcode`|=3\relax
+ \gdef\htmlize@caron{C|D|E|L|N|R|S|T|Z|c|d|e|l|n|r|s|t|z|}}
+\html@action@def\v#1{%
+ \ifinlist{#1}{\htmlize@caron}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1caron\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\v#1}}%
+}%
% \end{macrocode}
%
% \subsubsection{Command sequences for Expansion}
%
% \begin{macrocode}
-\html@def\underline#1{<SPAN STYLE="text-decoration: underline;">#1</SPAN>}
+\html@def\underline#1{<SPAN STYLE=\&\#34;text-decoration: underline;\&\#34;>#1</SPAN>}
\html@def\emph#1{<EM>#1</EM>}%
+\html@def\textit#1{<I>#1</I>}%
\html@def\textbf#1{<B>#1</B>}%
+\html@def\texttt#1{<CODE>#1</CODE>}%
+\html@def\textsc#1{<SPAN STYLE=\&\#34;font-variant: small-caps;\&\#34;>#1</SPAN>}
+\html@def\url#1{<A href=\&\#34;#1\&\#34;>#1</A>}%
+\html@def\href#1#2{<A href=\&\#34;#1\&\#34;>#2</A>}%
+\html@def\textsuperscript#1{<SUP>#1</SUP>}%
+\html@def\up#1{<SUP>#1</SUP>}%
+\html@def\fup#1{<SUP>#1</SUP>}%
+\html@def\textsubscript#1{<SUB>#1</SUB>}%
\html@def\blank{____________}%
\html@def\par{</P><P>}%
\html@def\aa{\&aring;}%
\html@def\AA{\&Aring;}%
\html@def\ae{\&aelig;}%
\html@def\AE{\&AElig;}%
+\html@def\oe{\&oelig;}%
+\html@def\OE{\&OElig;}%
\html@def\S{\&sect;}%
\html@def\euro{\&euro;}%
\html@def\texteuro{\&euro;}%
\html@def\o{\&oslash;}%
\html@def\O{\&Oslash;}%
\html@def\ss{\&szlig;}%
+\html@def\SS{\&\#7838;}%
\html@def\l{\&lstrok;}%
\html@def\L{\&Lstrok;}%
+\html@def\og{\&laquo;\&\#8239;}%
+\html@def\guillemotleft{\&laquo;\&\#8239;}%
+\html@def\fg{\&\#8239;\&raquo;}%
+\html@def\guillemotright{\&\#8239;\&raquo;}%
+\html@def\,{\&\#8239;}%
+\html@def\thinspace{\&\#8239;}%
+\html@def\textbackslash{\&\#92;}%
+\html@def\_{\&\#95;}%
+\html@def\textquestiondown{\&iquest;}%
+\html@def\textexclamdown{\&iexcl;}%
% AH CUSTOM MACROS TO EXPAND --- remove these before publishing!
-\htmlize@record@expand{\inv}%
-\htmlize@record@expand{\rec}%
+%\htmlize@record@expand{\inv}%
+%\htmlize@record@expand{\rec}%
\htmlize@record@action\inlinemathrightdelim
\htmlize@record@action\displaymathrightdelim
-
% \end{macrocode}
%
-% \subsection{Graphics via {\tt\string\includegraphics}}
+% \subsection{Graphics via {\ttfamily\string\includegraphics}}
%
+% \subsubsection{Finding Media Files}
+% The following code is adapted from the command |\Ginclude@graphics| as
+% found in |graphics.sty|.
+% Calling |\moodle@media@find|\marg{filename} looks for the file the
+% same way |\includegraphics| does, with or without extension provided,
+% in the current folder and in folders specified with |\graphicspath{}|.
+% The allowed extensions and their relative priorities can be set
+% via |\DeclareGraphicsExtensions{}|.
+% The outcome is that the macros |\moodle@media@base| and |\moodle@media@ext|
+% are set with the basename, including path, and extension, respectively.
+%
+% \begin{macrocode}
+\def\moodle@media@find#1{%
+ \ifx\detokenize\@undefined\else
+ \edef\Gin@extensions{\detokenize\expandafter{\Gin@extensions}}%
+ \fi
+ \begingroup
+ \let\input@path\Ginput@path
+ \set@curr@file{#1}%
+ \expandafter\filename@parse\expandafter{\@curr@file}%
+ \ifx\filename@ext\Gin@gzext
+ \expandafter\filename@parse\expandafter{\filename@base}%
+ \ifx\filename@ext\relax
+ \let\filename@ext\Gin@gzext
+ \else
+ \edef\Gin@ext{\Gin@ext\Gin@sepdefault\Gin@gzext}%
+ \fi
+ \fi
+ \ifx\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \else
+ \Gin@getbase{\Gin@sepdefault\filename@ext}%
+ \ifnum0%
+ \ifx\Gin@ext\relax 1%
+ \else \@ifundefined{Gin@rule@\Gin@ext}{1}{0}%
+ \fi >0
+ \let\Gin@ext\relax
+ \let\Gin@savedbase\filename@base
+ \let\Gin@savedext\filename@ext
+ \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
+ \let\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \ifx\Gin@ext\relax
+ \let\filename@base\Gin@savedbase
+ \let\filename@ext\Gin@savedext
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@warning{File `#1' not found}%
+ \def\Gin@base{\filename@area\filename@base}%
+ \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@latex@error{File `#1' not found}%
+ {I could not locate the file with any of these extensions:^^J%
+ \Gin@extensions^^J\@ehc}%
+ \else
+ % begin modified part
+ \xdef\moodle@media@base{\detokenize\xa{\Gin@base}}%
+ \xdef\moodle@media@ext{\detokenize\xa{\Gin@ext}}%
+ % end modfied part
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macrocode}
+%See
+% * https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types
+% * https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
+\def\moodle@media@formats{}
+\newcommand{\DeclareMediaFormat}[3]{%
+ \xdef\moodle@media@formats{\ifx\moodle@media@formats\empty\else\moodle@media@formats,\fi#1}%
+ \csgdef{moodle@media@#1list}{#2}%
+ \csgdef{moodle@media@#1mime}{#3}%
+}%
+% Image Formats
+\DeclareMediaFormat{PNG}{.png,.PNG}{image/png}%
+\DeclareMediaFormat{JPEG}{.jpg,.JPG,.jpeg,.JPEG}{image/jpeg}%
+\DeclareMediaFormat{SVG}{.svg,.SVG}{image/svg+xml}%
+\DeclareMediaFormat{GIF}{.gif}{image/gif}%
+% Audio Formats
+\DeclareMediaFormat{WAV}{.wav,.WAV}{audio/wave}%
+\DeclareMediaFormat{MP3}{.mp3,.MP3}{audio/mpeg}%
+\DeclareMediaFormat{OGG}{.ogg,.opus,.og&}{audio/ogg}%
+%\DeclareMediaFormat{FLAC}{.flac,.FLAC}{audio/flac}%
+% Video Formats
+\DeclareMediaFormat{WEBM}{.webm,.webm}{video/webm}%
+\DeclareMediaFormat{MP4}{.mp4,.MP4,.m4v,.M4V}{video/mp4}%
+\DeclareMediaFormat{OGV}{.ogv,.OGV}{video/ogg}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\moodle@media@mime@identify#1{%
+ \edef\test@i{\detokenize\xa{#1}}%
+ \let\moodle@media@mime@current\relax
+ \edef\moodle@media@formats{\detokenize\xa{\moodle@media@formats}}%
+ \@for\@format:=\moodle@media@formats\do{%
+ \edef\@templist{\csname moodle@media@\@format list\endcsname}%
+ \@for\@ext:=\@templist\do{%
+ \ifx\moodle@media@mime@current\relax
+ \edef\@ext{\detokenize\xa{\@ext}}%
+ \ifx\test@i\@ext
+ \message{<<extension \@ext (\@format) identified>>^^J}%
+ \xdef\moodle@media@mime@current{\csname moodle@media@\@format mime\endcsname}%
+ \xdef\moodle@media@ext@current{#1}%
+ \fi
+ \fi
+ }%
+ }%
+}
+% \end{macrocode}
+%
% \subsubsection{External program command lines}
% We first set up commands for the external programs.
% \begin{macrocode}
@@ -3068,20 +5326,65 @@
\expandafter\def\htmlize@executable@macro{#1}%
}
-\def\ghostscriptcommand{\htmlize@setexecutable\gs}
-\def\opensslcommand{\htmlize@setexecutable\openssl}
-\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}
+\def\ghostscriptcommand{\htmlize@setexecutable\gs}%
+\def\baselxivcommand{\htmlize@setexecutable\baselxiv}%
+\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}%
+\def\optipngcommand{\htmlize@setexecutable\optipng}%
+\def\PDFtoSVGcommand{\htmlize@setexecutable\PDFtoSVG}%
+\def\SVGtoPDFcommand{\htmlize@setexecutable\SVGtoPDF}%
+\def\optiSVGcommand{\htmlize@setexecutable\optiSVG}%
+\def\DeleteFilecommand{\htmlize@setexecutable\DeleteFiles}%
\ifwindows%
- \ghostscriptcommand{gswin64c.exe}%
+ \ghostscriptcommand{gswin64c.exe -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{certutil}%
+ \DeleteFilecommand{del}%
\else%
- \ghostscriptcommand{gs}%
+ \ghostscriptcommand{gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{base64}%
+ \DeleteFilecommand{rm -f}%
\fi%
-\opensslcommand{openssl}%
-\imagemagickcommand{convert}%
+\imagemagickcommand{convert -colorspace RGB}%
+\optipngcommand{optipng -clobber -strip all -quiet}%
+\PDFtoSVGcommand{inkscape --export-type=svg --export-area-page --vacuum-defs}%--pdf-poppler
+% remove the "--pdf-poppler" import option if you want to preserve text (avoid conversion to path)
+\SVGtoPDFcommand{inkscape --export-type=pdf --export-area-page}%
+\optiSVGcommand{scour -q --enable-id-stripping --enable-comment-stripping
+ --shorten-ids --indent=none --remove-descriptive-elements}%
% \end{macrocode}
%
+% \subsubsection{Conversion and inclusion of non-native formats}
+% \begin{macrocode}
+\AtEndPreamble{%
+ \@ifpackageloaded{graphicx}{%
+ \def\@firstofthree#1#2#3{#1}%
+ \def\@secondofthree#1#2#3{#2}%
+ \newcommand{\DeclareGraphicsAlien}[3]{%
+ \edef\Gin@extensions{\Gin@extensions,#1}%
+ \DeclareGraphicsRule{#1}{\@gobble#1}{#1}{}%
+ \csdef{Gread@\@gobble#1}##1{%
+ \edef\SourceFile{\Gin@base\Gin@ext}%
+ \edef\Gin@base{\Gin@base-\@gobble#1-converted-to}%
+ \edef\Gin@ext{#2}%
+ \edef\OutputFile{\Gin@base\Gin@ext}%
+ \edef\targetfmt{\expandafter\expandafter\expandafter
+ \@firstofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \edef\targetext{\expandafter\expandafter\expandafter
+ \@secondofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \IfFileExists{\OutputFile}{}{\ShellEscape{#3}}%
+ \csletcs{Ginclude@\@gobble#1}{Ginclude@\targetfmt}%
+ \csname Gread@\targetfmt\endcsname{\Gin@base\targetext}%
+ }%
+ }%
+% Support for GIF files: passed as-is in XML but converted in PNG for PDF output.
+% In case the GIF is animated, we pick up the first frame in this conversion.
+% While the picture will be animated after Moodle import, it will not be in the PDF
+% output, whatever the viewer is.
+ \DeclareGraphicsAlien{.gif}{.png}{\htmlize@imagemagick@convert\otherspace '\SourceFile[0]' \OutputFile}%
+ }{}%
+}%
+% \end{macrocode}
% \subsubsection{Graphics key-handling}
% Next, we get ready to handle keys like |height=4cm| or |width=3cm| or |ppi=72|.
% \begin{macrocode}
@@ -3110,25 +5413,58 @@
% \end{macrocode}
%
% \subsubsection{Graphics conversion to HTML}
+% If the |tikz| option is loaded, we define the |embedaspict| command.
+% Furthermore, |includegraphics| is packed into a TikZ node.
+% This allows externalization with regular options for |includegraphics|.
+% Otherwise, |includegraphics| is redefined with a limited set of options supported.
+%
+% Option SVG
% \begin{macrocode}
-\html@action@def\includegraphics{\moodle@includegraphics@int}%
- % Note that \htmlize@do@actioncs will 'patch' this by putting
- % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
- % at the end. We want those 3 tokens to occur instead after
- % the graphics filename.
-\def\moodle@includegraphics@int#1#2#3{\moodle@includegraphics@int@int}%
- % This gobbles up those three spurious tokens,
- % which we will re-insert after our work is done.
-\newcommand\moodle@includegraphics@int@int[2][]{%
+\ifmoodle@svg
+ \AtEndPreamble{%
+% Declaring SVG to PDF conversion rule for includegraphics
+% \edef\Gin@extensions{\Gin@extensions,.svg,.SVG}%
+% \DeclareGraphicsRule{.svg}{pdf}{.pdf}{%
+% `\SVGtoPDF\otherspace '#1' \noexpand\Gin@base-svg-converted-to.pdf}%
+% \DeclareGraphicsRule{.SVG}{pdf}{.pdf}{%
+% `\SVGtoPDF\otherspace '#1' \noexpand\Gin@base-SVG-converted-to.pdf}%
+ \DeclareGraphicsAlien{.svg}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ \DeclareGraphicsAlien{.SVG}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ }%
+\fi
+
+\ifmoodle@tikz
+\AfterEndPreamble{%
+ %\htmlize@record@expand{\embedaspict}%
+ \let\oldincludegraphics=\includegraphics
+ % patching includegraphics to trigger externalization
+ \renewcommand{\includegraphics}[2][]{%
+ %\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML^^J}%
+ \tikz{\node[inner sep=0pt]{\oldincludegraphics[#1]{#2}};}%
+ }%
+ % externalized images must be included with the regular command
+ \pgfkeys{/pgf/images/include external/.code={\oldincludegraphics{#1}}}%
+ \html@action@newcommand{includegraphics}[2][]{%
+ \message{moodle.sty: Processing \string\includegraphics[#1]{#2} ^^J}
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
+}%
+\else
+\html@action@newcommand{includegraphics}[2][]{%
\bgroup% The grouping is to localize the changes caused by \setkeys.
\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML...^^J}
\setkeys*{moodle@includegraphics}{#1}%
% Height or width should be given in TeX dimensions like cm or pt or in,
% and are converted to pixels for web use using the ppi key.
- % TO DO: Can we modify \includegraphics to accept height or width in
+ % TODO: Can we modify \includegraphics to accept height or width in
% pixels?
- % TO DO: What about \includegraphics[scale=0.7] ?
+ % TODO: What about \includegraphics[scale=0.7] ?
% Other keys: keepaspectratio=true|false, angle (rotation), clip & trim
+ % -> the package option 'tikz' offers a workaround for this
\ifnum\moodle@graphics@height@pixels=0\relax
\ifnum\moodle@graphics@width@pixels=0\relax
% No size specified. Default to height of 200 pixels.
@@ -3150,28 +5486,89 @@
\edef\moodle@graphics@htmlgeometry{width=\number\moodle@graphics@width@pixels\otherspace height=\number\moodle@graphics@height@pixels}%
\fi
\fi
- %First, convert it to PNG
- \edef\cmdline{\htmlize@imagemagick@convert\otherspace #2 -resize \moodle@graphics@geometry\otherspace #2.png}%
- \message{moodle.sty: Converting '#2' to PNG...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
- %Next, convert the PNG to base64 encoding
- \def\cmdline{\openssl\otherspace enc -base64 -in #2.png -out #2.enc}%
- \message{moodle.sty: Converting '#2.png' to base64...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
+ %Look for the file, even if no extension is provided
+ \moodle@media@find{#2}%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+ \moodle@media@mime@identify{\moodle@media@ext}%
+ \ifx\moodle@media@mime@current\relax
+ % conversion needed
+ \edef\moodle@media@pdf{\detokenize{.pdf}}%
+ \edef\moodle@media@ext{\detokenize\xa{\moodle@media@ext}}%
+ \ifnum0\ifx\moodle@media@ext\moodle@media@pdf1\fi\ifmoodle@svg1\fi=11% PDF file and SVG option active
+ \def\moodle@media@ext@current{.svg}%
+ \edef\moodle@media@mime@current{\moodle@media@SVGmime}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@media@base\moodle@media@ext" -o "\moodle@media@base\moodle@media@ext@current" 2>/dev/null}%
+ \message{moodle.sty: Converting '#2' to SVG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ %Next, optimize inline
+ \ifwindows\else
+ \edef\cmdline{\optiSVG < "\moodle@media@base\moodle@media@ext@current" >
+ "\moodle@media@base.tmp.svg" && mv "\moodle@media@base.tmp.svg"
+ "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \fi
+ \else% call ImageMagick
+ \def\moodle@media@ext@current{.png}%
+ \def\moodle@media@mime@current{image/png}%
+ \edef\cmdline{\htmlize@imagemagick@convert\otherspace "\moodle@media@base\moodle@media@ext" -resize \moodle@graphics@geometry\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Converting '#2' to PNG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ %Next, optimize inline
+ \edef\cmdline{\optipng\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \fi
+ \fi
+ %Next, convert the file to base64 encoding
+ \ConvertToBaseLXIV{\moodle@media@base}{\moodle@media@ext@current}%
%Now, save that base64 encoding in a TeX macro
\def\moodle@newpic@baselxiv{}%
- \message{moodle.sty: Reading base64 file '#2.enc'...^^J}%
- \openin\baseLXIVdatafile=#2.enc\relax
+ \message{moodle.sty: Reading base64 file '\moodle@media@base.enc'...^^J}%
+ \openin\baseLXIVdatafile="\moodle@media@base.enc"
\savebaselxivdata@recursive
\closein\baseLXIVdatafile
+ %Clean up files
+ \ifx\moodle@media@ext@current\moodle@media@ext
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc"}%
+ \else
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc" "\moodle@media@base\moodle@media@ext@current"}%
+ \fi
\xa\global\xa\let\csname picbaselxiv@graphics@#2\endcsname=\moodle@newpic@baselxiv%
- \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:image/png;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
+ \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:\moodle@media@mime@current;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
\message{moodle.sty: <IMG> tag inserted.^^J}%
\egroup
- % Now we re-insert the code to get the HTMLizing going again.
- \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
-}
+}%
+\fi
+% \end{macrocode}
+% This macro is in charge of throwing a system call to convert local files to base64.
+% \begin{macrocode}
+\ifwindows
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace -encode "#1#2"\otherspace tmp.b64 && findstr /vbc:"---" tmp.b64 > "#1" && del tmp.b64"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ % Starting from Windows 7, CertUtil is included by default. There should be no windows XP still running
+ }%
+\else
+ \ifmacosx
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace -b 64 -i "#1#2"\otherspace -o "#1.enc"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ }%
+ \else % Linux, Cygwin
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace "#1#2"\otherspace > "#1.enc"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ }%
+ % base64 is part of coreutils, add "-w 64" to get exactly the previous behavior %
+ \fi
+\fi
% \end{macrocode}
% The following code accomplishes the reading of an |.enc| file into memory.
% It is also used by the \TikZ\ code below.
@@ -3201,32 +5598,57 @@
% are undefined.
% Our solution is to wait until |\AtBeginDocument| and then test whether
% \TikZ\ is loaded. If so, we make the appropriate definitions.
+% \begin{macro}{TikZ}
+% \changes{v0.7}{2020/07/14}{Support \emph{tikz}\ command}
% \begin{macrocode}
-\newif\ifmoodle@tikzloaded
-\moodle@tikzloadedfalse
\AtBeginDocument{
\ifx\tikzpicture\@undefined
\moodle@tikzloadedfalse
\else
\moodle@tikzloadedtrue
\fi
+ \ifmoodle@draftmode
+ \long\def\tikzifexternalizing#1#2{#2}%
+ \else
\ifmoodle@tikzloaded
- \usetikzlibrary{external}
+ \usetikzlibrary{external}%
\tikzexternalize%
\tikzset{external/force remake}%
-
- \ifpdf
- \def\pdftopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\moodle@basename{\tikzexternalrealjob-tikztemp-\the\numconvertedpictures}%
+ \ifmoodle@svg
+ \def\TikzExportExtension{.svg}%
+ \def\TikzExportMIME{image/svg+xml}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.pdf" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}}%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.ps" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}}%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.svg'...^^J}%
+ \edef\cmdline{\optiSVG\otherspace < "\moodle@basename\TikzExportExtension" >
+ "\moodle@basename.tmp.svg" && mv "\moodle@basename.tmp.svg"
+ "\moodle@basename\TikzExportExtension" }%
+ \xa\ShellEscape\xa{\cmdline}}%
\else
- \def\pstopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.ps}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\TikzExportExtension{.png}%
+ \def\TikzExportMIME{image/png}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \moodle@basename.pdf}%
+ \xa\ShellEscape\xa{\gscmdline}}%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \\moodle@basename.ps}%
+ \xa\ShellEscape\xa{\gscmdline}}%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.png'...^^J}%
+ \edef\cmdline{\optipng\otherspace \moodle@basename\TikzExportExtension}%
+ \xa\ShellEscape\xa{\cmdline}}%
\fi
- \def\pngtobaselxiv{\edef\opensslcmdline{\openssl\otherspace enc -base64 -in \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -out \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc}%
- \expandafter\immediate\expandafter\write18\expandafter{\opensslcmdline}}%
-
\let\moodle@oldtikzpicture=\tikzpicture
-
%The following code lets us run things *before* the normal \begin{tikzpicture}.
\renewenvironment{tikzpicture}{%
\global\advance\numconvertedpictures by 1\relax
@@ -3238,43 +5660,63 @@
% However, the tikz externalize library does *not* run \end{tikzpicture}.
% In order to run commands after the tikz picture is done compiling, we need to
% use a hook into \tikzexternal@closeenvironments.
-
\g@addto@macro{\tikzexternal@closeenvironments}{%
\moodle@endtikzpicture@hook
}
+% The following could replace calls to \pdftopng, \pngoptim and \pngtobaselxiv
+% \tikzset{external/system call/.add={}{;
+% gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile="\image.png" -r150 "\image.pdf";
+% optipng -clobber -strip all -quiet "\image.png";
+% base64 "\image.png" > "\image.enc"
+% }
+% }
+% With the following mechanism, we could trigger something when the externalized images are included back.
+% \pgfkeys{/pgf/images/include external/.code={\pgfimage{#1}\@moodle@ifgeneratexml{\savebaselxivdata}{}}}
+%
\def\moodle@endtikzpicture@hook{%
\@moodle@ifgeneratexml{%
- \ifpdf
- \message{moodle.sty: Converting picture '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf' to PNG...^^J}%
- \pdftopng
- \else
- \pstopng
- \fi
- \message{moodle.sty: Converting '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png' to base64...^^J}%
- \pngtobaselxiv
+ \ExportTikz
+ \OptimizeExport
+ \ConvertToBaseLXIV{\moodle@basename}{\TikzExportExtension}%
\message{moodle.sty: Reading base64 file '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc'...^^J}%
\savebaselxivdata
\message{moodle.sty: base64 data saved.^^J}%
}{}%
}
- \tikzset{external/optimize=true}
- \tikzset{external/optimize command away={\VerbatimInput}{1}}
+ \ifmoodle@tikz
+ \tikzset{external/optimize=false}% due to redefinition, includegraphics must not be optimized away
+ \else
+ \tikzset{external/optimize=true}%
+ \tikzset{external/optimize command away={\VerbatimInput}{1}}%
+ \fi
%
% The HTMLizer version of the tikzpicture environment,
% which writes an <IMG> tag to the XML file.
- \htmlize@record@environment{tikzpicture}
+ \htmlize@record@environment{tikzpicture}%
\g@addto@macro\htmlize@activate@environments{%
\let\tikzpicture\relax\let\endtikzpicture\relax
\NewEnviron{tikzpicture}[1][]{%
\global\advance\numpicturesread by 1\relax
- \edef\htmlize@imagetag{<IMG SRC="data:image/png;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
}[\htmlize@patchendenvironment]%
}%
+ \html@action@newcommand{tikz}[2][]{%
+% \message{>>> Processing \string\tikz[#1]{...} ^^J}
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
\else
%TikZ not loaded. Provide dummy definitions for commands.
\long\def\tikzifexternalizing#1#2{#2}%
\fi
+ \fi
+ \ifmoodle@tikz
+ \tikzstyle{moodlepict}=[minimum height=1em,inner sep=0pt,execute at begin node={\begin{varwidth}{\linewidth}},execute at end node={\end{varwidth}}]
+ \newcommand\embedaspict[1]{\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax]{\node[moodlepict]{\mbox{#1}};}}
+ \htmlize@record@expand{\embedaspict}
+ \fi
}
\newcount\numconvertedpictures
@@ -3290,27 +5732,464 @@
\xa\global\xa\let\csname picbaselxiv@\the\numconvertedpictures\endcsname=\moodle@newpic@baselxiv%
}
-\def\@moodle@par{\par}%
+\ifmoodle@tikz
+ \ifmoodle@tikzloaded
+ \PackageWarning{moodle}{With package option 'tikz', you should not load TikZ manually.}%
+ \fi
+ \RequirePackage{tikz}%
+ \RequirePackage{varwidth}% for the command |embedaspict|
+\fi
% \end{macrocode}
% Finally, we clean up our mess by deleting the temporary PDF, PNG, and ENC
% files we created.
+% With XeTeX, we cannot clean pictures pdf's because they are actually included in the final pdf afterwards, by xdvipdfmx.
+% With LuaTeX, it looks like |\AtEndDocument| is too early to for this cleaning step.
% \begin{macrocode}
-\AtEndDocument{%
+\AfterEndDocument{%
\ifmoodle@tikzloaded
\@moodle@ifgeneratexml{%
- \ifwindows
- \immediate\write18{del \tikzexternalrealjob-tikztemp-*.*}%
+ \ifXeTeX
+ % we must keep picture pdf's for subsequent linking (xdvipdfmx)
+ \ifwindows
+ \ShellEscape{powershell.exe -noexit "del * -include \tikzexternalrealjob-tikztemp-*.* -exclude *.pdf}%
+ \else
+ \ShellEscape{find . -type f -name "\tikzexternalrealjob-tikztemp-*.*" -not -name "*.pdf" -delete}%
+ \fi
\else
- \immediate\write18{rm \tikzexternalrealjob-tikztemp-*.*}%
+ \ShellEscape{\DeleteFiles\otherspace \tikzexternalrealjob-tikztemp-*.*}%
\fi
}{}%
\fi
}
-
-% TO DO:
+% \end{macrocode}
+% TODO:
% * sizing options for TikZ pictures?
-% * In cloze multi, how to handle HTML or TeX in answers? In particular, what about ~?
+%\end{macro}
+%
+% \subsection{Other Media}
+% Support for other media comes through the |\url|\marg{link} and |\href|\marg{link}\marg{text}
+% commands.
+\AtEndPreamble{%
+ \@ifpackageloaded{hyperref}{%
+ \let\oldhref\href
+ \let\oldurl\url
+ \def\moodle@hyper@readexternallink#1#2#3#4:#5:#6\\#7{%
+% 1) The link type (the string "link" in the cases I observed)
+% 2) The URL fragment (i.e. what comes after # in the end),
+% 3) the text replacement,
+% 4) the URL scheme (http, https, mailto, file, run etc),
+% 5) the URL details (in general, that is whole authority + path + query).
+% If the URL contains a column (specification of a password in userinfo or a
+% port in authority), we get here whatever comes before the first column (:)
+% 6) empty is URL contains no column. Otherwise, filled with whatever follows
+% a first column (:) after the scheme,
+% 7) the whole URL again (fragment removed).
+ \def\filename@ext{}%
+ \def\filename@area{}%
+ \def\filename@base{}%
+ \ifx\\#6\\% if ##6 is empty (the URL contains no column -> no scheme -> local)
+ %\@hyper@linkfile file:#7\\{#3}{#2}{#7}% local file
+ %Local file (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\\#4\\%if ##4 is empty (no scheme was specified -> local file)
+% %\@hyper@linkfile file:#7\\{#3}{#2}{#7}% Mac filename ?
+% Local file (Mac? ##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \def\@pdftempa{#4}%
+ \ifx\@pdftempa\@pdftempwordfile% scheme is "file:"
+% %\@hyper@linkfile#7\\{#3}{#2}{#7}% file
+% Local file (no column ##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\@pdftempa\@pdftempwordrun% scheme is "run:"
+ \ifHy@pdfa
+ \Hy@Error{%
+ PDF/A: Launch action is prohibited%
+ }\@ehc
+ \begingroup
+ \leavevmode
+% ##2%
+ \endgroup
+ \else% not in PDF/A mode -> run is allowed
+ %\@hyper@launch#7\\{#3}{#2}% run local file
+% Run local file (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \fi
+ \else% scheme is neither "file" nor "run", assuming it is a web protocol
+ %\hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}% URL
+% URL (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#7}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \xdef\moodle@media@ext{.\filename@ext}%
+ \xdef\moodle@media@base{\filename@area\filename@base}%
+ }%
+% \html@action@newcommand{href}[3][]{%
+% \bgroup% The grouping is to localize the changes caused by \setkeys.
+% \message{moodle.sty: Processing \string\href[#1]{#2}{#3} for HTML...^^J}%
+% the following macro is a modified version of hyperref's |\hyper@readexternallink|
+% \let\@hyper@readexternallink\moodle@hyper@readexternallink
+% \oldhref[#1]{#2}{#3}%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+% \moodle@media@mime@identify{\moodle@media@ext}%
+ %\edef\moodle@media@mime@current{\detokenize\xa{\moodle@media@mime@current}}%
+% \xa\message\xa{moodle.sty: \moodle@media@mime@current^^J}%
+% \ifx\moodle@media@mime@current\relax
+% \xa\g@addto@macro\xa\htmlize@output\xa{<A href=\otherampersand\otherhash34;\moodle@media@base\moodle@media@ext\otherampersand\otherhash34;>#3</A>}%
+% \message{moodle.sty: <A> tag inserted.^^J}%
+% \else
+% \filename@parse{\moodle@media@mime@current}%
+% \def\@tmp{audio/}
+% \ifx\filename@area\@tmp
+% \IfFileExists{\moodle@media@base.enc}{%
+% \def\moodle@newpic@baselxiv{}%
+% \openin\baseLXIVdatafile=\moodle@media@base.enc\relax
+% \savebaselxivdata@recursive
+% \closein\baseLXIVdatafile
+% \xa\g@addto@macro\xa\htmlize@output\xa{<audio controls src="data:\moodle@media@mime@current;base64,\moodle@newpic@baselxiv">#3</audio>}%
+% }{%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<audio controls src="\moodle@media@base\moodle@media@ext">#3</audio>}%
+% }%
+% \message{moodle.sty: <audio> tag inserted.^^J}%
+% \else
+% \def\@tmp{video/}
+% \ifx\filename@area\@tmp
+% \IfFileExists{\moodle@media@base.enc}{%
+% \def\moodle@newpic@baselxiv{}%
+% \openin\baseLXIVdatafile=\moodle@media@base.enc\relax
+% \savebaselxivdata@recursive
+% \closein\baseLXIVdatafile
+% \xa\g@addto@macro\xa\htmlize@output\xa{<video controls src="data:\moodle@media@mime@current;base64,\moodle@newpic@baselxiv">#3</video>}%
+% }{%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<video controls src="\moodle@media@base\moodle@media@ext">#3</video>}%
+% }%
+% \message{moodle.sty: <video> tag inserted.^^J}%
+% \else
+% \PackageWarning{moodle}{cannot recognize MIME type of #2. Ignoring it.}%
+% \fi
+% \fi
+% \fi
+% \egroup
+% }%
+% \html@action@def\url#1{%
+% \bgroup% The grouping is to localize the changes caused by \setkeys.
+% \message{moodle.sty: Processing \string\url{#1} for HTML...^^J}%
+% the following macro is a modified version of hyperref's |\hyper@readexternallink|
+% \let\@hyper@readexternallink\moodle@hyper@readexternallink
+% \oldhref{#1}{#1}%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<A href=\otherampersand\otherhash34;\moodle@media@base\moodle@media@ext\otherampersand\otherhash34;>#1</A>}%
+% \message{moodle.sty: <A> tag inserted.^^J}%
+% \egroup
+% }%
+ }{}%
+}%
+%
+% \subsection{Verbatim Code}
+%
+% We start by defining a macro to parameter a style for code box display in Moodle
+% \begin{macrocode}
+\def\xmlDisplayVerbatimBox{border-top: thin solid; border-bottom: thin solid}%
+% \end{macrocode}
+% First, let us handle |\verbatiminput| from the `verbatim' package
+% \begin{macrocode}
+\html@action@def\verbatiminput#1{%
+ \message{moodle.sty: Processing \string\verbatiminput{#1} for HTML ^^J}%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%%%%%%%% from verbatim %%%%%%%%%%%%%%%%%
+ \@bsphack
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{\xa\g@addto@macro\xa\htmlize@output\xa{\the\verbatim@line<BR/>}}
+ \verbatim@readfile{#1}%
+ \@esphack
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+% \end{macrocode}
+% Second, we deal with |\VerbatimInput| from `fancyvrb' or `fvextra'
+% \begin{macrocode}
+\@ifpackageloaded{minted}{\PackageError{moodle}{'moodle' should be loaded before 'minted'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fvextra}{\PackageError{moodle}{'moodle' should be loaded before 'fvextra'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fancyvrb}{\PackageError{moodle}{'moodle' should be loaded before 'fancyvrb'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+
+\html@action@newcommand{VerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\VerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{LVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\LVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{BVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\BVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\def\moodle@VerbatimInput#1{%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%% using material from fancyvrb and fvextra %%%%%%%%
+ %\begingroup
+ \def\moodle@verbatim@addlinenumber##1{%
+ \g@addto@macro\htmlize@output{<span style="font-size: 80\otherpercent;
+ background-color: \otherhash f0f0f0; padding: 0 5px 0 5px; display:
+ inline-block; width: 16pt; ##1">}%
+ \if@FV@NumberBlankLines
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \else
+ \ifx\FV@Line\empty
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherampersand nbsp;</span>}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \fi
+ \fi
+ }
+ % redefine the ProcessLine routine ('fancyvrb' and 'fvextra') for XML output
+ \def\FV@ProcessLine##1{%
+ \ifcsname FV@HighlightLine:\number\c@FancyVerbLine\endcsname
+ \xdef\moodle@FV@tagB{<mark>}% fvextra triggered highlighting for this line
+ \xdef\moodle@FV@tagE{</mark>}%
+ \else
+ \xdef\moodle@FV@tagB{}% no highlighting
+ \xdef\moodle@FV@tagE{}%
+ \fi
+ \catcode`\`=12%
+ \def\FV@Line{##1}%
+ \ifx\FV@LeftListNumber\relax
+
+ \else% line numbers displayed on the left side
+ \moodle@verbatim@addlinenumber{text-align: right}%
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagB}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\FV@Line}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagE}%
+ \ifx\FV@RightListNumber\relax\else% line numbers on the right side
+ \moodle@verbatim@addlinenumber{text-align: left; float: right}%
+ \fi
+ \g@addto@macro\htmlize@output{<BR/>}%linebreak
+ }
+ \global\FV@CodeLineNo\z@% reset codeline counter
+ \frenchspacing% Cancels special punctuation spacing.
+ \FV@DefineWhiteSpace
+ \def\FV@Space{\space}
+ \FV@DefineTabOut% replace tabs with a series a whitespaces
+ \ifdefined\FV@HighlightLinesPrep
+ \FV@HighlightLinesPrep% prepare highlighting if 'fvextra' is loaded
+ \fi
+ \FV@Input{#1}%
+ %\endgroup
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+\AtEndPreamble{%
+ \@ifpackageloaded{fancyvrb}{%
+ % custom settings for display
+ \fvset{frame=lines,label={[Beginning of code]End of code},framesep=3mm,numbersep=9pt}%
+ }{\relax}%
+}
+% \end{macrocode}
+% Third, we patch `minted' so that it also calls pygmentize to generate HTML code.
+% \begin{macrocode}
+\AtEndPreamble{% this definition should prevail because `minted' gets loaded after `moodle'
+\@ifpackageloaded{minted}{%
+ \newcounter{moodle@pygmentizecounter}%
+ \renewcommand{\minted@pygmentize}[2][\minted@outputdir\minted@jobname.pyg]{%
+ \minted@checkstyle{\minted@get@opt{style}{default}}%
+ \stepcounter{minted@pygmentizecounter}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\def\minted@codefile{\minted@outputdir\minted@jobname.pyg}}%
+ {\def\minted@codefile{#1}}%
+ \ifthenelse{\boolean{minted@isinline}}%
+ {\def\minted@optlistcl@inlines{%
+ \minted@optlistcl@g@i
+ \csname minted@optlistcl@lang\minted@lang @i\endcsname}}%
+ {\let\minted@optlistcl@inlines\@empty}%
+ \def\minted@cmdtemplate##1##2{%
+ \ifminted@kpsewhich
+ \ifwindows
+ \detokenize{for /f "usebackq tokens=*"}\space\@percentchar\detokenize{a
+ in (`kpsewhich}\space\minted@codefile\detokenize{`) do}\space
+ \fi
+ \fi
+ \MintedPygmentize\space -l #2 -f ##1 -F tokenmerge
+ \minted@optlistcl@g \csname minted@optlistcl@lang\minted@lang\endcsname
+ \minted@optlistcl@inlines
+ \minted@optlistcl@cmd -o \minted@outputdir##2\space
+ \ifminted@kpsewhich
+ \ifwindows
+ \@percentchar\detokenize{a}%
+ \else
+ \detokenize{`}kpsewhich \minted@codefile\space
+ \detokenize{||} \minted@codefile\detokenize{`}%
+ \fi
+ \else
+ \minted@codefile
+ \fi}%
+ \def\minted@cmd{\minted@cmdtemplate{latex -P commandprefix=PYG}{\minted@infile}}
+ % For debugging, uncomment: %%%%
+ \immediate\typeout{\minted@cmd}%
+ % %%%%
+ \def\minted@cmdHTML{\minted@cmdtemplate{html -P noclasses -P
+ nowrap -P hl_lines="\FV@HighlightLinesList" -P
+ style="\minted@get@opt{style}{default}"}{\csname minted@infileHTML\the\c@minted@pygmentizecounter\endcsname}}%
+ \def\minted@cmdPNG{\minted@cmdtemplate{png -P
+ line_numbers=True}{\minted@infilePNG}}%
+ \def\minted@cmdSVG{\minted@cmdtemplate{svg -P
+ linenos=True}{\minted@infileSVG}}%
+ \ifthenelse{\boolean{minted@cache}}%
+ {%
+ \ifminted@frozencache
+ \else
+ \ifx\XeTeXinterchartoks\minted@undefined
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd}}}%
+ \else
+ \ifx\mdfivesum\minted@undefined
+ \immediate\openout\minted@code\minted@jobname.mintedcmd\relax
+ \immediate\write\minted@code{\minted@cmd}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\immediate\write\minted@code{autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}{}%
+ \immediate\closeout\minted@code
+ \edef\minted@argone@esc{#1}%
+ \StrSubstitute{\minted@argone@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@argone@esc]%
+ \StrSubstitute{\minted@argone@esc}{"}{\@backslashchar"}[\minted@argone@esc]%
+ \edef\minted@tmpfname@esc{\minted@outputdir\minted@jobname}%
+ \StrSubstitute{\minted@tmpfname@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@tmpfname@esc]%
+ \StrSubstitute{\minted@tmpfname@esc}{"}{\@backslashchar"}[\minted@tmpfname@esc]%
+ %Cheating a little here by using ASCII codes to write `{` and `}`
+ %in the Python code
+ \def\minted@hashcmd{%
+ \detokenize{python -c "import hashlib; import os;
+ hasher = hashlib.sha1();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedcmd\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@argone@esc\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedmd5\detokenize{\")),
+ \"w\");
+ macro = \"\\edef\\minted@hash\" + chr(123) + hasher.hexdigest()
+ + chr(125) + \"\";
+ f.write(\"\\makeatletter\" + macro +
+ \"\\makeatother\\endinput\n\");
+ f.close();"}}%
+ \ShellEscape{\minted@hashcmd}%
+ \minted@input{\minted@outputdir\minted@jobname.mintedmd5}%
+ \else
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd}}}%
+ \fi
+ \fi
+ \edef\minted@infile{\minted@cachedir/\minted@hash.pygtex}%
+ \edef\minted@temp@infileHTML{\minted@cachedir/\minted@hash.html}%
+ \global\cslet{minted@infileHTML\the\c@minted@pygmentizecounter}{\minted@temp@infileHTML}%
+ %\global\edef\minted@infilePNG{\minted@cachedir/\minted@hash.png}%
+ %\global\edef\minted@infileSVG{\minted@cachedir/\minted@hash.svg}%
+ \IfFileExists{\minted@infile}{}{%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ }%
+ \fi
+ \ifthenelse{\boolean{minted@finalizecache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@actualinfile{\minted@cachedir/\minted@cachefilename}%
+ \ifwindows
+ \StrSubstitute{\minted@infile}{/}{\@backslashchar}[\minted@infile@windows]
+ \StrSubstitute{\minted@actualinfile}{/}{\@backslashchar}[\minted@actualinfile@windows]
+ \ShellEscape{move /y
+ \minted@outputdir\minted@infile@windows\space\minted@outputdir\minted@actualinfile@windows}%
+ \else
+ \ShellEscape{mv -f
+ \minted@outputdir\minted@infile\space\minted@outputdir\minted@actualinfile}%
+ \fi
+ \let\minted@infile\minted@actualinfile
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}%
+ }%
+ {\ifthenelse{\boolean{minted@frozencache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@infile{\minted@cachedir/\minted@cachefilename}%
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}}%
+ {\expandafter\minted@addcachefile\expandafter{\minted@hash.pygtex}}%
+ }%
+ \minted@inputpyg}%
+ {%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ \minted@inputpyg}%
+ }%
+}{}%
+}%
+\html@action@newcommand{inputminted}[3][]{%
+ \message{moodle.sty: Processing \string\inputminted[#1]{#2}{#3} for HTML ^^J}%
+ % arguments #2 and #3 are thrown away: the job is done previously by minted when
+ % calling pygmentize. The file |\minted@infileHTML| generated with our hack will be used.
+ % Since minted is based upon `fvextra' the macro |\moodle@VerbatimInput| works here.
+ \minted@configlang{#2}% grab options set for this specific language
+ \setkeys{minted@opt@cmd}{#1}% grab options in #1
+ \minted@fvset% import options
+ \stepcounter{moodle@pygmentizecounter}
+ \xa\moodle@VerbatimInput\xa{\csname minted@infileHTML\the\c@moodle@pygmentizecounter\endcsname}%
+}%
% \end{macrocode}
%
+% \subsection{Warning users of \texttt{babel}}
+% Users of the |babel| package loaded with the 'french' option may experience problems
+% related to autospacing when using |pdfLaTeX|. We shall warn them.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifPDFTeX % pdflatex or latex
+ \@ifpackagewith{babel}{french}{%
+ \PackageWarning{moodle}{Be careful when using LaTeX, moodle, and the babel package with option 'french'. Autospacing produces in undesired symbols in the XML. You can either 1) compile with xelatex/lualatex or 2) add '\NoAutoSpacing' after '\begin{quiz}'.}%
+ }{\relax}%
+ \fi
+}%
+% \end{macrocode}
+%
+%
% \Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/moodle/moodle.ins b/Master/texmf-dist/source/latex/moodle/moodle.ins
index 16afd4503b5..b118c1beabc 100644
--- a/Master/texmf-dist/source/latex/moodle/moodle.ins
+++ b/Master/texmf-dist/source/latex/moodle/moodle.ins
@@ -1,5 +1,6 @@
%% moodle.ins
-%% Copyright 2016 by Anders O.F. Hendrickson
+%% Copyright 2016 by Anders O.F. Hendrickson and 2019-2021
+%% by Matthieu Guerquin-Kern.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -11,7 +12,7 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Anders O.F. Hendrickson.
+%% The Current Maintainer of this work is Matthieu Guerquin-Kern.
%%
%% This work consists of the files moodle.dtx and moodle.ins
%% and the derived file moodle.sty.
@@ -25,7 +26,8 @@
This is a generated file.
-Copyright (C) 2016 by Anders Hendrickson <anders.hendrickson@snc.edu>
+Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/tex/latex/moodle/moodle.sty b/Master/texmf-dist/tex/latex/moodle/moodle.sty
index dedc78c95c9..3061bd3299d 100644
--- a/Master/texmf-dist/tex/latex/moodle/moodle.sty
+++ b/Master/texmf-dist/tex/latex/moodle/moodle.sty
@@ -8,7 +8,8 @@
%%
%% This is a generated file.
%%
-%% Copyright (C) 2016 by Anders Hendrickson <anders.hendrickson@snc.edu>
+%% Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+%% and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -20,36 +21,78 @@
%%
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{moodle}
- [2016/01/11 v0.5 Moodle quiz XML generation]
+ [2021/01/04 v0.8 Moodle quiz XML generation]
\newif\ifmoodle@draftmode
+\newif\ifmoodle@handout
+\newif\ifmoodle@stampmode
+\newif\ifmoodle@tikz
\newif\ifmoodle@tikzloaded
+\newif\ifmoodle@svg
+\newif\ifmoodle@section
+\newif\ifmoodle@subsection
+\newif\ifmoodle@numbered
%%DECLARATION OF OPTIONS
\DeclareOption{draft}{\moodle@draftmodetrue}
+\DeclareOption{handout}{\moodle@handouttrue}
+\DeclareOption{final}{\moodle@draftmodefalse}
+\DeclareOption{nostamp}{\moodle@stampmodefalse}
+\DeclareOption{tikz}{\moodle@tikztrue}
+\DeclareOption{svg}{\moodle@svgtrue}
+\DeclareOption{section}{\moodle@sectiontrue\moodle@numberedtrue}
+\DeclareOption{section*}{\moodle@sectiontrue\moodle@numberedfalse}
+\DeclareOption{subsection}{\moodle@sectionfalse\moodle@numberedtrue}
+\DeclareOption{subsection*}{\moodle@sectionfalse\moodle@numberedfalse}
\moodle@draftmodefalse
+\moodle@handoutfalse
+\moodle@stampmodetrue
+\moodle@tikzfalse
\moodle@tikzloadedfalse
+\moodle@svgfalse
+\moodle@subsectiontrue
+\moodle@numberedfalse
\ProcessOptions
\RequirePackage{environ} %To be able to take environment body as a macro argument
\RequirePackage{xkeyval} %For key-handling
\RequirePackage{amssymb} %For \checkmark symbol
-\RequirePackage{trimspaces} %To remove extra spaces from strings
\RequirePackage{etex} %Expansion control, detokenization, etc.
\RequirePackage{etoolbox}%List management
\RequirePackage{xpatch} %To patch commands easily in HTML mode
\RequirePackage{array} %For formatting tables in the LaTeX mode of Clozes
\RequirePackage{ifplatform} % To choose Ghostscript commands
-\RequirePackage{ifpdf} % Needed to know whether we can convert output from PDF to PNG
-
+\@ifpackageloaded{iftex}{}{\RequirePackage{iftex}}
+\@ifundefined{ifpdf}{\RequirePackage{ifpdf}}{}% old iftex would not define the conditional
+\RequirePackage{shellesc} %Luatex-compatible way of getting system access
+\RequirePackage{fancybox} %For fancy LaTeX tags
\RequirePackage{getitems} %To gather the header and items
+\ifmoodle@handout
+ \RequirePackage[seed=42]{randomlist} %To randomize answers in matching questions
+\fi
+\ifmoodle@svg
+ \RequirePackage{graphicx} %To include graphics
+\fi
\let\xa=\expandafter
\def\@star{*}%
\def\@hundred{100}%
+\def\@fifty{50}%
\def\@moodle@empty{}%
\def\@relax{\relax}%
+\def\@moodle@par{\par}%
+
+\@ifundefined{ifTUTeX}{
+ \newif\ifTUTeX % a new conditional starts as false
+ \ifnum 0\ifXeTeX 1\fi\ifLuaTeX 1\fi>0%
+ \TUTeXtrue
+ \fi
+}{}%
+\newif\ifpdfoutput % a new conditional starts as false
+\ifnum 0\ifTUTeX 1\fi\ifPDFTeX\ifpdf 1\fi\fi>0%
+ \pdfoutputtrue
+\fi
\def\jobnamewithsuffixtomacro#1#2{%
\filenamewithsuffixtomacro{#1}{\jobname}{#2}%
}
@@ -78,9 +121,42 @@
\newwrite\moodle@outfile
\def\openmoodleout{%
\immediate\openout\moodle@outfile=\outputfilename\relax
- \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \ifPDFTeX % latin1-based engines (pdflatex or latex)
+ \writetomoodle{<?xml version="1.0" encoding="iso-8859-1"?>}%
+ \else
+ \ifTUTeX % UTF8-based engines (XeTeX or LuaTeX)
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \else % what shall we do?
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ %\stop
+ \fi
+ \fi
+ \ifmoodle@stampmode
+ \def\moodle@stamp{This file was generated on \the\year-\two@digits\month-\two@digits\day}
+ \ifPDFTeX % pdflatex or latex
+ \ifpdf % pdflatex
+ \g@addto@macro{\moodle@stamp}{ by pdfLaTeX }%
+ \else % latex
+ \g@addto@macro{\moodle@stamp}{ by LaTeX }%
+ \fi
+ \else
+ \ifXeTeX % xetex
+ \g@addto@macro{\moodle@stamp}{ by XeLaTeX }%
+ \else
+ \ifLuaTeX % luatex
+ \g@addto@macro{\moodle@stamp}{ by LuaLaTeX }%
+ \else
+ \g@addto@macro{\moodle@stamp}{ a TeX engine }%
+ \fi
+ \fi
+ \fi
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \def\moodle@stamp{running on \platformname}%
+ \g@addto@macro{\moodle@stamp}{ with the package moodle v0.8 }%
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \fi
+ \immediate\write\moodle@outfile{}%
\writetomoodle{<quiz>}%
- \writetomoodle{ }%
}%
\def\closemoodleout{%
\writetomoodle{ }%
@@ -111,27 +187,71 @@
\immediate\write\moodle@outfile{\moodle@indent\trim@pre@space{\test@ii}}%
\fi
}%
-\newenvironment{quiz}[2][]%
- {\setkeys{moodle}{#1}%
- \@moodle@ifgeneratexml{%
- \openmoodleout%
- \setcategory{#2}%
- }{}%
- \subsection*{#2}%
- \begin{enumerate}%
- }
- {\end{enumerate}%
- \@moodle@ifgeneratexml{\closemoodleout}{}}
-
-{\catcode`\$=12\catcode`\ =12%
-\gdef\setcategory#1{%
+{\catcode`\$=12\catcode`\ =12% in this context we cannot indent with spaces...
+\gdef\moodle@write@category@xml#1{%
+\@moodle@ifgeneratexml{%
+\writetomoodle{ }%
\writetomoodle{<question type="category">}%
\writetomoodle{ <category>}%
-\writetomoodle{ <text>$module$/#1</text>}%
+\writetomoodle{ <text>$course$/top/#1</text>}%
\writetomoodle{ </category>}%
\writetomoodle{</question>}%
\writetomoodle{ }%
+}{}%
}}%
+\newcommand*\@enumeratename{enumerate}%
+\newenvironment{quiz}[2][]{%
+ \setkeys{moodle}{#1}%
+ \gdef\setcategory##1{%
+ % At first call (end of \begin{quiz}) enumerate is not started yet
+ \ifx\@currenvir\@enumeratename
+ % In case no question is defined between two calls of \setcategory
+ \def\@noitemerr{\@latex@warning{Empty question list}}%
+ \end{enumerate}%
+ \fi
+ \gdef\moodle@currentcategory{##1}%
+ \moodle@write@category@xml{##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \section{##1}%
+ \else
+ \section*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \gdef\setsubcategory##1{%
+ \def\@noitemerr{\@latex@warning{Empty question list}}%
+ \end{enumerate}%
+ \moodle@write@category@xml{\moodle@currentcategory/##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsubsection{##1}%
+ \else
+ \subsubsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \setcategory{#2}%
+}{%
+ \end{enumerate}%
+ \let\setcategory\relax
+ \let\setsubcategory\relax
+}%
+
\def\passvalueaftergroup#1{%
\xa\xa\xa\gdef\xa\xa\csname moodle@remember@\string#1\endcsname\xa{\xa\def\xa#1\xa{#1}}%
\xa\aftergroup\csname moodle@remember@\string#1\endcsname
@@ -152,6 +272,16 @@
\fi
}%
}
+\AfterEndPreamble{
+ \@moodle@ifgeneratexml{%
+ \openmoodleout%
+ }{}%
+}
+\AtEndDocument{
+ \@moodle@ifgeneratexml{%
+ \closemoodleout%
+ }{}%
+}
\def\moodleset#1{\setkeys{moodle}{#1}}%
\def\generate@moodle@write@code{%
\@ifnextchar*\generate@moodle@write@data\generate@moodle@write@html
@@ -174,6 +304,20 @@
}%
}%
+\def\generate@moodle@write@html@noptag#1<#2>#3{%
+\xa\gdef\csname moodle@write#1\endcsname{%
+\xa\def\xa\test@iii\xa{#3}%
+\ifx\test@iii\@moodle@empty
+\writetomoodle[2]{ <#2 format="html"><text/></#2>}%
+\else
+\xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{#3}%
+\writetomoodle[2]{ <#2 format="html">}%
+\writetomoodle[4]{ <text><![CDATA[\moodle@htmltowrite]]></text>}%
+\writetomoodle[2]{ </#2>}%
+\fi
+}%
+}%
+
\def\generate@moodle@write@data*#1<#2>#3{%
% #1 = NAME for \moodle@writeNAME
% #2 = HTML tag
@@ -183,13 +327,24 @@
}%
}%
+\def\generate@moodle@write@tags#1{%
+ % #1 = NAME for \moodle@writeNAME
+ % #3 = what, exactly, to write
+ \xa\gdef\csname moodle@writetags\endcsname{%
+ %\xa\xa\xdef\xa\xa\ds\xa\xa{Encountered '\string #1'}\show\ds
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{\moodle@tags}%
+ \writetomoodle[2]{ <tags>}%
+ \writetomoodle[4]{ <tag><text><![CDATA[\moodle@htmltowrite]]></text></tag>}%
+ \writetomoodle[2]{ </tags>}%
+ \fi
+ }%
+}%
+
%% QUESTIONNAME
\define@cmdkey{moodle}[moodle@]{questionname}{}%
- \gdef\moodle@writequestionname{%
- \writetomoodle[2]{<name>}%
- \writetomoodle[4]{ <text>\moodle@questionname</text>}%
- \writetomoodle[2]{</name>}%
- }%
+\generate@moodle@write@html@noptag{questionname}<name>{\moodle@questionname}%
%% QUESTIONTEXT
%I tried to use questiontext as a key, but it doesn't seem to work.
@@ -205,9 +360,9 @@
\generate@moodle@write@code{questiontext}<questiontext>{\moodle@questiontext}%{%
%% PENALTY FOR WRONG ATTEMPT
- \define@cmdkey{moodle}[moodle@]{penalty}[0.1000000]{}%
+ \define@cmdkey{moodle}[moodle@]{penalty}[0.10]{}%
\generate@moodle@write@code*{penalty}<penalty>{\moodle@penalty}%
- \moodleset{penalty}%
+ \moodleset{penalty=0.10}%
%% FEEDBACK
% Moodle allows for feedback tailored to each question,
@@ -221,7 +376,7 @@
\define@cmdkey{moodle}[moodle@]{feedback}[]{}%
\generate@moodle@write@code{generalfeedback}<generalfeedback>{\moodle@feedback}%
\generate@moodle@write@code{feedback}<feedback>{\moodle@feedback}%
- \moodleset{feedback}%
+ \moodleset{feedback={}}%
%% DEFAULT GRADE
%The next line creates \moodle@defaultgrade,
@@ -247,17 +402,27 @@
\moodle@writehidden%
}%
+%% TAGS
+ %The next line creates \moodle@tags,
+ %which defines a "tag" (i.e., keyword) for the question.
+ %Key calls like [tags={random}] set \moodle@tags.
+ \define@cmdkey{moodle}[moodle@]{tags}[]{}%
+ \generate@moodle@write@tags{\csname moodle@tags\endcsname}%
+ \moodleset{tags}%
%% FRACTION -- how much this answer is worth out of 100 percent
\define@cmdkey{moodle}[moodle@]{fraction}[100]{}%
%We do not create \moodle@writefraction, because the fraction occurs in
%the XML within the answer tag, like <answer fraction="75">.
\moodleset{fraction=100} %This sets the default.
+%% FRACTIONTOL -- the tolerance for fractions with respect to valid values
+ \define@cmdkey{moodle}[moodle@]{fractiontol}[0.1]{}%
+ \moodleset{fractiontol=0.1} %This sets the default.
%% SINGLE and MULTIPLE -- for multichoice, is there 1 right answer or more than 1?
\define@boolkey{moodle}[moodle@]{single}[true]{}%
\generate@moodle@write@code*{single}<single>{\ifmoodle@single true\else false\fi}%
- \moodleset{single}%
+ \moodleset{single=true}%
%The key 'multiple' is an antonym to 'single'.
\define@boolkey{moodle}[moodle@]{multiple}[true]{\ifmoodle@multiple\moodle@singlefalse\else\moodle@singletrue\fi}%
@@ -266,15 +431,15 @@
\generate@moodle@write@code*{shuffle}<shuffleanswers>{\ifmoodle@shuffle 1\else 0\fi}%
\moodleset{shuffle=true}%
-%% TO DO: CORRECTFEEDBACK
-%% TO DO: PARTIALLYCORRECTFEEDBACK
-%% TO DO: INCORRECTFEEDBACK
-%% TO DO: NUMCORRECT key
+%% TODO: CORRECTFEEDBACK
+%% TODO: PARTIALLYCORRECTFEEDBACK
+%% TODO: INCORRECTFEEDBACK
+%% TODO: NUMCORRECT key
%% NUMBERING -- for numbering of multichoice questions
\define@choicekey{moodle}{numbering}%
{alpha,alph,Alpha,Alph,arabic,roman,Roman,%
- abc,ABC,123,iii,IIII,none}[abc]{%
+ abc,ABCD,123,iii,IIII,none}[abc]{%
\def\moodle@numbering{#1}%
\def\test@@i{#1}%
\ifx\test@@i\@moodle@alpha
@@ -282,9 +447,9 @@
\ifx\test@@i\@moodle@alph
\def\moodle@numbering{abc}\fi
\ifx\test@@i\@moodle@Alpha
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@Alph
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@arabic
\def\moodle@numbering{123}\fi
\ifx\test@@i\@moodle@roman
@@ -306,7 +471,7 @@
\def\@moodle@roman{roman}%
\def\@moodle@Roman{Roman}%
\def\@moodle@abc{abc}%
- \def\@moodle@ABC{ABC}%
+ \def\@moodle@ABCD{ABCD}%
\def\@moodle@arabicnumbers{123}%
\def\@moodle@iii{iii}%
\def\@moodle@IIII{IIII}%
@@ -315,7 +480,7 @@
\ifx\moodle@numbering\@moodle@abc
\renewcommand\theenumii{\alph{enumii}}%
\fi
- \ifx\moodle@numbering\@moodle@ABC
+ \ifx\moodle@numbering\@moodle@ABCD
\renewcommand\theenumii{\Alph{enumii}}%
\fi
\ifx\moodle@numbering\@moodle@arabicnumbers
@@ -331,7 +496,7 @@
\renewcommand\labelenumii{$\bullet$~}%
\fi
}
- %TO DO: * In the PDF, how should 'none' in a multi look different from
+ %TODO: * In the PDF, how should 'none' in a multi look different from
% short answer or numerical options?
% * Instead of \theenumi and \labelenumi,
% use \@enumdepth to automatically set the correct depth.
@@ -414,7 +579,7 @@
%% RESPONSE REQUIRED
\define@boolkey{moodle}[moodle@]{response required}[true]{}%
- % TO DO: Make synonym 'required'
+ % TODO: Make synonym 'required'
\generate@moodle@write@code*{responserequired}<responserequired>{\csname ifmoodle@response required\endcsname 1\else 0\fi}%
\moodleset{response required=false}%
@@ -444,7 +609,7 @@
%% RESPONSE TEMPLATE
\define@key{moodle}{template}{\long\def\moodle@responsetemplate{#1}}%
- \generate@moodle@write@code{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
+ \generate@moodle@write@html@noptag{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
\moodleset{template={}}%
%% SHOWNUMCORRECT
\define@boolkey{moodle}[moodle@]{shownumcorrect}[true]{}%
@@ -483,53 +648,125 @@
\fi
\xa\xa\xa\def\xa\xa\xa#2\xa\xa\xa{\newxml}%
}%
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TRUE/FALSE QUESTIONS %%%%%%%%%%%%%%%%%
+%% CALCULATED %%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% DESCRIPTION 'QUESTIONS' %%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% CALCULATED %%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\moodle@makelatextagbox#1{%
+ \Ovalbox{\tiny #1}
+ %\ovalbox{\tiny #1}
+ %\shadowbox{\tiny #1}
+}%
+
+\def\moodle@makelatextag@qtype#1{%
+ \doublebox{\tiny \textsc{#1}}
+}%
+
+\def\moodle@makelatextag@value#1#2{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname~#2}
+}%
+\def\moodle@makelatextag@key#1{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname}
+}%
+\def\moodle@marks#1{point\ifdim#1pt=1pt \else s\fi}
-\def\moodle@makefrontend#1{%
+\def\moodle@makefrontend#1#2{%
\NewEnviron{#1}[2][]{%
\bgroup
\setkeys{moodle}{##1,questionname={##2}}%
\expandafter\gatheritems\xa{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{#1}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{#1}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ #2\par
\noindent
\moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
\csname moodle@#1@latexprocessing\endcsname
%Now, writing information to XML
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname write#1question\endcsname
\bgroup
\gdef\moodle@answers@xml{}%
\setkeys{moodle}{feedback={}}%
\xa\loopthroughitemswithcommand\xa{\csname save#1answer\endcsname}%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \csname write#1question\endcsname
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
}
+\let\description\relax% remove the meaning of existing \description and \enddescription
+\let\enddescription\relax
+\NewEnviron{description}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \let\moodle@questiontext=\BODY
+ \trim@spaces@in\moodle@questiontext
+ \ifx\moodle@questiontext\@empty\relax\else%
+ %First, the LaTeX processing.
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout\else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}%
+ \fi
+ \par
+ \noindent
+ \fi
+ \moodle@makelatextag@qtype{description}\par
+ \noindent
+ \moodle@questiontext\par
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \fbox{\parbox{\linewidth}{\emph{\moodle@feedback}}}%
+ \fi
+ \fi
+ %Now, writing information to memory.
+ \@moodle@ifgeneratexml{%
+ \writetomoodle{<question type="description">}%
+ \moodle@writecommondata
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \fi
+ \egroup
+}%
\def\moodle@essay@latexprocessing{%
% Moodle cannot automatically grade an essay,
% but if the user puts \item's in, we can list them in an itemize as notes.
+ \par\noindent \emph{Notes for grader:}
+ \moodle@questionheader
\ifnum\c@numgathereditems>0\relax
- \par\noindent Notes: (not included in XML)
\begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
\loopthroughitemswithcommand{\moodle@print@essay@answer}%
\end{itemize}%
\fi
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
}
\NewEnviron{essay}[2][]{%
@@ -538,13 +775,35 @@
\expandafter\gatheritems\expandafter{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{essay}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{essay}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \moodle@makelatextag@key{responseformat}
+ \fi
+ \par
\noindent
- \moodle@questionheader
- \csname moodle@essay@latexprocessing\endcsname
+ \ifx\moodle@responsetemplate\@empty\relax\else%
+ \par\noindent \emph{Template:}
+ \par\fbox{\parbox{\linewidth}{\moodle@responsetemplate}}\par
+ \fi
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \ifmoodle@handout\else
+ \csname moodle@essay@latexprocessing\endcsname
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \writeessayquestion
\bgroup
\gdef\moodle@answers@xml{}%
%
@@ -564,12 +823,15 @@
%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \writeessayquestion
+ \moodle@writeanswers% The 'answers' XML really contains the grader info.
+ \moodle@writeresponsetemplate%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
-%%%% TO DO
+%%%% TODO
%%%% To make essay work will be tough.
%%%% Every line from \ifnum\c@numgathereditems=0\relax through its \else and \fi,
%%%% with the exception of
@@ -611,9 +873,6 @@
\moodle@writeresponsefieldlines%
\moodle@writeattachmentsallowed%
\moodle@writeattachmentsrequired%
- \moodle@writeanswers% The 'answers' XML really contains the grader info.
- \moodle@writeresponsetemplate%
- \writetomoodle{</question>}%
}%
\def\moodle@print@essay@answer#1{%
@@ -621,6 +880,7 @@
}%
\def\moodle@savegraderinfo#1{%
+ %\def\ds{#1}\show\ds
\bgroup
\moodle@savegraderinfo@int#1\moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
@@ -631,7 +891,8 @@
\moodle@savegraderinfo@int@int%
}%
\def\moodle@savegraderinfo@int@int#1\moodle@answer@rdelim{%
- \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{#1}%
+ \def\moodle@answertext{#1}
+ \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
%\trim@spaces@in\moodle@answertext
\ifnum\c@numgathereditems>1\relax
\addto@xml[6]{\moodle@answers@xml}{<li>\moodle@answertext@html</li>}%
@@ -642,15 +903,32 @@
\def\blank{\rule{1in}{0.5pt}}%
-\moodle@makefrontend{shortanswer}%
+\moodle@makefrontend{shortanswer}{\moodle@makelatextag@shortanswer}%
-\def\moodle@shortanswer@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
- \end{itemize}%
+
+\def\moodle@makelatextag@shortanswer{%
+ \csname ifmoodle@case sensitive\endcsname
+ \moodle@makelatextagbox{Case-Sensitive}\relax
+ \else
+ \moodle@makelatextagbox{Case-Insensitive}\relax
+ \fi
}
+\ifmoodle@handout
+ \let\moodle@shortanswer@latexprocessing\relax
+\else
+ \def\moodle@shortanswer@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@shortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\moodle@print@shortanswer@answer@int#1\@rdelim
}%
\newcommand\moodle@print@shortanswer@answer@int[1][]{%
@@ -659,9 +937,13 @@
}%
\def\moodle@print@shortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \item #1\quad$\checkmark$%
+ \item #1$~\checkmark$%
\else
- \item #1\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ \item #1$~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}
\fi
}%
@@ -677,10 +959,14 @@
}%
\def\saveshortansweranswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
\addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -689,34 +975,57 @@
\writetomoodle{<question type="shortanswer">}%
\moodle@writecommondata%
\moodle@writeusecase%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
-\moodle@makefrontend{numerical}%
+\moodle@makefrontend{numerical}{\moodle@makelatextag@numerical}%
+
-\def\moodle@numerical@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
- \end{itemize}%
+\def\moodle@makelatextag@numerical{}
+
+\AtEndPreamble{
+ \@ifpackageloaded{siunitx}{\def\moodle@printnum{\num[omit-uncertainty,copy-decimal-marker]}}{\let\moodle@printnum\trim@spaces}%
}
+\ifmoodle@handout
+ \let\moodle@numerical@latexprocessing\relax
+\else
+ \def\moodle@numerical@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@numerical@answer#1{%
- \moodle@print@numerical@answer@int#1\@rdelim
+ \let\moodle@feedback=\@empty
+ \bgroup
+ \moodle@print@numerical@answer@int#1\@rdelim
+ \egroup
}%
\newcommand\moodle@print@numerical@answer@int[1][]{%
\setkeys{moodle}{#1}%
\moodle@print@numerical@answer@int@int%
}%
\def\moodle@print@numerical@answer@int@int#1\@rdelim{%
- \ifdim0pt=\moodle@tolerance pt\relax
- \def\moodle@numericalprint@tolerance{}%
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \item \test@i
\else
- \edef\moodle@numericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \item \moodle@printnum{#1}%
+ \ifnum\z@=\moodle@tolerance\else
+ $\,\pm\,$\moodle@printnum{\moodle@tolerance}%
+ \fi
\fi
\ifx\moodle@fraction\@hundred
- \item $#1\moodle@numericalprint@tolerance\quad\checkmark$%
+ $~\checkmark$%
\else
- \item $#1\moodle@numericalprint@tolerance$\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ $~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
\fi
}%
@@ -732,11 +1041,17 @@
}%
\def\savenumericalanswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
\addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
- \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \ifx\moodle@answertext\@star\else
+ \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \fi
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -744,59 +1059,155 @@
\gdef\writenumericalquestion{%
\writetomoodle{<question type="numerical">}%
\moodle@writecommondata%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
-\moodle@makefrontend{multi}
+\moodle@makefrontend{multi}{\moodle@makelatextag@multi}%
+
+
+\def\moodle@makelatextag@multi{%
+ \ifmoodle@multiple
+ \moodle@makelatextagbox{Multiple}\relax%
+ \else
+ \moodle@makelatextagbox{Single}\relax%
+ \fi
+ \ifmoodle@handout\else
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
\def\moodle@multi@latexprocessing{%
- \moodle@countcorrectanswers
- \begin{enumerate}\moodle@obeynumberingstyle
- %\renewcommand{\theenumi}{\alph{enumi}}%
- \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
- \end{enumerate}%
+ \moodle@countcorrectanswers%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ \begin{enumerate}\moodle@obeynumberingstyle%
+ %\renewcommand{\theenumi}{\alph{enumi}}%
+ \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@multi@loop=\ForEachRandomItem
+ \else
+ \let\moodle@multi@loop=\ForEachFirstItem
+ \fi
+ \moodle@multi@loop{answerlist}{Answer}{\Answer}%
+ \fi
+ \end{enumerate}%
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
}
\def\moodle@print@multichoice@answer#1{%
- \moodle@print@multichoice@answer@int#1\@rdelim
+ \let\moodle@feedback=\@empty%
+ \moodle@print@multichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@multichoice@answer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@print@multichoice@answer@int@int
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@print@multichoice@answer@int@int%
}%
\def\moodle@print@multichoice@answer@int@int#1#2\@rdelim{%
\def\test@i{#1}%
- \ifmoodle@single
- \ifx\test@i\@star
- \item #2$~\checkmark$%
+ \def\test@ii{#2}%
+ \def\moodle@answertext{\item }%
+ \ifx\test@i\@star%
+ \g@addto@macro\moodle@answertext{#2}%
+ \ifmoodle@single%
+ \setkeys{moodle}{fraction=100}%
\else
- \item #1#2%
+ \setkeys{moodle}{fraction=\moodle@autopoints}%
\fi
\else
- \ifx\test@i\@star
- \item #2%
- \setkeys{moodle}{fraction=\moodle@autopoints}%
- \else
- \item #1#2%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext%
+ \trim@spaces@in\moodle@answertext%
+ \ifmoodle@handout\else
+ \ifmoodle@single%
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \ifx\moodle@fraction\@hundred%
+ \trim@spaces@in\moodle@answertext%
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else%
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
+ \else% multiple
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \moodle@checkfraction
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
\fi
- $~(\moodle@fraction\%)$
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
+ \else
+ \ifx\moodle@feedback\@empty\relax\else%
+ \g@addto@macro\moodle@answertext{\hfill \emph{$\rightarrow$ \moodle@feedback}}%
+ \fi
+ \moodle@answertext
\fi
}%
- \newcounter{moodle@numcorrectanswers}%
+ \newcounter{moodle@numcorrectanswers}% count the stars
+ \newcounter{moodle@numincorrectanswers}% count the items without fraction key indicated
\newlength{\moodle@pointspercorrect}%
+ \newlength{\moodle@pointsperincorrect}%
+ \newlength{\moodle@sumofpositivefractions}% sums user-set positive fractions
+ \newlength{\moodle@sumofnegativefractions}% sums user-set negative fractions
\def\moodle@countcorrectanswers{%
\setcounter{moodle@numcorrectanswers}{0}%
+ \setcounter{moodle@numincorrectanswers}{0}%
\global\setlength{\moodle@pointspercorrect}{100pt}%
+ \global\setlength{\moodle@pointsperincorrect}{-100pt}%
+ \global\setlength{\moodle@sumofpositivefractions}{0pt}%
+ \global\setlength{\moodle@sumofnegativefractions}{0pt}%
\loopthroughitemswithcommand{\moodle@countcorrectanswers@a}%
- \ifnum0=\c@moodle@numcorrectanswers\relax
- \PackageError{moodle}{No correct answers given for multiple choice question.}{Please mark at least one answer correct.}%
- \gdef\moodle@autopoints{0}%
+ \global\advance\moodle@pointspercorrect by-\moodle@sumofpositivefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofpositivefractions}%
+ \ifnum0=\c@moodle@numcorrectanswers\relax%
+ % autopoints will never be used but we check if the sum of positive fractions is 100%
+ \ifdim\moodle@pointspercorrect<-\moodle@fractiontol pt\relax%
+ \PackageWarning{moodle}{Positive fractions sum up to more than 100 (here: \ds)}%
+ \else
+ \ifdim\moodle@pointspercorrect>\moodle@fractiontol pt\relax%
+ \PackageError{moodle}{Positive fractions sum up to less than 100 (here: \ds)}%
+ \fi
+ \fi
+ \else
+ \ifdim0pt<\moodle@pointspercorrect\relax\else%
+ % we have starred items so the sum of user-set positive fractions must be less than 100%
+ % otherwise, starred items would lead to penalties
+ \PackageError{moodle}{Positive fractions sum up to 100 or more (here: \ds):
+ there is no positive points left to be given to starred items.}%
+ \fi
+ \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax%
+ \fi
+ \gdef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \global\advance\moodle@pointsperincorrect by-\moodle@sumofnegativefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofnegativefractions}%
+ \ifnum0=\c@moodle@numincorrectanswers\relax%
+ % autosanctions will never be used and
+ % we do not care about the sum of negative fractions (might be less than -100)
\else
- \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax
- \edef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \ifdim0pt<\moodle@pointsperincorrect\relax%
+ % we have items without fractions set: to prevent auto sanctions from becoming bonuses,
+ % such items are neutralized.
+ \PackageWarning{moodle}{Negative fractions sum up to -100 or less (here: \ds):
+ items with no fraction key set will be considered as neutral.}%
+ \global\setlength{\moodle@pointsperincorrect}{0pt}%
+ \fi
+ \global\divide\moodle@pointsperincorrect by \c@moodle@numincorrectanswers\relax%
\fi
+ \gdef\moodle@autosanctions{\strip@pt\moodle@pointsperincorrect}%
}
\def\moodle@countcorrectanswers@a#1{%
%The grouping is to keep key answer-specific key changes local.
@@ -805,30 +1216,77 @@
\egroup
}%
\newcommand\moodle@countcorrectanswers@b[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@countcorrectanswers@c%
+ %\ifx&#1&%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@countcorrectanswers@c%
+ %\fi
}%
\def\moodle@countcorrectanswers@c#1#2\moodle@answer@rdelim{%
\def\test@i{#1}%
\ifx\test@i\@star
\stepcounter{moodle@numcorrectanswers}%
\else
- \global\addtolength{\moodle@pointspercorrect}{-\moodle@fraction pt}%
+ \ifx\moodle@fraction\@empty\relax%
+ \stepcounter{moodle@numincorrectanswers}%
+ \else
+ \ifdim0pt<\moodle@fraction pt\relax%
+ \global\addtolength{\moodle@sumofpositivefractions}{\moodle@fraction pt}%
+ \else
+ \global\addtolength{\moodle@sumofnegativefractions}{\moodle@fraction pt}%
+ \fi
+ \fi
\fi
}%
- \def\moodle@setautopoints#1pt{%
- \gdef\moodle@autopoints{#1}%
+ \newlength{\test@fraction}%
+ \newlength{\test@lower}%
+ \newlength{\test@upper}%
+ \def\moodle@fractionerror{%
+ \def\ds{\moodle@fraction}%
+ \PackageError{moodle}{the current fraction is not a valid value (here: \ds)}%
+ }
+ {\catcode`|=3\relax
+ \gdef\moodle@validfractionlist{0|5|10|11.11111|12.5|14.28571|16.66667|20|25|30|33.33333|40|50|60|66.66667|70|75|80|83.33333|90|100}}%
+ \def\moodle@isfractionnear#1{%
+ \setlength{\test@lower}{#1 pt}%
+ \addtolength{\test@lower}{-\moodle@fractiontol pt}%
+ \setlength{\test@upper}{#1 pt}%
+ \addtolength{\test@upper}{\moodle@fractiontol pt}%
+ \ifdim\test@upper>\test@fraction\relax
+ \ifdim\test@lower<\test@fraction\relax
+ \gdef\test@fractionmatched{#1}%
+ \fi
+ \fi
+ }
+ \def\moodle@checkfraction{%
+ %\def\test@i{#1}%
+ \setlength{\test@fraction}{\moodle@fraction pt}%
+ % take the absolute value
+ \ifdim0pt>\test@fraction\relax%
+ \setlength{\test@fraction}{-\moodle@fraction pt}%
+ \fi
+ % test if the fraction is an admissible value
+ \let\test@fractionmatched\@empty
+ \forlistloop{\moodle@isfractionnear}{\moodle@validfractionlist}%
+ \ifx\test@fractionmatched\@empty\relax
+ \moodle@fractionerror%
+ \fi
+ \ifdim\moodle@fraction pt<-\moodle@fractiontol pt\relax%
+ \setkeys{moodle}{fraction=-\test@fractionmatched}%
+ \else
+ \setkeys{moodle}{fraction=\test@fractionmatched}%
+ \fi
}
-
\def\savemultianswer#1{%
\bgroup
- \savemultianswer@int#1\moodle@answer@rdelim
+ \savemultianswer@int#1 \moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savemultianswer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
\savemultianswer@int@int%
}%
\def\savemultianswer@int@int#1#2\moodle@answer@rdelim{%
@@ -843,12 +1301,23 @@
\else
\def\moodle@answertext{#1#2}%
\fi
+ \ifx\moodle@fraction\@empty\relax%
+ \ifmoodle@single\relax
+ \setkeys{moodle}{fraction=0}%
+ \else% multiple
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \fi
+ \trim@spaces@in\moodle@answertext
\trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="html">}%
\xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
\addto@xml[4]{\moodle@answers@xml}{ <text><![CDATA[<p>\moodle@answertext@html</p>]]></text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -859,42 +1328,322 @@
\moodle@writesingle%
\moodle@writeshuffle%
\moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
-\let\answer=\hfill
-\moodle@makefrontend{matching}
-\def\moodle@matching@latexprocessing{%
+\NewEnviron{truefalse}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \expandafter\gatheritems\xa{\BODY}%
+ \let\moodle@questionheader=\gatheredheader
+ %First, the LaTeX processing
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{truefalse}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{truefalse}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \fi
+ \par
+ \noindent
+ \moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \moodle@truefalse@latexprocessing
+ %Now, writing information to XML
+ \@moodle@ifgeneratexml{%
+ \setkeys{moodle}{penalty=1}%
+ \xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname writetruefalsequestion\endcsname
+ \bgroup
+ \gdef\moodle@answers@xml{}%
+ \setkeys{moodle}{feedback={}}%
+ \xa\loopthroughitemswithcommand\xa{\xa\savetruefalseanswer}%
+ \ifnum\c@numgathereditems=1\relax%
+ \setcounter{currentitemnumber}{2}%
+ \savetruefalseanswer{}
+ \fi
+ \passvalueaftergroup{\moodle@answers@xml}%
+ \egroup
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \egroup
+ }%
+
+
+\def\moodle@truefalse@latexprocessing{%
+ \setcounter{moodle@numcorrectanswers}{0}%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@truefalse@answer}%
+ \ifnum\c@currentitemnumber=2%
+ \item \textbf{False}%
+ \fi
+ \end{itemize}
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \ifnum\c@moodle@numcorrectanswers=0\relax%
+ \PackageError{moodle}{No answer is explicitly marked as correct (*). Be sure one answer leads to points.}%
+ \fi
+ \ifnum\c@moodle@numcorrectanswers>1\relax%
+ \PackageError{moodle}{Two answers are explicitly marked as correct (*). Be sure only one answer leads to points.}%
+ \fi
+}
+
+ \def\moodle@print@truefalse@answer#1{% here # is all what comes after "\item", that is "[options]* text"
+ \let\moodle@feedback=\@empty
+ \moodle@print@truefalse@answer@int#1\@rdelim % add an end delimiter:
+ }%
+ \newcommand\moodle@print@truefalse@answer@int[1][]{% with the optional argument, catch options and set them as keys
+ \setkeys{moodle}{#1}%
+ \moodle@print@truefalse@answer@int@int% applies to the rest: "* text\@rdelim"
+ }%
+ \def\moodle@print@truefalse@answer@int@int#1\@rdelim{% this is just to treat appart the case where nothing follows
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \moodle@print@truefalse@answer@int@int@empty
+ \else
+ \moodle@print@truefalse@answer@int@int@int#1\@rdelim
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@empty{%
+ \ifnum\c@currentitemnumber=1%
+\def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+\def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ ~\hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@int#1#2\@rdelim{%
+ \ifnum\c@currentitemnumber=1%
+\def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+\def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifnum\c@currentitemnumber<3%
+ \def\test@i{#1}%
+ %\trim@spaces@in\test@i
+ \ifx\test@i\@star
+ \ifmoodle@handout\else
+ ~$\checkmark$%
+ \fi
+ \stepcounter{moodle@numcorrectanswers}%
+ \else
+ ~%
+ \fi
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}%
+ \trim@spaces@in\test@ii
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star%
+ \hfill \emph{$\rightarrow$ #2}%
+ \else%
+ \hfill \emph{$\rightarrow$ #1#2}%
+ \fi
+ \fi
+ \else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ \fi
+ }%
+
+\def\savetruefalseanswer#1{%
\bgroup
- \let\answer=\hfill
- \begin{enumerate}\renewcommand{\theenumi}{\alph{enumi}}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@matching@answer}%
- \end{enumerate}%
+ \savetruefalseanswer@int#1\moodle@answer@rdelim
+ \passvalueaftergroup{\moodle@answers@xml}%
\egroup
-}
- \long\def\moodle@print@matching@answer#1{%
- \moodle@print@matching@answer@int#1\@rdelim
+}%
+ \newcommand\savetruefalseanswer@int[1][]{%
+ \setkeys{moodle}{#1}%
+ \savetruefalseanswer@int@int%
}%
- \newcommand\moodle@print@matching@answer@int[1][]{%
- \moodle@print@matching@answer@int@int\relax
+ \def\savetruefalseanswer@int@int#1\moodle@answer@rdelim{%
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \savetruefalseanswer@int@int@empty
+ \else
+ \savetruefalseanswer@int@int@int#1\moodle@answer@rdelim
+ \fi
}%
- \long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
- \item #1\hfill #2%
+ \def\savetruefalseanswer@int@int@empty{%
+ \setkeys{moodle}{fraction=0}%
+ \ifnum\c@currentitemnumber=1%
+\def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+\def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax\else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
+ }%
+ \def\savetruefalseanswer@int@int@int#1#2\moodle@answer@rdelim{%
+ \def\test@i{#1}%
+ \ifx\test@i\@star
+ \setkeys{moodle}{fraction=100}%
+ \else
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \ifnum\c@currentitemnumber=1%
+\def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+\def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#2}%
+ \else%
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#1#2}%
+ \fi%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
}%
+\gdef\writetruefalsequestion{%
+ \writetomoodle{<question type="truefalse">}%
+ \moodle@writecommondata%
+}%
+
+\moodle@makefrontend{matching}{\moodle@makelatextag@matching}%
+
+
+\def\moodle@makelatextag@matching{%
+ \ifmoodle@handout\else
+ \ifmoodle@draganddrop
+ \moodle@makelatextagbox{Drag and drop}\relax%
+ \fi
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
+
+\def\moodle@matching@latexprocessing{%
+ \bgroup
+ %\let\answer=\hfill
+ \par%\noindent
+ \ifmoodle@handout
+ \NewList{questionlist}
+ \NewList{answerlist}
+ \fi
+ \def\matching@table@text{}%
+ % \ifnum\c@numgathereditems>2\relax%
+ \setcounter{moodle@numcorrectanswers}{0}% Here this counter is for "questions" (items on the left column)
+ \loopthroughitemswithcommand{\moodle@print@matching@answer}%
+ \ifnum\c@numgathereditems<3%
+ \PackageWarning{moodle}{Moodle expects at least three "answers" with matching type}
+ \fi
+ \ifnum\c@moodle@numcorrectanswers<2%
+ \PackageWarning{moodle}{Moodle expects at least two "questions" with the matching type}
+ \fi
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@matching@loop=\ForEachRandomItem
+ \else
+ \let\moodle@matching@loop=\ForEachFirstItem
+ \fi
+ \moodle@matching@loop{questionlist}{Question}{
+ \xdef\test@i{\Question}%
+ \ExtractRandomItem{answerlist}{Answer}%
+ \ifx\test@i\@empty
+ \xdef\matching@table@text{\expandonce\matching@table@text & & $\bullet$~\expandonce\Answer\\}%
+ \else
+ \xdef\matching@table@text{\expandonce\matching@table@text\expandonce\Question~$\bullet$ & & $\bullet$~\expandonce\Answer\\}%
+ \fi
+ }%
+ \fi
+ \begin{tabular}{@{}>{\raggedleft}p{.45\linewidth}p{.1\linewidth}p{.45\linewidth}@{}}%
+ \matching@table@text
+ \end{tabular}%
+ \par
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \egroup
+}
+
+\long\def\moodle@print@matching@answer#1{%
+ \moodle@print@matching@answer@int#1 \@rdelim
+}%
+\newcommand\moodle@print@matching@answer@int[1][]{%
+ \moodle@print@matching@answer@int@int
+}%
+\long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
+ \def\test@i{#1}%
+ \trim@spaces@in\test@i
+ \ifmoodle@handout
+ \ifx\test@i\@empty
+ \InsertLastItem{questionlist}{\@empty}%
+ \else
+ \InsertLastItem{questionlist}{#1}%
+ \fi
+ \InsertLastItem{answerlist}{#2}%
+ \else
+ \ifx\test@i\@empty
+ \g@addto@macro\matching@table@text{&&$\bullet$~#2\\}%
+ \else
+ \stepcounter{moodle@numcorrectanswers}%
+ \xa\g@addto@macro\xa\matching@table@text\xa{\test@i~$\bullet$&\leavevmode\cleaders\hb@xt@.44em{\hss$\cdot$\hss}\hfill\kern\z@&$\bullet$~#2\\}%
+ \fi
+ \fi
+}%
+
\long\def\savematchinganswer#1{%
\bgroup
- \savematchinganswer@int#1\moodle@answer@rdelim%
+ \savematchinganswer@int#1 \moodle@answer@rdelim%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savematchinganswer@int[1][]{%
\setkeys{moodle}{#1}%
- \xa\savematchinganswer@int@int\space%
+ \savematchinganswer@int@int%\space
}%
\long\def\savematchinganswer@int@int#1\answer#2\moodle@answer@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
% Note that #1 may simply be \relax.
\def\moodle@subquestiontext{#1}%
\def\moodle@subanswertext{#2}%
@@ -915,9 +1664,6 @@
\else
\addto@xml[4]{\moodle@answers@xml}{ <answer><text>\moodle@subanswertext</text></answer>}%
\fi
- \ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
- \fi
\addto@xml[2]{\moodle@answers@xml}{</subquestion>}%
}%
@@ -928,13 +1674,11 @@
\writetomoodle{<question type="matching">}%
\fi
\moodle@writecommondata%
- \moodle@writesingle%
\moodle@writeshuffle%
- \moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
+\newif\ifmoodle@clozemode
+\moodle@clozemodefalse
\NewEnviron{cloze}[2][]{%
\bgroup
\setkeys{moodle}{default grade=1}%
@@ -942,9 +1686,30 @@
% A cloze question won't have any \item's in it, so we just use \BODY.
\moodle@enableclozeenvironments
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{cloze}
+ \else
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: \texttt{\moodle@tags}
+ \fi
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{cloze}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ \par
\noindent
\BODY
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ %\csname moodle@cloze@latexprocessing\endcsname
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\BODY}% Save the question text as HTML.
@@ -965,6 +1730,7 @@
\gdef\writeclozequestion{%
\writetomoodle{<question type="cloze">}%
\moodle@writecommondata%
+ \moodle@writetags%
\writetomoodle{</question>}%
}%
@@ -979,40 +1745,87 @@
\def\moodle@clozemulti@output{}%
\xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\moodle@questionheader}%
\def\clozemulti@coding{}%
- \edef\clozemulti@coding{\otherlbrace\csname moodle@default grade\endcsname:}%
+ \edef\clozemulti@coding{\csname moodle@default grade\endcsname:}%
+ \ifmoodle@multiple
+ \PackageWarning{moodle}{Cloze Multiresponse only supported by Moodle 3.5+}
+ \g@addto@macro{\clozemulti@coding}{MULTIRESPONSE}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{MULTICHOICE}%
+ \fi
\ifcase\moodle@multi@mode\relax
- % Case 0: dropdown box style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE:}%
+ % Case 0: dropdown box style
+ \ifmoodle@shuffle
+ \g@addto@macro{\clozemulti@coding}{_}%
+ \fi
\or
% Case 1: vertical style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_V:}%
+ \ifmoodle@multiple
+ \PackageError{moodle}{Vertical mode (dropdown box) incompatible with multiresponse.}
+ \else
+ \g@addto@macro{\clozemulti@coding}{_V}%
+ \fi
\else
% Case 2: horizontal radio buttons
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_H:}%
+ \g@addto@macro{\clozemulti@coding}{_H}%
+ \fi
+ \ifmoodle@shuffle
+ \PackageWarning{moodle}{Cloze Multi Shuffling only supported by Moodle 3.0+}
+ \g@addto@macro{\clozemulti@coding}{S:}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozemultichoiceanswer}%
\egroup
- \xa\g@addto@macro\xa\clozemulti@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\clozemulti@coding}%
+ %\xa\g@addto@macro\xa\clozemulti@coding\xa{\clozerbrace}%
+ \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\xa\clozelbrace\clozemulti@coding\clozerbrace}%
+ %\show\moodle@clozemulti@output
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozemulti@output}%
\def\endclozemulti@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{multi}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@multi
+ \fi
\def\cloze@multichoice@table@text{}%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ %\let\moodle@feedback=\@empty
\loopthroughitemswithcommand{\moodle@print@clozemultichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@clozemult@loop=\ForEachRandomItem
+ \else
+ \let\moodle@clozemult@loop=\ForEachFirstItem
+ \fi
+ \moodle@clozemult@loop{answerlist}{Answer}{
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\Answer}%
+ }%
+ \fi
\ifcase\moodle@multi@mode\relax
%Case 0: dropdown box style
- \begin{tabular}[t]{|l|}\firsthline% (\firsthline is from the array package.)
+ \par\noindent
+ \ifmoodle@handout
+ \begin{tabular}[t]{|p{.45\linewidth}|}
+ \else
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \fi
+ \firsthline% (\firsthline is from the array package.)
\cloze@multichoice@table@text%
\end{tabular}%
+ \par%
\or
%Case 1: vertical style
+ \par\noindent
\begin{itemize}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
\cloze@multichoice@table@text%
\end{itemize}%
+ \par%
\else
%Case 2: horizontal radio buttons
\par{\cloze@multichoice@table@text}\par%
@@ -1025,40 +1838,75 @@
}[\endclozemulti@code]%
\def\moodle@print@clozemultichoice@answer#1{%
- \moodle@print@clozemultichoice@answer@int#1\@rdelim%
+ \let\moodle@feedback=\@empty
+ \moodle@print@clozemultichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@clozemultichoice@answer@int[1][]{%
+ \setkeys{moodle}{fraction=0,#1}%
\moodle@print@clozemultichoice@answer@int@int%
}%
\def\moodle@print@clozemultichoice@answer@int@int#1#2\@rdelim{%
+ \def\moodle@answertext{}%
% Case 0: "(answer) \\ \hline"
% Case 1: "\item (answer)"
% Case 2: "$\bullet~$(answer)\hfill"
\ifcase\moodle@multi@mode\relax
\relax% Case 0
\or
- \g@addto@macro\cloze@multichoice@table@text{\item}% Case 1
+ \g@addto@macro\moodle@answertext{\item}% Case 1
\else
- \g@addto@macro\cloze@multichoice@table@text{$\bullet~$}% Case 2
+ \g@addto@macro\moodle@answertext{$\bullet~$}% Case 2
\fi
\def\test@i{#1}%
\ifx\test@i\@star
- \g@addto@macro\cloze@multichoice@table@text{#2$~\checkmark$}%
+ \setkeys{moodle}{fraction=100}%
+ \g@addto@macro\moodle@answertext{#2}%
\else
- \g@addto@macro\cloze@multichoice@table@text{#1#2}%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
+ \ifmoodle@handout\else
+ \ifx\moodle@fraction\@hundred
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
\fi
\ifcase\moodle@multi@mode\relax
- \g@addto@macro{\cloze@multichoice@table@text}{\\ \hline}% Case 0
- \or
- \relax% Case 1
+ % Case 0
+ \ifmoodle@handout\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext &\expandonce\emph{\expandonce\moodle@feedback}}%
+ \fi
+ \g@addto@macro\moodle@answertext{\\\hline}
+ \or % Case 1
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext \hfill \expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \else % otherwise
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext\,\expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \g@addto@macro\moodle@answertext{\hfill}% Case 2
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
\else
- \g@addto@macro{\cloze@multichoice@table@text}{\hfill}% Case 2
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\moodle@answertext}%
\fi
}%
\def\saveclozemultichoiceanswer#1{%
\bgroup
- \saveclozemultichoiceanswer@int#1\moodle@answer@rdelim
+ \saveclozemultichoiceanswer@int#1 \moodle@answer@rdelim
\egroup
}%
\newcommand\saveclozemultichoiceanswer@int[1][]{%
@@ -1077,17 +1925,18 @@
\def\moodle@answertext{#1#2}%
\fi
\trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozemulti@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\expandonce\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
\NewEnviron{clozenumerical}[1][]{%
@@ -1101,23 +1950,34 @@
\def\moodle@clozenumerical@output{}%
\xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\moodle@questionheader}%
\def\clozenumerical@coding{}%
- \edef\clozenumerical@coding{\otherlbrace\csname moodle@default grade\endcsname:NUMERICAL:}%
+ \edef\clozenumerical@coding{\csname moodle@default grade\endcsname:NUMERICAL:}%
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozenumericalanswer}%
\egroup
- \xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\clozenumerical@coding}%
+ %\xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\xa\clozelbrace\clozenumerical@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozenumerical@output}%
\def\endclozenumerical@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@numerical@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@numerical@table@text\hline%
- \end{tabular}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{numerical}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@numerical
+ \par
+ \noindent
+ \def\cloze@numerical@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+ \cloze@numerical@table@text%
+ \end{tabular}%
+ \par%
+ \fi
\def\endclozenumerical@code{\relax}%
\fi
\passvalueaftergroup\endclozenumerical@code%
@@ -1126,6 +1986,7 @@
}[\endclozenumerical@code]%
\def\moodle@print@clozenumerical@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozenumerical@answer@int#1\@rdelim
\egroup
@@ -1136,17 +1997,23 @@
}%
\def\moodle@print@clozenumerical@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozenumericalprint@fraction{$\checkmark$}%
+ \def\moodle@clozenumericalprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozenumericalprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozenumericalprint@fraction{$(~\moodle@fraction\%)$}%
\fi
- \ifdim0pt=\moodle@tolerance pt\relax
+ \ifnum\z@=\moodle@tolerance
\def\moodle@clozenumericalprint@tolerance{}%
\else
- \edef\moodle@clozenumericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \edef\moodle@clozenumericalprint@tolerance{$\,\pm\,$\moodle@printnum{\moodle@tolerance}}%
+ \fi
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \xdef\moodle@clozenumericalprint@line{#1~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \else
+ \xdef\moodle@clozenumericalprint@line{\moodle@printnum{#1}\moodle@clozenumericalprint@tolerance~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
\fi
- \xdef\moodle@clozenumericalprint@line{$#1\moodle@clozenumericalprint@tolerance$ & \moodle@clozenumericalprint@fraction}%
- \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\}%
+ \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\\hline}%
}%
\def\saveclozenumericalanswer#1{%
@@ -1166,15 +2033,20 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozenumerical@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \ifx\moodle@answertext\@star
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext}%
+ \else
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \fi
\ifx\moodle@feedback\@empty\else
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\moodle@feedback}%
+ %\trim@spaces@in\moodle@feedback
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
\NewEnviron{clozeshortanswer}[1][]{%
@@ -1196,29 +2068,37 @@
\xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\moodle@questionheader}%
\def\clozeshortanswer@coding{}%
\ifnum\count0=1\relax
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
\else
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozeshortansweranswer}%
\egroup
- \xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\clozeshortanswer@coding}%
+ %\xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\xa\clozelbrace\clozeshortanswer@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozeshortanswer@output}%
\def\endclozeshortanswer@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@shortanswer@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
- \ifnum\count0=1\relax
- \marginpar{\tiny\mbox{(Case-Sensitive)}}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{shortanswer}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@shortanswer
+ \par
+ \noindent
+ \def\cloze@shortanswer@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+ \cloze@shortanswer@table@text%
+ \end{tabular}%
+ \par%
\fi
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@shortanswer@table@text\hline%
- \end{tabular}%
\def\endclozeshortanswer@code{\relax}%
\fi
\passvalueaftergroup\endclozeshortanswer@code%
@@ -1227,6 +2107,7 @@
}[\endclozeshortanswer@code]%
\def\moodle@print@clozeshortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozeshortanswer@answer@int#1\@rdelim
\egroup
@@ -1237,12 +2118,13 @@
}%
\def\moodle@print@clozeshortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozeshortanswerprint@fraction{$\checkmark$}%
+ \def\moodle@clozeshortanswerprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozeshortanswerprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozeshortanswerprint@fraction{$~(\moodle@fraction\%)$}%
\fi
- \xdef\moodle@clozeshortanswerprint@line{#1 & \moodle@clozeshortanswerprint@fraction}%
- \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\}%
+ \xdef\moodle@clozeshortanswerprint@line{#1~\moodle@clozeshortanswerprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\\hline}%
}%
\def\saveclozeshortansweranswer#1{%
@@ -1262,15 +2144,15 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozeshortanswer@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
{\catcode`\#=12\gdef\otherhash{#}%
@@ -1278,14 +2160,20 @@
\catcode`\&=12\gdef\otherampersand{&}%
\catcode`\^=12\gdef\othercaret{^}%
\catcode`\$=12\gdef\otherdollar{$}%
- \catcode`\%=12\gdef\otherpercent{%}}%
+ \catcode`\%=12\gdef\otherpercent{%}
+ \catcode`\%=12\gdef\otherlbracket{[}
+ \catcode`\%=12\gdef\otherrbracket{]}}%
{\catcode`\ =12\gdef\otherspace{ }}%
-{\tt\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
+{\ttfamily\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
{\catcode`\[=1\catcode`\]=2\catcode`\{=12\catcode`\}=12%
- \gdef\otherlbrace[{]\gdef\otherrbrace[}]]
+ \gdef\otherlbrace[{]\gdef\otherrbrace[}]\gdef\clozelbrace[{]\gdef\clozerbrace[}]]%
\edef\@otherlbrace{\otherlbrace}%
\edef\@otherrbrace{\otherrbrace}%
+\edef\@otherlbracket{\otherlbracket}%
+\edef\@otherrbracket{\otherrbracket}%
+\edef\@clozelbrace{\clozelbrace}%
+\edef\@clozerbrace{\clozerbrace}%
\edef\@otherdollar{\otherdollar}%
\edef\@otherbackslash{\otherbackslash}%
\edef\@othertilde{\othertilde}%
@@ -1362,6 +2250,7 @@
\def\retokenizenormal@to@macro#1#2{%
\scantokens@to@macro#1{\retokenizingcatcodes}{#2}%
}%
+\newcount\grouplevel
\newcount\moodle@mathmodedepth
\moodle@mathmodedepth=0\relax
\def\moodle@ifmathmode#1#2{%
@@ -1370,18 +2259,18 @@
\else
#2%
\fi
-}
-
-\newcount\grouplevel
+}%
+\newcount\moodle@listdepth
+\moodle@listdepth=0\relax
-\newif\ifhtmlizer@active
-\htmlizer@activefalse
\long\def\htmlize@grabblock#1#2\htmlize@rdelim@ii{%
\long\def\htmlize@blockinbraces{#1}%
\long\def\htmlize@remainder{#2}%
}%
\ultradetokenize@to@macro\@htmlize@stop@detokenized{\@htmlize@stop}%
\xa\def\xa\htmlize@remove@stopcode\xa#\xa1\@htmlize@stop@detokenized{#1}%
+\newif\ifhtmlizer@active
+\htmlizer@activefalse
\newif\ifhtmlize@actioncs
\newif\ifhtmlize@expandcs
\newif\ifhtmlize@passcs
@@ -1402,7 +2291,7 @@
\advance\grouplevel by 1\relax
\bgroup
\ultradetokenize@to@macro\htmlize@texttoscan{#1}%
- \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i
+ \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i%
\egroup
\advance\grouplevel by -1\relax
}%
@@ -1448,7 +2337,11 @@
\gdef\htmlize@scrap{\converttohtml@int}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\htmlize@blockinbraces}}%
\g@addto@macro\htmlize@scrap{\g@addto@macro\htmlize@output}%
- \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \ifmoodle@clozemode
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherbackslash\otherrbrace}}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \fi
\g@addto@macro\htmlize@scrap{\htmlize@recursive@i}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\htmlize@remainder@detokenized\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i}%
% Okay, that's done. It's stored in a global macro.
@@ -1465,10 +2358,10 @@
\htmlize@displaymathshift@replace#1#2#3\htmlize@rdelim@iii%
\else
% Single dollar sign, so we're entering inline math mode.
- % We grab everything between $$...$$, sanitize it, and add it verbatim to
+ % We grab everything between $...$, sanitize it, and add it verbatim to
% our output.
\htmlize@inlinemathshift@replace#1#2#3\htmlize@rdelim@iii%
- \fi
+ \fi% \ifx\test@ii\@otherdollar
% Now we resume work.
% The \htmlize@xxxxxxmathshift@replace macro stored the remaining text in \htmlize@remaining@text.
% Note that since we never detokenized and retokenized #1#2#3,
@@ -1593,9 +2486,9 @@
%\edef\ds{Must pass on \xa\string\@htmlize@cs}\show\ds
\g@addto@macro\htmlize@output{#1}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
+ \fi% \ifhtmlize@expandcs
+ \fi% \ifhtmlize@actioncs
+ \fi% \ifx\@htmlize@cs\@@begin@cs
\else%
\ifx\test@i\@othertilde%
% The ~ becomes non-breaking space &nbsp;
@@ -1610,7 +2503,7 @@
\else
\g@addto@macro\htmlize@output{\otherampersand lsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@lsinglequote%
\else
\ifx\test@i\@rsinglequote%
\ifx\test@ii\@rsinglequote%
@@ -1620,7 +2513,7 @@
\else
\g@addto@macro\htmlize@output{\otherampersand rsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@rsinglequote%
\else
\ifx\test@i\@doublequote
\g@addto@macro\htmlize@output{\otherampersand rdquo;}%
@@ -1639,16 +2532,16 @@
% Default case: write first token to output, call self on remaining tokens.
\g@addto@macro\htmlize@output{#1}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
+ \fi% \ifx\test@i\@gt
+ \fi% \ifx\test@i\@lt
+ \fi% \ifx\test@i\@doublequote
+ \fi% \ifx\test@i\@rsinglequote%
+ \fi% \ifx\test@i\@lsinglequote%
+ \fi% \ifx\test@i\@othertilde%
+ \fi% \ifx\test@i\@otherbackslash%
+ \fi% \ifx\test@i\@otherdollar%
+ \fi% \ifx\test@i\@otherlbrace%
+ \fi% \ifx\test@i\@@htmlize@stop
\htmlize@next@i
}%
@@ -1658,16 +2551,38 @@
\edef\inlinemathleftdelim{\otherbackslash(}%
\def\inlinemathrightdelim#1{\advancemathmodecounter{-1}%
\g@addto@macro\htmlize@output{\otherbackslash)}}%
-\edef\displaymathleftdelim{<CENTER>\otherbackslash[}%
+\edef\displaymathleftdelim{\otherbackslash[}%
\def\displaymathrightdelim#1{\advancemathmodecounter{-1}%
- \g@addto@macro\htmlize@output{\otherbackslash]</CENTER>}}%
+ \g@addto@macro\htmlize@output{\otherbackslash]}}%
+\long\def\htmlize@inlinemath@recursive@i#1#2#3\htmlize@rdelim@i{%
+ % inspired by \htmlize@recursive@i
+ \def\test@i{#1}%
+ \ifx\test@i\@@htmlize@stop
+ \let\htmlize@next@i=\relax
+ \else
+ \ifx\test@i\@otherbackslash
+ \g@addto@macro\mathtext{#1#2}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#3\htmlize@rdelim@i}%
+ \else
+ \ifx\test@i\@otherdollar
+ \let\htmlize@next@i=\relax
+ \g@addto@macro\aftertext{#2#3}%
+ \else
+ \g@addto@macro\mathtext{#1}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#2#3\htmlize@rdelim@i}%
+ \fi
+ \fi
+ \fi
+ \htmlize@next@i
+}
{\catcode`\$=12\relax%
- \gdef\htmlize@inlinemathshift@replace$#1$#2\htmlize@rdelim@iii{%
+ \gdef\htmlize@inlinemathshift@replace#1#2\htmlize@rdelim@iii{%
%\def\ds{inline math shift has '#1' and '#2'}\show\ds
\xa\g@addto@macro\xa\htmlize@output\xa{\inlinemathleftdelim}%
\advancemathmodecounter{1}%
- \def\mathtext{#1}%
- \def\aftertext{#2}%
+ \gdef\mathtext{}%
+ \gdef\aftertext{}%
+ \htmlize@inlinemath@recursive@i#2\htmlize@rdelim@i%
\xdef\htmlize@remaining@text{\expandonce\mathtext%
\otherbackslash inlinemathrightdelim{}%
\expandonce\aftertext}%
@@ -1683,6 +2598,7 @@
\expandonce\aftertext}%
}%
}
+
\long\def\htmlize@do@actionenv#1#2\@htmlize@stop\htmlize@actionsequence@rdelim{%
\bgroup %The corresponding \egroup is given in \htmlize@proceedwiththerest,
%to localize the changes to the environment definitions.
@@ -1760,11 +2676,41 @@
\xa\g@addto@macro\xa\htmlize@activate@css\xa{\htmlize@scrap}%
\xa\def\csname html@\string#1\endcsname% %And this \def\html@\oldcsname is follows by the remainder of the definition.
}
+\def\html@action@newcommand#1[#2][#3]#4{%
+ %\message{>>> Defining #1[#2][#3]{...} ^^J}
+ \ifmoodle@draftmode
+ \else
+ \xa\html@action@def\csname #1\endcsname{\csname moodle@#1@int\endcsname}%
+ \fi
+ % Note that \htmlize@do@actioncs will 'patch' this by putting
+ % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
+ % at the end. We want those 3 tokens to occur instead after
+ % the graphics filename.
+ \xa\csdef{moodle@#1@int}##1##2##3{\csname moodle@#1@int@int\endcsname}%
+ % This gobbles up those three spurious tokens,
+ % which we will re-insert after our work is done.
+ \xa\newcommand\csname moodle@#1@int@int\endcsname[#2][#3]{%
+ #4%
+ % Now we re-insert the code to get the HTMLizing going again.
+ \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
+ }%
+}
\def\htmlize@redefine@expansionmacros{}%
\long\def\htmlize@record@expand#1{%
\xa\listadd\xa\htmlize@cs@expandlist\xa{\string#1}%
}
\let\htmlregister=\htmlize@record@expand
+\def\moodleregisternewcommands{%
+ %% INSPIRED FROM
+ %https://tex.stackexchange.com/questions/73271/how-to-redefine-or-patch-the-newcommand-command
+ \newcommand*{\saved@ifdefinable}{}
+ \let\saved@ifdefinable\@ifdefinable
+ \renewcommand{\@ifdefinable}[2]{%
+ \saved@ifdefinable{##1}{##2}%
+ \htmlregister{##1}
+ }%
+ \let\@@ifdefinable\@ifdefinable
+}%
\long\def\html@def#1{%
\htmlize@record@expand{#1}%
\xa\def\xa\htmlize@scrap\xa{\xa\let\xa#1\csname html@\string#1\endcsname}%
@@ -1779,27 +2725,64 @@
\htmlize@record@environment{shortanswer}
\html@newenvironment{center}{\xdef\htmlize@afteraction@hook{<CENTER>\expandonce\BODY</CENTER>}}%
-\html@newenvironment{enumerate}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<OL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</OL>}%
-}%
-\html@newenvironment{itemize}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<UL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</UL>}%
+
+\def\moodle@save@getitems@state{%
+ \global\xa\xdef\csname moodle@currentitemnumber@level@\the\moodle@listdepth\xa\endcsname\xa{\thecurrentitemnumber}%
+ \global\xa\xdef\csname moodle@numgathereditems@level@\the\moodle@listdepth\xa\endcsname\xa{\thenumgathereditems}%
+ \moodle@saveitems{\thenumgathereditems}%
+}%
+\def\moodle@restore@getitems@state{%
+ \setcounter{numgathereditems}{\csname moodle@numgathereditems@level@\the\moodle@listdepth\endcsname}%
+ \setcounter{currentitemnumber}{\csname moodle@currentitemnumber@level@\the\moodle@listdepth\endcsname}%
+ \moodle@restoreitems{\thenumgathereditems}%
+}%
+\def\moodle@saveitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{moodle@level@\the\moodle@listdepth @item@#1}{getitems@item@#1}%
+ \xa\moodle@saveitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
+}%
+\def\moodle@restoreitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{getitems@item@#1}{moodle@level@\the\moodle@listdepth @item@#1}%
+ \global\xa\let\csname moodle@level@\the\moodle@listdepth @item@#1\endcsname=\@undefined
+ \xa\moodle@restoreitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
+}%
+\def\moodle@makelistenv#1#2{%
+ \html@newenvironment{#1}{%
+ \advance\moodle@listdepth by 1\relax
+ \moodle@save@getitems@state%
+ \xa\gatheritems\xa{\BODY}%
+ \gdef\htmlize@afteraction@hook{<#2>}%
+ \loopthroughitemswithcommand{\moodle@itemtoLI}%
+ \g@addto@macro\htmlize@afteraction@hook{</#2>}%
+ \moodle@restore@getitems@state%
+ \advance\moodle@listdepth by -1\relax
+ }%
}%
+
+\moodle@makelistenv{enumerate}{OL}%
+\moodle@makelistenv{itemize}{UL}%
+
\def\moodle@itemtoLI#1{%
- \g@addto@macro\htmlize@afteraction@hook{<LI>#1</LI>}%
+ \g@addto@macro\htmlize@afteraction@hook{<LI>#1}%
+ \trim@spaces@in\htmlize@afteraction@hook%
+ \g@addto@macro\htmlize@afteraction@hook{</LI>}%
}%
\def\advancemathmodecounter#1{%
\global\advance\moodle@mathmodedepth by #1\relax
}
+\def\openclozemode{%
+ \global\moodle@clozemodetrue\relax
+}
+\def\endclozemode{%
+ \global\moodle@clozemodefalse\relax
+}
\htmlize@record@action{\advancemathmodecounter}%
-
+\htmlize@record@action{\openclozemode}%
+\htmlize@record@action{\endclozemode}%
\htmlize@record@action{\relax}%
\html@action@def\#{\g@addto@macro\htmlize@output{\otherhash}}%
@@ -1812,15 +2795,32 @@
}%
\html@action@def\}{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherrbrace}}%
- {\g@addto@macro\htmlize@output{\otherrbrace}}%
+ {\ifmoodle@clozemode\g@addto@macro\htmlize@output{\otherbackslash}\fi
+ \g@addto@macro\htmlize@output{\otherrbrace}}%
+ }%
+\html@action@def\[{%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash\otherlbracket}%
+ }%
+\html@action@def\]{%
+ \g@addto@macro\htmlize@output{\otherbackslash\otherrbracket}%
+ \advancemathmodecounter{-1}
+ }%
+\html@action@def\({%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash(}%
+ }%
+\html@action@def\){%
+ \g@addto@macro\htmlize@output{\otherbackslash)}%
+ \advancemathmodecounter{-1}
}%
\html@action@def\ldots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\ldots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\dots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\dots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\ {%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherspace}}%
@@ -1829,10 +2829,25 @@
\html@action@def\${%
\g@addto@macro\htmlize@output{\otherdollar}%
}%
-
\html@action@def\clozetilde{%
\xa\g@addto@macro\xa\htmlize@output\xa{\othertilde}%
}%
+\html@action@def\clozelbrace{%
+ \openclozemode
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherlbrace}%
+ }%
+\html@action@def\clozerbrace{%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherrbrace}%
+ \endclozemode
+ }%
+\html@action@def\TeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash TeX\otherbackslash)}
+ }%
+\html@action@def\LaTeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash LaTeX\otherbackslash)}
+ }%
+
+{\catcode`;=12\relax\gdef\othersemicol{;}}
{\catcode`|=3\relax
\gdef\htmlize@vowels{a|e|i|o|u|A|E|I|O|U|}}
@@ -1841,31 +2856,38 @@
\g@addto@macro\htmlize@activate@css{%
\def#1##1{%
\ifinlist{##1}{\htmlize@vowels}%
- {\g@addto@macro\htmlize@output{\otherampersand##1#2;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand##1#2\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string#1##1}}%
}%
}%
}
\htmlize@define@diacritic{\^}{circ}%
\htmlize@define@diacritic{\'}{acute}%
-\htmlize@define@diacritic{\"}{uml}%
\htmlize@define@diacritic{\`}{grave}%
+{\catcode`|=3\relax
+ \gdef\htmlize@diaeresis{a|e|i|o|u|y|A|E|I|O|U|Y|}}
+\html@action@def\"#1{%
+ \ifinlist{#1}{\htmlize@diaeresis}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1uml\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\"#1}}%
+}%
+
\def\@o{o}\def\@O{O}\def\@u{u}\def\@U{U}%
\html@action@def\H#1{%
\bgroup
\def\test@i{#1}%
\ifx\test@i\@O
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash336\othersemicol}%
\else
\ifx\test@i\@o
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash337\othersemicol}%
\else
- \ifx\test@i\U
- \def\toadd{\otherampersand\otherhash368;}%
+ \ifx\test@i\@U
+ \def\toadd{\otherampersand\otherhash368\othersemicol}%
\else
- \ifx\test@i\u
- \def\toadd{\otherampersand\otherhash369;}%
+ \ifx\test@i\@u
+ \def\toadd{\otherampersand\otherhash369\othersemicol}%
\else
\def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
\fi
@@ -1876,37 +2898,234 @@
\egroup
}%
+\def\@c{c}\def\@C{C}\def\@s{s}\def\@S{S}\def\@t{t}\def\@T{T}%
+\html@action@def\c#1{%
+\bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@c
+ \def\toadd{\otherampersand ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@C
+ \def\toadd{\otherampersand Ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@s
+ \def\toadd{\otherampersand\otherhash351\othersemicol}%
+ \else
+ \ifx\test@i\@S
+ \def\toadd{\otherampersand\otherhash350\othersemicol}%
+ \else
+ \ifx\test@i\@t
+ \def\toadd{\otherampersand\otherhash355\othersemicol}%
+ \else
+ \ifx\test@i\@T
+ \def\toadd{\otherampersand\otherhash354\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+\egroup
+}%
+
{\catcode`|=3\relax
\gdef\htmlize@tilde{A|N|O|a|n|o|}}
\html@action@def\~#1{%
\ifinlist{#1}{\htmlize@tilde}%
- {\g@addto@macro\htmlize@output{\otherampersand#1tilde;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1tilde\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string\~#1}}%
- }%
-\html@def\underline#1{<SPAN STYLE="text-decoration: underline;">#1</SPAN>}
+}%
+
+{\catcode`|=3\relax
+ \gdef\htmlize@breve{A|G|U|a|g|u|}}
+\def\@e{e}\def\@E{E}\def\@i{i}\def\@ii{\i}\def\@I{I}\def\@o{o}\def\@O{O}%
+\html@action@def\u#1{%
+ \ifinlist{#1}{\htmlize@breve}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1breve\othersemicol}}%
+ {
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@E
+ \def\toadd{\otherampersand\otherhash276\othersemicol}%
+ \else
+ \ifx\test@i\@e
+ \def\toadd{\otherampersand\otherhash277\othersemicol}%
+ \else
+ \ifx\test@i\@I
+ \def\toadd{\otherampersand\otherhash300\othersemicol}%
+ \else
+ \ifx\test@i\@i
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@ii
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@O
+ \def\toadd{\otherampersand\otherhash334\othersemicol}%
+ \else
+ \ifx\test@i\@o
+ \def\toadd{\otherampersand\otherhash335\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+ }%
+}%
+
+{\catcode`|=3\relax
+ \gdef\htmlize@caron{C|D|E|L|N|R|S|T|Z|c|d|e|l|n|r|s|t|z|}}
+\html@action@def\v#1{%
+ \ifinlist{#1}{\htmlize@caron}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1caron\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\v#1}}%
+}%
+\html@def\underline#1{<SPAN STYLE=\&\#34;text-decoration: underline;\&\#34;>#1</SPAN>}
\html@def\emph#1{<EM>#1</EM>}%
+\html@def\textit#1{<I>#1</I>}%
\html@def\textbf#1{<B>#1</B>}%
+\html@def\texttt#1{<CODE>#1</CODE>}%
+\html@def\textsc#1{<SPAN STYLE=\&\#34;font-variant: small-caps;\&\#34;>#1</SPAN>}
+\html@def\url#1{<A href=\&\#34;#1\&\#34;>#1</A>}%
+\html@def\href#1#2{<A href=\&\#34;#1\&\#34;>#2</A>}%
+\html@def\textsuperscript#1{<SUP>#1</SUP>}%
+\html@def\up#1{<SUP>#1</SUP>}%
+\html@def\fup#1{<SUP>#1</SUP>}%
+\html@def\textsubscript#1{<SUB>#1</SUB>}%
\html@def\blank{____________}%
\html@def\par{</P><P>}%
\html@def\aa{\&aring;}%
\html@def\AA{\&Aring;}%
\html@def\ae{\&aelig;}%
\html@def\AE{\&AElig;}%
+\html@def\oe{\&oelig;}%
+\html@def\OE{\&OElig;}%
\html@def\S{\&sect;}%
\html@def\euro{\&euro;}%
\html@def\texteuro{\&euro;}%
\html@def\o{\&oslash;}%
\html@def\O{\&Oslash;}%
\html@def\ss{\&szlig;}%
+\html@def\SS{\&\#7838;}%
\html@def\l{\&lstrok;}%
\html@def\L{\&Lstrok;}%
+\html@def\og{\&laquo;\&\#8239;}%
+\html@def\guillemotleft{\&laquo;\&\#8239;}%
+\html@def\fg{\&\#8239;\&raquo;}%
+\html@def\guillemotright{\&\#8239;\&raquo;}%
+\html@def\,{\&\#8239;}%
+\html@def\thinspace{\&\#8239;}%
+\html@def\textbackslash{\&\#92;}%
+\html@def\_{\&\#95;}%
+\html@def\textquestiondown{\&iquest;}%
+\html@def\textexclamdown{\&iexcl;}%
-\htmlize@record@expand{\inv}%
-\htmlize@record@expand{\rec}%
\htmlize@record@action\inlinemathrightdelim
\htmlize@record@action\displaymathrightdelim
+\def\moodle@media@find#1{%
+ \ifx\detokenize\@undefined\else
+ \edef\Gin@extensions{\detokenize\expandafter{\Gin@extensions}}%
+ \fi
+ \begingroup
+ \let\input@path\Ginput@path
+ \set@curr@file{#1}%
+ \expandafter\filename@parse\expandafter{\@curr@file}%
+ \ifx\filename@ext\Gin@gzext
+ \expandafter\filename@parse\expandafter{\filename@base}%
+ \ifx\filename@ext\relax
+ \let\filename@ext\Gin@gzext
+ \else
+ \edef\Gin@ext{\Gin@ext\Gin@sepdefault\Gin@gzext}%
+ \fi
+ \fi
+ \ifx\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \else
+ \Gin@getbase{\Gin@sepdefault\filename@ext}%
+ \ifnum0%
+ \ifx\Gin@ext\relax 1%
+ \else \@ifundefined{Gin@rule@\Gin@ext}{1}{0}%
+ \fi >0
+ \let\Gin@ext\relax
+ \let\Gin@savedbase\filename@base
+ \let\Gin@savedext\filename@ext
+ \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
+ \let\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \ifx\Gin@ext\relax
+ \let\filename@base\Gin@savedbase
+ \let\filename@ext\Gin@savedext
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@warning{File `#1' not found}%
+ \def\Gin@base{\filename@area\filename@base}%
+ \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@latex@error{File `#1' not found}%
+ {I could not locate the file with any of these extensions:^^J%
+ \Gin@extensions^^J\@ehc}%
+ \else
+ % begin modified part
+ \xdef\moodle@media@base{\detokenize\xa{\Gin@base}}%
+ \xdef\moodle@media@ext{\detokenize\xa{\Gin@ext}}%
+ % end modfied part
+ \fi
+ \endgroup
+}
+\def\moodle@media@formats{}
+\newcommand{\DeclareMediaFormat}[3]{%
+ \xdef\moodle@media@formats{\ifx\moodle@media@formats\empty\else\moodle@media@formats,\fi#1}%
+ \csgdef{moodle@media@#1list}{#2}%
+ \csgdef{moodle@media@#1mime}{#3}%
+}%
+\DeclareMediaFormat{PNG}{.png,.PNG}{image/png}%
+\DeclareMediaFormat{JPEG}{.jpg,.JPG,.jpeg,.JPEG}{image/jpeg}%
+\DeclareMediaFormat{SVG}{.svg,.SVG}{image/svg+xml}%
+\DeclareMediaFormat{GIF}{.gif}{image/gif}%
+\DeclareMediaFormat{WAV}{.wav,.WAV}{audio/wave}%
+\DeclareMediaFormat{MP3}{.mp3,.MP3}{audio/mpeg}%
+\DeclareMediaFormat{OGG}{.ogg,.opus,.og&}{audio/ogg}%
+\DeclareMediaFormat{WEBM}{.webm,.webm}{video/webm}%
+\DeclareMediaFormat{MP4}{.mp4,.MP4,.m4v,.M4V}{video/mp4}%
+\DeclareMediaFormat{OGV}{.ogv,.OGV}{video/ogg}%
+\def\moodle@media@mime@identify#1{%
+ \edef\test@i{\detokenize\xa{#1}}%
+ \let\moodle@media@mime@current\relax
+ \edef\moodle@media@formats{\detokenize\xa{\moodle@media@formats}}%
+ \@for\@format:=\moodle@media@formats\do{%
+ \edef\@templist{\csname moodle@media@\@format list\endcsname}%
+ \@for\@ext:=\@templist\do{%
+ \ifx\moodle@media@mime@current\relax
+ \edef\@ext{\detokenize\xa{\@ext}}%
+ \ifx\test@i\@ext
+ \message{<<extension \@ext (\@format) identified>>^^J}%
+ \xdef\moodle@media@mime@current{\csname moodle@media@\@format mime\endcsname}%
+ \xdef\moodle@media@ext@current{#1}%
+ \fi
+ \fi
+ }%
+ }%
+}
\def\htmlize@setexecutable#1{%
% Defines macro #1 to be #2 in a verbatim mode suitable for filenames
\def\htmlize@executable@macro{#1}%
@@ -1918,18 +3137,55 @@
\expandafter\def\htmlize@executable@macro{#1}%
}
-\def\ghostscriptcommand{\htmlize@setexecutable\gs}
-\def\opensslcommand{\htmlize@setexecutable\openssl}
-\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}
+\def\ghostscriptcommand{\htmlize@setexecutable\gs}%
+\def\baselxivcommand{\htmlize@setexecutable\baselxiv}%
+\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}%
+\def\optipngcommand{\htmlize@setexecutable\optipng}%
+\def\PDFtoSVGcommand{\htmlize@setexecutable\PDFtoSVG}%
+\def\SVGtoPDFcommand{\htmlize@setexecutable\SVGtoPDF}%
+\def\optiSVGcommand{\htmlize@setexecutable\optiSVG}%
+\def\DeleteFilecommand{\htmlize@setexecutable\DeleteFiles}%
\ifwindows%
- \ghostscriptcommand{gswin64c.exe}%
+ \ghostscriptcommand{gswin64c.exe -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{certutil}%
+ \DeleteFilecommand{del}%
\else%
- \ghostscriptcommand{gs}%
+ \ghostscriptcommand{gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{base64}%
+ \DeleteFilecommand{rm -f}%
\fi%
-\opensslcommand{openssl}%
-\imagemagickcommand{convert}%
+\imagemagickcommand{convert -colorspace RGB}%
+\optipngcommand{optipng -clobber -strip all -quiet}%
+\PDFtoSVGcommand{inkscape --export-type=svg --export-area-page --vacuum-defs}%--pdf-poppler
+\SVGtoPDFcommand{inkscape --export-type=pdf --export-area-page}%
+\optiSVGcommand{scour -q --enable-id-stripping --enable-comment-stripping
+ --shorten-ids --indent=none --remove-descriptive-elements}%
+\AtEndPreamble{%
+ \@ifpackageloaded{graphicx}{%
+ \def\@firstofthree#1#2#3{#1}%
+ \def\@secondofthree#1#2#3{#2}%
+ \newcommand{\DeclareGraphicsAlien}[3]{%
+ \edef\Gin@extensions{\Gin@extensions,#1}%
+ \DeclareGraphicsRule{#1}{\@gobble#1}{#1}{}%
+ \csdef{Gread@\@gobble#1}##1{%
+ \edef\SourceFile{\Gin@base\Gin@ext}%
+ \edef\Gin@base{\Gin@base-\@gobble#1-converted-to}%
+ \edef\Gin@ext{#2}%
+ \edef\OutputFile{\Gin@base\Gin@ext}%
+ \edef\targetfmt{\expandafter\expandafter\expandafter
+ \@firstofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \edef\targetext{\expandafter\expandafter\expandafter
+ \@secondofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \IfFileExists{\OutputFile}{}{\ShellEscape{#3}}%
+ \csletcs{Ginclude@\@gobble#1}{Ginclude@\targetfmt}%
+ \csname Gread@\targetfmt\endcsname{\Gin@base\targetext}%
+ }%
+ }%
+ \DeclareGraphicsAlien{.gif}{.png}{\htmlize@imagemagick@convert\otherspace '\SourceFile[0]' \OutputFile}%
+ }{}%
+}%
\define@cmdkeys{moodle@includegraphics}[moodle@graphics@]{ppi}
\define@cmdkey{moodle}[moodle@graphics@]{ppi}{}% This is so the ppi key can be set at the document, quiz, or question level.
\define@cmdkeys{Gin}{ppi}% This is so the original \includegraphics will not object to a key of ppi.
@@ -1952,24 +3208,45 @@
\moodle@graphics@dimentopixels{\moodle@graphics@width@pixels}{#1}%
}
\setkeys{moodle@includegraphics}{height=0pt,width=0pt}
-\html@action@def\includegraphics{\moodle@includegraphics@int}%
- % Note that \htmlize@do@actioncs will 'patch' this by putting
- % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
- % at the end. We want those 3 tokens to occur instead after
- % the graphics filename.
-\def\moodle@includegraphics@int#1#2#3{\moodle@includegraphics@int@int}%
- % This gobbles up those three spurious tokens,
- % which we will re-insert after our work is done.
-\newcommand\moodle@includegraphics@int@int[2][]{%
+\ifmoodle@svg
+ \AtEndPreamble{%
+ \DeclareGraphicsAlien{.svg}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ \DeclareGraphicsAlien{.SVG}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ }%
+\fi
+
+\ifmoodle@tikz
+\AfterEndPreamble{%
+ %\htmlize@record@expand{\embedaspict}%
+ \let\oldincludegraphics=\includegraphics
+ % patching includegraphics to trigger externalization
+ \renewcommand{\includegraphics}[2][]{%
+ %\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML^^J}%
+ \tikz{\node[inner sep=0pt]{\oldincludegraphics[#1]{#2}};}%
+ }%
+ % externalized images must be included with the regular command
+ \pgfkeys{/pgf/images/include external/.code={\oldincludegraphics{#1}}}%
+ \html@action@newcommand{includegraphics}[2][]{%
+ \message{moodle.sty: Processing \string\includegraphics[#1]{#2} ^^J}
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
+}%
+\else
+\html@action@newcommand{includegraphics}[2][]{%
\bgroup% The grouping is to localize the changes caused by \setkeys.
\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML...^^J}
\setkeys*{moodle@includegraphics}{#1}%
% Height or width should be given in TeX dimensions like cm or pt or in,
% and are converted to pixels for web use using the ppi key.
- % TO DO: Can we modify \includegraphics to accept height or width in
+ % TODO: Can we modify \includegraphics to accept height or width in
% pixels?
- % TO DO: What about \includegraphics[scale=0.7] ?
+ % TODO: What about \includegraphics[scale=0.7] ?
% Other keys: keepaspectratio=true|false, angle (rotation), clip & trim
+ % -> the package option 'tikz' offers a workaround for this
\ifnum\moodle@graphics@height@pixels=0\relax
\ifnum\moodle@graphics@width@pixels=0\relax
% No size specified. Default to height of 200 pixels.
@@ -1991,28 +3268,86 @@
\edef\moodle@graphics@htmlgeometry{width=\number\moodle@graphics@width@pixels\otherspace height=\number\moodle@graphics@height@pixels}%
\fi
\fi
- %First, convert it to PNG
- \edef\cmdline{\htmlize@imagemagick@convert\otherspace #2 -resize \moodle@graphics@geometry\otherspace #2.png}%
- \message{moodle.sty: Converting '#2' to PNG...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
- %Next, convert the PNG to base64 encoding
- \def\cmdline{\openssl\otherspace enc -base64 -in #2.png -out #2.enc}%
- \message{moodle.sty: Converting '#2.png' to base64...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
+ %Look for the file, even if no extension is provided
+ \moodle@media@find{#2}%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+ \moodle@media@mime@identify{\moodle@media@ext}%
+ \ifx\moodle@media@mime@current\relax
+ % conversion needed
+ \edef\moodle@media@pdf{\detokenize{.pdf}}%
+ \edef\moodle@media@ext{\detokenize\xa{\moodle@media@ext}}%
+ \ifnum0\ifx\moodle@media@ext\moodle@media@pdf1\fi\ifmoodle@svg1\fi=11% PDF file and SVG option active
+ \def\moodle@media@ext@current{.svg}%
+ \edef\moodle@media@mime@current{\moodle@media@SVGmime}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@media@base\moodle@media@ext" -o "\moodle@media@base\moodle@media@ext@current" 2>/dev/null}%
+ \message{moodle.sty: Converting '#2' to SVG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ %Next, optimize inline
+ \ifwindows\else
+ \edef\cmdline{\optiSVG < "\moodle@media@base\moodle@media@ext@current" >
+ "\moodle@media@base.tmp.svg" && mv "\moodle@media@base.tmp.svg"
+ "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \fi
+ \else% call ImageMagick
+ \def\moodle@media@ext@current{.png}%
+ \def\moodle@media@mime@current{image/png}%
+ \edef\cmdline{\htmlize@imagemagick@convert\otherspace "\moodle@media@base\moodle@media@ext" -resize \moodle@graphics@geometry\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Converting '#2' to PNG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ %Next, optimize inline
+ \edef\cmdline{\optipng\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \fi
+ \fi
+ %Next, convert the file to base64 encoding
+ \ConvertToBaseLXIV{\moodle@media@base}{\moodle@media@ext@current}%
%Now, save that base64 encoding in a TeX macro
\def\moodle@newpic@baselxiv{}%
- \message{moodle.sty: Reading base64 file '#2.enc'...^^J}%
- \openin\baseLXIVdatafile=#2.enc\relax
+ \message{moodle.sty: Reading base64 file '\moodle@media@base.enc'...^^J}%
+ \openin\baseLXIVdatafile="\moodle@media@base.enc"
\savebaselxivdata@recursive
\closein\baseLXIVdatafile
+ %Clean up files
+ \ifx\moodle@media@ext@current\moodle@media@ext
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc"}%
+ \else
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc" "\moodle@media@base\moodle@media@ext@current"}%
+ \fi
\xa\global\xa\let\csname picbaselxiv@graphics@#2\endcsname=\moodle@newpic@baselxiv%
- \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:image/png;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
+ \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:\moodle@media@mime@current;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
\message{moodle.sty: <IMG> tag inserted.^^J}%
\egroup
- % Now we re-insert the code to get the HTMLizing going again.
- \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
-}
+}%
+\fi
+\ifwindows
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace -encode "#1#2"\otherspace tmp.b64 && findstr /vbc:"---" tmp.b64 > "#1" && del tmp.b64"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ % Starting from Windows 7, CertUtil is included by default. There should be no windows XP still running
+ }%
+\else
+ \ifmacosx
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace -b 64 -i "#1#2"\otherspace -o "#1.enc"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ }%
+ \else % Linux, Cygwin
+ \def\ConvertToBaseLXIV#1#2{%
+ \def\cmdline{\baselxiv\otherspace "#1#2"\otherspace > "#1.enc"}%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ }%
+ % base64 is part of coreutils, add "-w 64" to get exactly the previous behavior %
+ \fi
+\fi
\newread\baseLXIVdatafile
\def\savebaselxivdata@recursive{%
\ifeof\baseLXIVdatafile
@@ -2030,31 +3365,54 @@
\fi
\baselxiv@next
}
-\newif\ifmoodle@tikzloaded
-\moodle@tikzloadedfalse
\AtBeginDocument{
\ifx\tikzpicture\@undefined
\moodle@tikzloadedfalse
\else
\moodle@tikzloadedtrue
\fi
+ \ifmoodle@draftmode
+ \long\def\tikzifexternalizing#1#2{#2}%
+ \else
\ifmoodle@tikzloaded
- \usetikzlibrary{external}
+ \usetikzlibrary{external}%
\tikzexternalize%
\tikzset{external/force remake}%
-
- \ifpdf
- \def\pdftopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\moodle@basename{\tikzexternalrealjob-tikztemp-\the\numconvertedpictures}%
+ \ifmoodle@svg
+ \def\TikzExportExtension{.svg}%
+ \def\TikzExportMIME{image/svg+xml}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.pdf" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}}%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.ps" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}}%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.svg'...^^J}%
+ \edef\cmdline{\optiSVG\otherspace < "\moodle@basename\TikzExportExtension" >
+ "\moodle@basename.tmp.svg" && mv "\moodle@basename.tmp.svg"
+ "\moodle@basename\TikzExportExtension" }%
+ \xa\ShellEscape\xa{\cmdline}}%
\else
- \def\pstopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.ps}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\TikzExportExtension{.png}%
+ \def\TikzExportMIME{image/png}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \moodle@basename.pdf}%
+ \xa\ShellEscape\xa{\gscmdline}}%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \\moodle@basename.ps}%
+ \xa\ShellEscape\xa{\gscmdline}}%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.png'...^^J}%
+ \edef\cmdline{\optipng\otherspace \moodle@basename\TikzExportExtension}%
+ \xa\ShellEscape\xa{\cmdline}}%
\fi
- \def\pngtobaselxiv{\edef\opensslcmdline{\openssl\otherspace enc -base64 -in \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -out \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc}%
- \expandafter\immediate\expandafter\write18\expandafter{\opensslcmdline}}%
-
\let\moodle@oldtikzpicture=\tikzpicture
-
%The following code lets us run things *before* the normal \begin{tikzpicture}.
\renewenvironment{tikzpicture}{%
\global\advance\numconvertedpictures by 1\relax
@@ -2066,43 +3424,52 @@
% However, the tikz externalize library does *not* run \end{tikzpicture}.
% In order to run commands after the tikz picture is done compiling, we need to
% use a hook into \tikzexternal@closeenvironments.
-
\g@addto@macro{\tikzexternal@closeenvironments}{%
\moodle@endtikzpicture@hook
}
\def\moodle@endtikzpicture@hook{%
\@moodle@ifgeneratexml{%
- \ifpdf
- \message{moodle.sty: Converting picture '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf' to PNG...^^J}%
- \pdftopng
- \else
- \pstopng
- \fi
- \message{moodle.sty: Converting '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png' to base64...^^J}%
- \pngtobaselxiv
+ \ExportTikz
+ \OptimizeExport
+ \ConvertToBaseLXIV{\moodle@basename}{\TikzExportExtension}%
\message{moodle.sty: Reading base64 file '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc'...^^J}%
\savebaselxivdata
\message{moodle.sty: base64 data saved.^^J}%
}{}%
}
- \tikzset{external/optimize=true}
- \tikzset{external/optimize command away={\VerbatimInput}{1}}
+ \ifmoodle@tikz
+ \tikzset{external/optimize=false}% due to redefinition, includegraphics must not be optimized away
+ \else
+ \tikzset{external/optimize=true}%
+ \tikzset{external/optimize command away={\VerbatimInput}{1}}%
+ \fi
%
% The HTMLizer version of the tikzpicture environment,
% which writes an <IMG> tag to the XML file.
- \htmlize@record@environment{tikzpicture}
+ \htmlize@record@environment{tikzpicture}%
\g@addto@macro\htmlize@activate@environments{%
\let\tikzpicture\relax\let\endtikzpicture\relax
\NewEnviron{tikzpicture}[1][]{%
\global\advance\numpicturesread by 1\relax
- \edef\htmlize@imagetag{<IMG SRC="data:image/png;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
}[\htmlize@patchendenvironment]%
}%
+ \html@action@newcommand{tikz}[2][]{%
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
\else
%TikZ not loaded. Provide dummy definitions for commands.
\long\def\tikzifexternalizing#1#2{#2}%
\fi
+ \fi
+ \ifmoodle@tikz
+ \tikzstyle{moodlepict}=[minimum height=1em,inner sep=0pt,execute at begin node={\begin{varwidth}{\linewidth}},execute at end node={\end{varwidth}}]
+ \newcommand\embedaspict[1]{\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax]{\node[moodlepict]{\mbox{#1}};}}
+ \htmlize@record@expand{\embedaspict}
+ \fi
}
\newcount\numconvertedpictures
@@ -2118,19 +3485,356 @@
\xa\global\xa\let\csname picbaselxiv@\the\numconvertedpictures\endcsname=\moodle@newpic@baselxiv%
}
-\def\@moodle@par{\par}%
-\AtEndDocument{%
+\ifmoodle@tikz
+ \ifmoodle@tikzloaded
+ \PackageWarning{moodle}{With package option 'tikz', you should not load TikZ manually.}%
+ \fi
+ \RequirePackage{tikz}%
+ \RequirePackage{varwidth}% for the command |embedaspict|
+\fi
+\AfterEndDocument{%
\ifmoodle@tikzloaded
\@moodle@ifgeneratexml{%
- \ifwindows
- \immediate\write18{del \tikzexternalrealjob-tikztemp-*.*}%
+ \ifXeTeX
+ % we must keep picture pdf's for subsequent linking (xdvipdfmx)
+ \ifwindows
+ \ShellEscape{powershell.exe -noexit "del * -include \tikzexternalrealjob-tikztemp-*.* -exclude *.pdf}%
+ \else
+ \ShellEscape{find . -type f -name "\tikzexternalrealjob-tikztemp-*.*" -not -name "*.pdf" -delete}%
+ \fi
\else
- \immediate\write18{rm \tikzexternalrealjob-tikztemp-*.*}%
+ \ShellEscape{\DeleteFiles\otherspace \tikzexternalrealjob-tikztemp-*.*}%
\fi
}{}%
\fi
}
+\AtEndPreamble{%
+ \@ifpackageloaded{hyperref}{%
+ \let\oldhref\href
+ \let\oldurl\url
+ \def\moodle@hyper@readexternallink#1#2#3#4:#5:#6\\#7{%
+ \def\filename@ext{}%
+ \def\filename@area{}%
+ \def\filename@base{}%
+ \ifx\\#6\\% if ##6 is empty (the URL contains no column -> no scheme -> local)
+ %\@hyper@linkfile file:#7\\{#3}{#2}{#7}% local file
+ %Local file (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\\#4\\%if ##4 is empty (no scheme was specified -> local file)
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \def\@pdftempa{#4}%
+ \ifx\@pdftempa\@pdftempwordfile% scheme is "file:"
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\@pdftempa\@pdftempwordrun% scheme is "run:"
+ \ifHy@pdfa
+ \Hy@Error{%
+ PDF/A: Launch action is prohibited%
+ }\@ehc
+ \begingroup
+ \leavevmode
+ \endgroup
+ \else% not in PDF/A mode -> run is allowed
+ %\@hyper@launch#7\\{#3}{#2}% run local file
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \fi
+ \else% scheme is neither "file" nor "run", assuming it is a web protocol
+ %\hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}% URL
+ \filename@parse{#7}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \xdef\moodle@media@ext{.\filename@ext}%
+ \xdef\moodle@media@base{\filename@area\filename@base}%
+ }%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+ %\edef\moodle@media@mime@current{\detokenize\xa{\moodle@media@mime@current}}%
+ }{}%
+}%
+\def\xmlDisplayVerbatimBox{border-top: thin solid; border-bottom: thin solid}%
+\html@action@def\verbatiminput#1{%
+ \message{moodle.sty: Processing \string\verbatiminput{#1} for HTML ^^J}%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%%%%%%%% from verbatim %%%%%%%%%%%%%%%%%
+ \@bsphack
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{\xa\g@addto@macro\xa\htmlize@output\xa{\the\verbatim@line<BR/>}}
+ \verbatim@readfile{#1}%
+ \@esphack
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+\@ifpackageloaded{minted}{\PackageError{moodle}{'moodle' should be loaded before 'minted'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fvextra}{\PackageError{moodle}{'moodle' should be loaded before 'fvextra'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fancyvrb}{\PackageError{moodle}{'moodle' should be loaded before 'fancyvrb'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+
+\html@action@newcommand{VerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\VerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{LVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\LVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{BVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\BVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\def\moodle@VerbatimInput#1{%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%% using material from fancyvrb and fvextra %%%%%%%%
+ %\begingroup
+ \def\moodle@verbatim@addlinenumber##1{%
+ \g@addto@macro\htmlize@output{<span style="font-size: 80\otherpercent;
+ background-color: \otherhash f0f0f0; padding: 0 5px 0 5px; display:
+ inline-block; width: 16pt; ##1">}%
+ \if@FV@NumberBlankLines
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \else
+ \ifx\FV@Line\empty
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherampersand nbsp;</span>}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \fi
+ \fi
+ }
+ % redefine the ProcessLine routine ('fancyvrb' and 'fvextra') for XML output
+ \def\FV@ProcessLine##1{%
+ \ifcsname FV@HighlightLine:\number\c@FancyVerbLine\endcsname
+ \xdef\moodle@FV@tagB{<mark>}% fvextra triggered highlighting for this line
+ \xdef\moodle@FV@tagE{</mark>}%
+ \else
+ \xdef\moodle@FV@tagB{}% no highlighting
+ \xdef\moodle@FV@tagE{}%
+ \fi
+ \catcode`\`=12%
+ \def\FV@Line{##1}%
+ \ifx\FV@LeftListNumber\relax
+ \else% line numbers displayed on the left side
+ \moodle@verbatim@addlinenumber{text-align: right}%
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagB}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\FV@Line}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagE}%
+ \ifx\FV@RightListNumber\relax\else% line numbers on the right side
+ \moodle@verbatim@addlinenumber{text-align: left; float: right}%
+ \fi
+ \g@addto@macro\htmlize@output{<BR/>}%linebreak
+ }
+ \global\FV@CodeLineNo\z@% reset codeline counter
+ \frenchspacing% Cancels special punctuation spacing.
+ \FV@DefineWhiteSpace
+ \def\FV@Space{\space}
+ \FV@DefineTabOut% replace tabs with a series a whitespaces
+ \ifdefined\FV@HighlightLinesPrep
+ \FV@HighlightLinesPrep% prepare highlighting if 'fvextra' is loaded
+ \fi
+ \FV@Input{#1}%
+ %\endgroup
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+\AtEndPreamble{%
+ \@ifpackageloaded{fancyvrb}{%
+ % custom settings for display
+ \fvset{frame=lines,label={[Beginning of code]End of code},framesep=3mm,numbersep=9pt}%
+ }{\relax}%
+}
+\AtEndPreamble{% this definition should prevail because `minted' gets loaded after `moodle'
+\@ifpackageloaded{minted}{%
+ \newcounter{moodle@pygmentizecounter}%
+ \renewcommand{\minted@pygmentize}[2][\minted@outputdir\minted@jobname.pyg]{%
+ \minted@checkstyle{\minted@get@opt{style}{default}}%
+ \stepcounter{minted@pygmentizecounter}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\def\minted@codefile{\minted@outputdir\minted@jobname.pyg}}%
+ {\def\minted@codefile{#1}}%
+ \ifthenelse{\boolean{minted@isinline}}%
+ {\def\minted@optlistcl@inlines{%
+ \minted@optlistcl@g@i
+ \csname minted@optlistcl@lang\minted@lang @i\endcsname}}%
+ {\let\minted@optlistcl@inlines\@empty}%
+ \def\minted@cmdtemplate##1##2{%
+ \ifminted@kpsewhich
+ \ifwindows
+ \detokenize{for /f "usebackq tokens=*"}\space\@percentchar\detokenize{a
+ in (`kpsewhich}\space\minted@codefile\detokenize{`) do}\space
+ \fi
+ \fi
+ \MintedPygmentize\space -l #2 -f ##1 -F tokenmerge
+ \minted@optlistcl@g \csname minted@optlistcl@lang\minted@lang\endcsname
+ \minted@optlistcl@inlines
+ \minted@optlistcl@cmd -o \minted@outputdir##2\space
+ \ifminted@kpsewhich
+ \ifwindows
+ \@percentchar\detokenize{a}%
+ \else
+ \detokenize{`}kpsewhich \minted@codefile\space
+ \detokenize{||} \minted@codefile\detokenize{`}%
+ \fi
+ \else
+ \minted@codefile
+ \fi}%
+ \def\minted@cmd{\minted@cmdtemplate{latex -P commandprefix=PYG}{\minted@infile}}
+ % For debugging, uncomment: %%%%
+ \immediate\typeout{\minted@cmd}%
+ % %%%%
+ \def\minted@cmdHTML{\minted@cmdtemplate{html -P noclasses -P
+ nowrap -P hl_lines="\FV@HighlightLinesList" -P
+ style="\minted@get@opt{style}{default}"}{\csname minted@infileHTML\the\c@minted@pygmentizecounter\endcsname}}%
+ \def\minted@cmdPNG{\minted@cmdtemplate{png -P
+ line_numbers=True}{\minted@infilePNG}}%
+ \def\minted@cmdSVG{\minted@cmdtemplate{svg -P
+ linenos=True}{\minted@infileSVG}}%
+ \ifthenelse{\boolean{minted@cache}}%
+ {%
+ \ifminted@frozencache
+ \else
+ \ifx\XeTeXinterchartoks\minted@undefined
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd}}}%
+ \else
+ \ifx\mdfivesum\minted@undefined
+ \immediate\openout\minted@code\minted@jobname.mintedcmd\relax
+ \immediate\write\minted@code{\minted@cmd}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\immediate\write\minted@code{autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}{}%
+ \immediate\closeout\minted@code
+ \edef\minted@argone@esc{#1}%
+ \StrSubstitute{\minted@argone@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@argone@esc]%
+ \StrSubstitute{\minted@argone@esc}{"}{\@backslashchar"}[\minted@argone@esc]%
+ \edef\minted@tmpfname@esc{\minted@outputdir\minted@jobname}%
+ \StrSubstitute{\minted@tmpfname@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@tmpfname@esc]%
+ \StrSubstitute{\minted@tmpfname@esc}{"}{\@backslashchar"}[\minted@tmpfname@esc]%
+ %Cheating a little here by using ASCII codes to write `{` and `}`
+ %in the Python code
+ \def\minted@hashcmd{%
+ \detokenize{python -c "import hashlib; import os;
+ hasher = hashlib.sha1();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedcmd\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@argone@esc\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedmd5\detokenize{\")),
+ \"w\");
+ macro = \"\\edef\\minted@hash\" + chr(123) + hasher.hexdigest()
+ + chr(125) + \"\";
+ f.write(\"\\makeatletter\" + macro +
+ \"\\makeatother\\endinput\n\");
+ f.close();"}}%
+ \ShellEscape{\minted@hashcmd}%
+ \minted@input{\minted@outputdir\minted@jobname.mintedmd5}%
+ \else
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd}}}%
+ \fi
+ \fi
+ \edef\minted@infile{\minted@cachedir/\minted@hash.pygtex}%
+ \edef\minted@temp@infileHTML{\minted@cachedir/\minted@hash.html}%
+ \global\cslet{minted@infileHTML\the\c@minted@pygmentizecounter}{\minted@temp@infileHTML}%
+ %\global\edef\minted@infilePNG{\minted@cachedir/\minted@hash.png}%
+ %\global\edef\minted@infileSVG{\minted@cachedir/\minted@hash.svg}%
+ \IfFileExists{\minted@infile}{}{%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ }%
+ \fi
+ \ifthenelse{\boolean{minted@finalizecache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@actualinfile{\minted@cachedir/\minted@cachefilename}%
+ \ifwindows
+ \StrSubstitute{\minted@infile}{/}{\@backslashchar}[\minted@infile@windows]
+ \StrSubstitute{\minted@actualinfile}{/}{\@backslashchar}[\minted@actualinfile@windows]
+ \ShellEscape{move /y
+ \minted@outputdir\minted@infile@windows\space\minted@outputdir\minted@actualinfile@windows}%
+ \else
+ \ShellEscape{mv -f
+ \minted@outputdir\minted@infile\space\minted@outputdir\minted@actualinfile}%
+ \fi
+ \let\minted@infile\minted@actualinfile
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}%
+ }%
+ {\ifthenelse{\boolean{minted@frozencache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@infile{\minted@cachedir/\minted@cachefilename}%
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}}%
+ {\expandafter\minted@addcachefile\expandafter{\minted@hash.pygtex}}%
+ }%
+ \minted@inputpyg}%
+ {%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ \minted@inputpyg}%
+ }%
+}{}%
+}%
+\html@action@newcommand{inputminted}[3][]{%
+ \message{moodle.sty: Processing \string\inputminted[#1]{#2}{#3} for HTML ^^J}%
+ % arguments #2 and #3 are thrown away: the job is done previously by minted when
+ % calling pygmentize. The file |\minted@infileHTML| generated with our hack will be used.
+ % Since minted is based upon `fvextra' the macro |\moodle@VerbatimInput| works here.
+ \minted@configlang{#2}% grab options set for this specific language
+ \setkeys{minted@opt@cmd}{#1}% grab options in #1
+ \minted@fvset% import options
+ \stepcounter{moodle@pygmentizecounter}
+ \xa\moodle@VerbatimInput\xa{\csname minted@infileHTML\the\c@moodle@pygmentizecounter\endcsname}%
+}%
+\AtBeginDocument{%
+ \ifPDFTeX % pdflatex or latex
+ \@ifpackagewith{babel}{french}{%
+ \PackageWarning{moodle}{Be careful when using LaTeX, moodle, and the babel package with option 'french'. Autospacing produces in undesired symbols in the XML. You can either 1) compile with xelatex/lualatex or 2) add '\NoAutoSpacing' after '\begin{quiz}'.}%
+ }{\relax}%
+ \fi
+}%
\endinput
%%
%% End of file `moodle.sty'.