MathML: let the user change the MathML version.

Discussed in https://www.lyx.org/trac/ticket/13058.
This commit is contained in:
Thibaut Cuvelier 2024-10-01 23:53:30 +02:00
parent df1ba8ee59
commit 7feffb89e9
15 changed files with 604 additions and 432 deletions

View File

@ -7,6 +7,11 @@ changes happened in particular if possible. A good example would be
----------------------- -----------------------
2024-09-29 Thibaut Cuvelier <tcuvelier@lyx.org>
* Format incremented to 631: Add support for MathML versions, which
are stored separately for DocBook and XHTML (\docbook_mathml_version,
which is new, and \html_math_output, which receives a new value).
2024-08-25 Jürgen Spitzmüller <spitz@lyx.org> 2024-08-25 Jürgen Spitzmüller <spitz@lyx.org>
* Format incremented to 630: Add support for a number of languages in * Format incremented to 630: Add support for a number of languages in
babel and polyglossia: babel and polyglossia:

View File

@ -1015,6 +1015,48 @@ def revert_new_babel_languages(document):
if document.language == "hebrew" or find_token(document.body, "\\lang oldrussian", 0) != -1: if document.language == "hebrew" or find_token(document.body, "\\lang oldrussian", 0) != -1:
add_to_preamble(document, ["\\PassOptionsToPackage{provide*=*}{babel}"]) add_to_preamble(document, ["\\PassOptionsToPackage{provide*=*}{babel}"])
def convert_mathml_version(document):
"""Add MathML version header for DocBook to use MathML 3 preferably.
For cleanliness, add this header close to other DocBook headers if present.
Leave XHTML alone, as the default value is still probably what the user wants (MathML Core)."""
i = find_token(document.header, "\\docbook", 0)
if i == -1:
document.header += ["\\docbook_mathml_version 0"]
else:
document.header.insert(i + 1, "\\docbook_mathml_version 0")
def revert_mathml_version(document):
"""Remove MathML version header.
For XHTML, only remove the value 4 for \html_math_output (MathML 3) and replace it with 0
(MathML Core with format 631+, MathML for 630-).
For DocBook, totally remove the header (the default with 630- is MathML)."""
while True:
i = find_token(document.header, "\\html_math_output", 0)
if i == -1:
# nothing to do
break
# remove XHTML header if using the new value, leave alone otherwise.
if "4" in document.header:
document.header[i] = "\\html_math_output 0"
while True:
i = find_token(document.header, "\\docbook_mathml_version", 0)
if i == -1:
# nothing to do
return
# remove header
del document.header[i]
## ##
# Conversion hub # Conversion hub
# #
@ -1030,11 +1072,13 @@ convert = [
[627, [convert_nomencl, convert_index_sc]], [627, [convert_nomencl, convert_index_sc]],
[628, []], [628, []],
[629, []], [629, []],
[630, []] [630, []],
[631, [convert_mathml_version]]
] ]
revert = [ revert = [
[630, [revert_mathml_version]],
[629, [revert_new_polyglossia_languages, revert_new_babel_languages]], [629, [revert_new_polyglossia_languages, revert_new_babel_languages]],
[628, [revert_langopts]], [628, [revert_langopts]],
[627, [revert_nomentbl]], [627, [revert_nomentbl]],

View File

@ -4472,8 +4472,11 @@ void Buffer::setMathFlavor(OutputParams & op) const
// In particular, this function has no impact on the DocBook code, as it // In particular, this function has no impact on the DocBook code, as it
// uses another mechanism to handle math flavours. // uses another mechanism to handle math flavours.
switch (params().html_math_output) { switch (params().html_math_output) {
case BufferParams::MathML: case BufferParams::MathMLCore:
op.math_flavor = OutputParams::MathAsMathML; op.math_flavor = OutputParams::MathAsMathMLCore;
break;
case BufferParams::MathML3:
op.math_flavor = OutputParams::MathAsMathML3;
break; break;
case BufferParams::HTML: case BufferParams::HTML:
op.math_flavor = OutputParams::MathAsHTML; op.math_flavor = OutputParams::MathAsHTML;

View File

@ -480,11 +480,12 @@ BufferParams::BufferParams()
// default index // default index
indiceslist().addDefault(B_("Index")); indiceslist().addDefault(B_("Index"));
html_be_strict = false; html_be_strict = false;
html_math_output = MathML; html_math_output = MathMLCore;
html_math_img_scale = 1.0; html_math_img_scale = 1.0;
html_css_as_file = false; html_css_as_file = false;
docbook_table_output = HTMLTable; docbook_table_output = HTMLTable;
docbook_mathml_prefix = MPrefix; docbook_mathml_prefix = MPrefix;
docbook_mathml_version = MathMLStream::mathml3;
display_pixel_ratio = 1.0; display_pixel_ratio = 1.0;
shell_escape = false; shell_escape = false;
@ -1226,6 +1227,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
int temp; int temp;
lex >> temp; lex >> temp;
docbook_mathml_prefix = static_cast<MathMLNameSpacePrefix>(temp); docbook_mathml_prefix = static_cast<MathMLNameSpacePrefix>(temp);
} else if (token == "\\docbook_mathml_version") {
int temp;
lex >> temp;
docbook_mathml_version = static_cast<MathMLStream::MathMLVersion>(temp);
} else if (token == "\\output_sync") { } else if (token == "\\output_sync") {
lex >> output_sync; lex >> output_sync;
} else if (token == "\\output_sync_macro") { } else if (token == "\\output_sync_macro") {
@ -1621,6 +1626,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
os << "\\docbook_table_output " << docbook_table_output << '\n'; os << "\\docbook_table_output " << docbook_table_output << '\n';
os << "\\docbook_mathml_prefix " << docbook_mathml_prefix << '\n'; os << "\\docbook_mathml_prefix " << docbook_mathml_prefix << '\n';
os << "\\docbook_mathml_version " << docbook_mathml_version << '\n';
if (html_math_img_scale != 1.0) if (html_math_img_scale != 1.0)
os << "\\html_math_img_scale " << convert<string>(html_math_img_scale) << '\n'; os << "\\html_math_img_scale " << convert<string>(html_math_img_scale) << '\n';

View File

@ -28,6 +28,8 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include "mathed/MathStream.h"
namespace lyx { namespace lyx {
namespace support { namespace support {
@ -587,7 +589,8 @@ public:
// do not change these values. we rely upon them. // do not change these values. we rely upon them.
enum MathOutput { enum MathOutput {
MathML = 0, MathMLCore = 0,
MathML3 = 4,
HTML = 1, HTML = 1,
Images = 2, Images = 2,
LaTeX = 3 LaTeX = 3
@ -625,6 +628,9 @@ public:
/// what prefix to use when outputting MathML. present choices are above /// what prefix to use when outputting MathML. present choices are above
MathMLNameSpacePrefix docbook_mathml_prefix; MathMLNameSpacePrefix docbook_mathml_prefix;
/// what version of MathML to use for DocBook output (likely different from the version used for XHTML)
MathMLStream::MathMLVersion docbook_mathml_version;
/// allow the LaTeX backend to run external programs /// allow the LaTeX backend to run external programs
bool shell_escape; bool shell_escape;
/// generate output usable for reverse/forward search /// generate output usable for reverse/forward search

View File

@ -658,7 +658,7 @@ void putClipboard(ParagraphList const & paragraphs,
// We don't want to produce images that are not used. Therefore, // We don't want to produce images that are not used. Therefore,
// output formulas as MathML. Even if this is not understood by all // output formulas as MathML. Even if this is not understood by all
// applications, the number that can parse it should go up in the future. // applications, the number that can parse it should go up in the future.
buffer->params().html_math_output = BufferParams::MathML; buffer->params().html_math_output = BufferParams::MathMLCore;
// Copy authors to the params. We need those pointers. // Copy authors to the params. We need those pointers.
for (Author const & a : bp.authors()) for (Author const & a : bp.authors())

View File

@ -54,7 +54,8 @@ class OutputParams {
public: public:
enum MathFlavor { enum MathFlavor {
NotApplicable, NotApplicable,
MathAsMathML, MathAsMathMLCore,
MathAsMathML3,
MathAsHTML, MathAsHTML,
MathAsImages, MathAsImages,
MathAsLaTeX MathAsLaTeX

View File

@ -952,6 +952,8 @@ GuiDocument::GuiDocument(GuiView & lv)
this, SLOT(change_adaptor())); this, SLOT(change_adaptor()));
connect(outputModule->mathmlprefixCB, SIGNAL(currentIndexChanged(int)), connect(outputModule->mathmlprefixCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(change_adaptor())); this, SLOT(change_adaptor()));
connect(outputModule->mathmlverCB, SIGNAL(currentIndexChanged(int)),
this, SLOT(change_adaptor()));
connect(outputModule->shellescapeCB, SIGNAL(stateChanged(int)), connect(outputModule->shellescapeCB, SIGNAL(stateChanged(int)),
this, SLOT(shellescapeChanged())); this, SLOT(shellescapeChanged()));
@ -4076,6 +4078,12 @@ void GuiDocument::applyView()
auto const mp = static_cast<BufferParams::MathMLNameSpacePrefix>(mathmlprefix); auto const mp = static_cast<BufferParams::MathMLNameSpacePrefix>(mathmlprefix);
bp_.docbook_mathml_prefix = mp; bp_.docbook_mathml_prefix = mp;
int mathmlversion = outputModule->mathmlverCB->currentIndex();
if (mathmlversion == -1)
mathmlversion = 0;
auto const mv = static_cast<MathMLStream::MathMLVersion>(mathmlversion);
bp_.docbook_mathml_version = mv;
bp_.save_transient_properties = bp_.save_transient_properties =
outputModule->saveTransientPropertiesCB->isChecked(); outputModule->saveTransientPropertiesCB->isChecked();
bp_.postpone_fragile_content = bp_.postpone_fragile_content =

View File

@ -6,17 +6,15 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>702</width> <width>579</width>
<height>501</height> <height>465</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0"> <item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="savingGB"> <widget class="QGroupBox" name="savingGB">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@ -47,7 +45,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item row="1" column="0">
<widget class="QGroupBox" name="outputFormatGB"> <widget class="QGroupBox" name="outputFormatGB">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@ -117,7 +115,7 @@
<item> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@ -132,7 +130,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item> <item row="2" column="0">
<widget class="QGroupBox" name="outputOptionsGB"> <widget class="QGroupBox" name="outputOptionsGB">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed"> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@ -143,7 +141,438 @@
<property name="title"> <property name="title">
<string>Output Options</string> <string>Output Options</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>&amp;LaTeX</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<widget class="QCheckBox" name="postponeFragileCB">
<property name="toolTip">
<string>If this is checked, fragile items such as labels and index entries are moved out of moving arguments such as sections and captions. This prevents LaTeX errors that can happen in such cases. It is recommended to keep this on.</string>
</property>
<property name="text">
<string>Put fra&amp;gile content out of moving arguments</string>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="outputsyncCB">
<property name="toolTip">
<string>Enable forward/reverse search between editor and output (e.g., SyncTeX)</string>
</property>
<property name="text">
<string>S&amp;ynchronize with output</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="synccustomLA">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>C&amp;ustom macro:</string>
</property>
<property name="buddy">
<cstring>synccustomCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="synccustomCB">
<property name="toolTip">
<string>Custom LaTeX preamble macro</string>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>&amp;XHTML</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="mathoutLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;Math output:</string>
</property>
<property name="buddy">
<cstring>mathmlverCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mathoutCB">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Format to use for math output.</string>
</property>
<item>
<property name="text">
<string>MathML Core (default)</string>
</property>
</item>
<item>
<property name="text">
<string>MathML 3</string>
</property>
</item>
<item>
<property name="text">
<string>HTML</string>
</property>
</item>
<item>
<property name="text">
<string>Images</string>
</property>
</item>
<item>
<property name="text">
<string>LaTeX</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="strictCB">
<property name="toolTip">
<string>Whether to comply strictly with XHTML 1.1.</string>
</property>
<property name="text">
<string>&amp;Strict XHTML 1.1</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cssCB">
<property name="text">
<string>Write CSS to file</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>&amp;DocBook</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4"> <layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="tableoutLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;Table output:</string>
</property>
<property name="buddy">
<cstring>mathmlverCB</cstring>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QComboBox" name="tableoutCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Format to use for math output.</string>
</property>
<item>
<property name="text">
<string>HTML</string>
</property>
</item>
<item>
<property name="text">
<string>CALS</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>320</width>
<height>38</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="mathmlverLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>MathML &amp;version:</string>
</property>
<property name="buddy">
<cstring>mathmlverCB</cstring>
</property>
</widget>
</item>
<item row="2" column="2" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QComboBox" name="mathmlverCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Format to use for math output.</string>
</property>
<item>
<property name="text">
<string>MathML 3 (default)</string>
</property>
</item>
<item>
<property name="text">
<string>MathML Core</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="mathmlprefixLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;MathML namespace prefix:</string>
</property>
<property name="buddy">
<cstring>mathmlprefixCB</cstring>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="mathmlprefixCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Namespace prefix to use for MathML formulae. For instance, with the &lt;code&gt;m&lt;/code&gt; prefix, the MathML tags will be output like &lt;code&gt;m:math&lt;/code&gt;.</string>
</property>
<item>
<property name="text">
<string>No prefix (namespace defined inline for each tag)</string>
</property>
</item>
<item>
<property name="text">
<string>m (default)</string>
</property>
</item>
<item>
<property name="text">
<string>mml</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
@ -191,211 +620,7 @@
<item> <item>
<spacer name="horizontalSpacer_7"> <spacer name="horizontalSpacer_7">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>&amp;LaTeX</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<widget class="QCheckBox" name="postponeFragileCB">
<property name="toolTip">
<string>If this is checked, fragile items such as labels and index entries are moved out of moving arguments such as sections and captions. This prevents LaTeX errors that can happen in such cases. It is recommended to keep this on.</string>
</property>
<property name="text">
<string>Put fra&amp;gile content out of moving arguments</string>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="outputsyncCB">
<property name="toolTip">
<string>Enable forward/reverse search between editor and output (e.g., SyncTeX)</string>
</property>
<property name="text">
<string>S&amp;ynchronize with output</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="synccustomLA">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>C&amp;ustom macro:</string>
</property>
<property name="buddy">
<cstring>synccustomCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="synccustomCB">
<property name="toolTip">
<string>Custom LaTeX preamble macro</string>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>&amp;XHTML</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="strictCB">
<property name="toolTip">
<string>Whether to comply strictly with XHTML 1.1.</string>
</property>
<property name="text">
<string>&amp;Strict XHTML 1.1</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="cssCB">
<property name="text">
<string>Write CSS to file</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_8">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="mathoutLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;Math output:</string>
</property>
<property name="buddy">
<cstring>tableoutCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mathoutCB">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Format to use for math output.</string>
</property>
<item>
<property name="text">
<string>MathML</string>
</property>
</item>
<item>
<property name="text">
<string>HTML</string>
</property>
</item>
<item>
<property name="text">
<string>Images</string>
</property>
</item>
<item>
<property name="text">
<string>LaTeX</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
@ -409,144 +634,8 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>&amp;DocBook</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="tableoutLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;Table output:</string>
</property>
<property name="buddy">
<cstring>tableoutCB</cstring>
</property>
</widget>
</item> </item>
<item> <item row="3" column="0">
<widget class="QComboBox" name="tableoutCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Format to use for math output.</string>
</property>
<item>
<property name="text">
<string>HTML</string>
</property>
</item>
<item>
<property name="text">
<string>CALS</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_5">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>178</width>
<height>38</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QLabel" name="mathmlprefixLA">
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>&amp;MathML namespace prefix:</string>
</property>
<property name="buddy">
<cstring>mathmlprefixCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mathmlprefixCB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<bold>false</bold>
</font>
</property>
<property name="toolTip">
<string>Namespace prefix to use for MathML formulae. For instance, with the &lt;code&gt;m&lt;/code&gt; prefix, the MathML tags will be output like &lt;code&gt;m:math&lt;/code&gt;.</string>
</property>
<item>
<property name="text">
<string>No prefix (namespace defined inline for each tag)</string>
</property>
</item>
<item>
<property name="text">
<string>m (default)</string>
</property>
</item>
<item>
<property name="text">
<string>mml</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>148</width>
<height>28</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="shellescapeCB"> <widget class="QCheckBox" name="shellescapeCB">
<property name="toolTip"> <property name="toolTip">
<string>Runs the LaTeX backend with the -shell-escape option (Warning: use only when really necessary)</string> <string>Runs the LaTeX backend with the -shell-escape option (Warning: use only when really necessary)</string>
@ -556,15 +645,13 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item row="4" column="0">
</item>
<item row="1" column="0">
<spacer name="verticalSpacer_4"> <spacer name="verticalSpacer_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Orientation::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeType"> <property name="sizeType">
<enum>QSizePolicy::Policy::Expanding</enum> <enum>QSizePolicy::Expanding</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>

View File

@ -119,7 +119,8 @@ void InsetMathBox::validate(LaTeXFeatures & features) const
// FIXME XHTML // FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present // It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts. // InsetLayouts do not seem really to work for things that aren't InsetTexts.
if (features.runparams().math_flavor == OutputParams::MathAsMathML) if (features.runparams().math_flavor == OutputParams::MathAsMathMLCore ||
features.runparams().math_flavor == OutputParams::MathAsMathML3)
features.addCSSSnippet("mtext.mathbox { font-style: normal; }"); features.addCSSSnippet("mtext.mathbox { font-style: normal; }");
else if (features.runparams().math_flavor == OutputParams::MathAsHTML) else if (features.runparams().math_flavor == OutputParams::MathAsHTML)
features.addCSSSnippet("span.mathbox { font-style: normal; }"); features.addCSSSnippet("span.mathbox { font-style: normal; }");
@ -204,7 +205,8 @@ void InsetMathFBox::validate(LaTeXFeatures & features) const
// FIXME XHTML // FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present // It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts. // InsetLayouts do not seem really to work for things that aren't InsetTexts.
if (features.runparams().math_flavor == OutputParams::MathAsMathML) if (features.runparams().math_flavor == OutputParams::MathAsMathMLCore ||
features.runparams().math_flavor == OutputParams::MathAsMathML3)
features.addCSSSnippet( features.addCSSSnippet(
"mtext.fbox { border: 1px solid black; font-style: normal; padding: 0.5ex; }"); "mtext.fbox { border: 1px solid black; font-style: normal; padding: 0.5ex; }");
else if (features.runparams().math_flavor == OutputParams::MathAsHTML) else if (features.runparams().math_flavor == OutputParams::MathAsHTML)
@ -343,7 +345,8 @@ void InsetMathMakebox::validate(LaTeXFeatures & features) const
// FIXME XHTML // FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present // It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts. // InsetLayouts do not seem really to work for things that aren't InsetTexts.
if (features.runparams().math_flavor == OutputParams::MathAsMathML) if (features.runparams().math_flavor == OutputParams::MathAsMathMLCore ||
features.runparams().math_flavor == OutputParams::MathAsMathML3)
features.addCSSSnippet("mtext.framebox { border: 1px solid black; }"); features.addCSSSnippet("mtext.framebox { border: 1px solid black; }");
else if (features.runparams().math_flavor == OutputParams::MathAsHTML) else if (features.runparams().math_flavor == OutputParams::MathAsHTML)
features.addCSSSnippet("span.framebox { border: 1px solid black; }"); features.addCSSSnippet("span.framebox { border: 1px solid black; }");
@ -423,7 +426,8 @@ void InsetMathBoxed::validate(LaTeXFeatures & features) const
// FIXME XHTML // FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present // It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts. // InsetLayouts do not seem really to work for things that aren't InsetTexts.
if (features.runparams().math_flavor == OutputParams::MathAsMathML) if (features.runparams().math_flavor == OutputParams::MathAsMathMLCore ||
features.runparams().math_flavor == OutputParams::MathAsMathML3)
features.addCSSSnippet("mtext.boxed { border: 1px solid black; }"); features.addCSSSnippet("mtext.boxed { border: 1px solid black; }");
else if (features.runparams().math_flavor == OutputParams::MathAsHTML) else if (features.runparams().math_flavor == OutputParams::MathAsHTML)
features.addCSSSnippet("span.boxed { border: 1px solid black; }"); features.addCSSSnippet("span.boxed { border: 1px solid black; }");

View File

@ -98,7 +98,8 @@ void InsetMathEnsureMath::validate(LaTeXFeatures & features) const
// FIXME XHTML // FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present // It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts. // InsetLayouts do not seem really to work for things that aren't InsetTexts.
if (features.runparams().math_flavor == OutputParams::MathAsMathML) if (features.runparams().math_flavor == OutputParams::MathAsMathMLCore ||
features.runparams().math_flavor == OutputParams::MathAsMathML3)
features.addCSSSnippet("mstyle.math { font-style: italic; }"); features.addCSSSnippet("mstyle.math { font-style: italic; }");
else if (features.runparams().math_flavor == OutputParams::MathAsHTML) else if (features.runparams().math_flavor == OutputParams::MathAsHTML)
features.addCSSSnippet("span.mathbox { font-style: italic; }"); features.addCSSSnippet("span.mathbox { font-style: italic; }");

View File

@ -2655,9 +2655,13 @@ docstring InsetMathHull::xhtml(XMLStream & xs, OutputParams const & op) const
} }
// FIXME Eventually we would like to do this inset by inset. // FIXME Eventually we would like to do this inset by inset.
if (mathtype == BufferParams::MathML) { if (mathtype == BufferParams::MathML3 || mathtype == BufferParams::MathMLCore) {
MathMLStream::MathMLVersion mathml_version = MathMLStream::mathmlCore;
if (mathtype == BufferParams::MathML3)
mathml_version = MathMLStream::mathml3;
odocstringstream os; odocstringstream os;
MathMLStream ms(os, "", MathMLStream::mathmlCore); MathMLStream ms(os, "", mathml_version);
try { try {
mathmlize(ms); mathmlize(ms);
success = true; success = true;

View File

@ -562,6 +562,7 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
h_html_math_output = "0"; h_html_math_output = "0";
h_docbook_table_output = "0"; h_docbook_table_output = "0";
h_docbook_mathml_prefix = "1"; h_docbook_mathml_prefix = "1";
h_docbook_mathml_version = "0";
h_index[0] = "Index"; h_index[0] = "Index";
h_index_command = "default"; h_index_command = "default";
h_inputencoding = "auto-legacy"; h_inputencoding = "auto-legacy";
@ -2168,6 +2169,7 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled
<< "\\html_be_strict " << h_html_be_strict << "\n" << "\\html_be_strict " << h_html_be_strict << "\n"
<< "\\docbook_table_output " << h_docbook_table_output << "\n" << "\\docbook_table_output " << h_docbook_table_output << "\n"
<< "\\docbook_mathml_prefix " << h_docbook_mathml_prefix << "\n" << "\\docbook_mathml_prefix " << h_docbook_mathml_prefix << "\n"
<< "\\docbook_mathml_version " << h_docbook_mathml_version << "\n"
<< authors_ << authors_
<< "\\end_header\n\n" << "\\end_header\n\n"
<< "\\begin_body\n"; << "\\begin_body\n";

View File

@ -199,6 +199,7 @@ private:
std::string h_html_math_output; std::string h_html_math_output;
std::string h_docbook_table_output; std::string h_docbook_table_output;
std::string h_docbook_mathml_prefix; std::string h_docbook_mathml_prefix;
std::string h_docbook_mathml_version;
std::string h_index[99]; std::string h_index[99];
std::string h_index_command; std::string h_index_command;
std::string h_inputencoding; std::string h_inputencoding;

View File

@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
// Do not remove the comment below, so we get merge conflict in // Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own. // independent branches. Instead add your own.
#define LYX_FORMAT_LYX 630 // spitz: language updates #define LYX_FORMAT_LYX 631 // tcuvelier: add MathML version
#define LYX_FORMAT_TEX2LYX 630 #define LYX_FORMAT_TEX2LYX 631
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
#ifndef _MSC_VER #ifndef _MSC_VER