]> git.lyx.org Git - features.git/commitdiff
add support for the package cancel in math (fixes #6819); fileformat change only...
authorUwe Stöhr <uwestoehr@web.de>
Mon, 23 Jan 2012 01:49:49 +0000 (01:49 +0000)
committerUwe Stöhr <uwestoehr@web.de>
Mon, 23 Jan 2012 01:49:49 +0000 (01:49 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40663 a592a061-630c-0410-9148-cb99ea01b6c8

15 files changed:
development/scons/scons_manifest.py
lib/chkconfig.ltx
lib/lyx2lyx/lyx_2_1.py
src/LaTeXFeatures.cpp
src/Makefile.am
src/insets/Inset.cpp
src/insets/InsetCode.h
src/mathed/InsetMathCancel.cpp [new file with mode: 0644]
src/mathed/InsetMathCancel.h [new file with mode: 0644]
src/mathed/InsetMathCancelto.cpp [new file with mode: 0644]
src/mathed/InsetMathCancelto.h [new file with mode: 0644]
src/mathed/InsetMathNest.cpp
src/mathed/MathFactory.cpp
src/mathed/MathParser.cpp
src/version.h

index 6b974af8fdf9dcb60a6fe5181de563a4cbd09ff0..e0cafa8528240e72eb5d03f23cddd07640d8be15 100644 (file)
@@ -87,6 +87,7 @@ src_header_files = Split('''
     KeySequence.h
     LaTeX.h
     LaTeXFeatures.h
+    LaTeXPackages.h
     Language.h
     Layout.h
     LayoutEnums.h
@@ -189,6 +190,7 @@ src_pre_files = Split('''
     KeySequence.cpp
     LaTeX.cpp
     LaTeXFeatures.cpp
+    LaTeXPackages.cpp
     Language.cpp
     Layout.cpp
     LayoutFile.cpp
@@ -445,6 +447,8 @@ src_mathed_header_files = Split('''
     InsetMathBoldSymbol.h
     InsetMathBox.h
     InsetMathBrace.h
+    InsetMathCancel.h
+    InsetMathCancelto.h
     InsetMathCases.h
     InsetMathChar.h
     InsetMathColor.h
@@ -518,6 +522,8 @@ src_mathed_files = Split('''
     InsetMathBoldSymbol.cpp
     InsetMathBox.cpp
     InsetMathBrace.cpp
+    InsetMathCancel.cpp
+    InsetMathCancelto.cpp
     InsetMathCases.cpp
     InsetMathChar.cpp
     InsetMathColor.cpp
@@ -614,26 +620,36 @@ src_tex2lyx_files = Split('''
 
 src_tex2lyx_copied_header_files = Split('''
     TextClass.h
+    graphics/GraphicsParams.h
+    graphics/GraphicsTypes.h
+    insets/ExternalTemplate.h
+    insets/ExternalTransforms.h
     insets/InsetLayout.h
 ''')
 
 
 src_tex2lyx_copied_files = Split('''
+    Author.cpp
     Color.cpp
     Counters.cpp
     Encoding.cpp
     FloatList.cpp
     Floating.cpp
     FontInfo.cpp
+    LaTeXPackages.cpp
     Layout.cpp
     LayoutFile.cpp
     LayoutModuleList.cpp
+    Length.cpp
     lengthcommon.cpp
     Lexer.cpp
     ModuleList.cpp
     Spacing.cpp
     TextClass.cpp
     version.cpp
+    graphics/GraphicsParams.cpp
+    insets/ExternalTemplate.cpp
+    insets/ExternalTransforms.cpp
     insets/InsetLayout.cpp
 ''')
 
@@ -1354,13 +1370,14 @@ lib_templates_files = Split('''
     ACM-siggraph.lyx
     ACM-sigplan.lyx
     AEA.lyx
-    agutex.lyx
-    agu_article.lyx
-    apa.lyx
+    AGUTeX.lyx
+    AGU_article.lyx
+    APA.lyx
     beamer-conference-ornate-20min.lyx
+    ctex.lyx
     de_beamer-conference-ornate-20min.lyx
     dinbrief.lyx
-    docbook_article.lyx
+    DocBook_article.lyx
     ectaart.lyx
     elsarticle.lyx
     es_beamer-conference-ornate-20min.lyx
@@ -1371,9 +1388,10 @@ lib_templates_files = Split('''
     g-brief2.lyx
     hollywood.lyx
     IEEEtran.lyx
-    ijmpc.lyx
-    ijmpd.lyx
-    iop-article.lyx
+    IJMPC.lyx
+    IJMPD.lyx
+    IOP-article.lyx
+    JASA.lyx
     JSS-article.lyx
     kluwer.lyx
     koma-letter2.lyx
@@ -2638,6 +2656,7 @@ lib_doc_fr_clipart_files = Split('''
     BoxInsetDefaultQt4.png
     ChildDocumentQt4.png
     CommentNoteImageQt4.png
+    ERT.png
     floatQt4.png
     footnoteQt4.png
     GreyedOutNoteImageQt4.png
@@ -2833,7 +2852,9 @@ lib_examples_files = Split('''
     listerrors.lyx
     Literate.lyx
     localization_test.lyx
+    longsheet.gnumeric
     modernCV.lyx
+    MultilingualCaptions.lyx
     noweb2lyx.lyx
     powerdot-example.lyx
     recipebook.lyx
@@ -2843,8 +2864,12 @@ lib_examples_files = Split('''
     serial_letter1.lyx
     serial_letter2.lyx
     serial_letter3.lyx
+    sheet1.gnumeric
+    sheet2.ods
+    sheet3.xls
     simplecv.lyx
     splash.lyx
+    spreadsheet.lyx
     sweave.lyx
     tufte-book.lyx
     tufte-handout.lyx
@@ -3086,10 +3111,14 @@ lib_layouts_files = Split('''
     article.layout
     article-beamer.layout
     beamer.layout
+    bicaption.module
     book.layout
     broadway.layout
     chess.layout
     cl2emult.layout
+    ctex-article.layout
+    ctex-book.layout
+    ctex-report.layout
     customHeadersFooters.module
     dinbrief.layout
     docbook-book.layout
@@ -3122,6 +3151,7 @@ lib_layouts_files = Split('''
     iopart.layout
     isprs.layout
     jarticle.layout
+    jasatex.layout
     jbook.layout
     jgrga.layout
     jreport.layout
@@ -3223,6 +3253,7 @@ lib_layouts_inc_files = Split('''
     theorems-ams.inc
     theorems-ams-bytype.inc
     theorems-bytype.inc
+    theorems-case.inc
     theorems-order.inc
     theorems-proof.inc
     theorems-proof-std.inc
index 2ec171f094f87297d17066ba1b5c3c3ce332d4f1..b0fd025ab8e576b3288e8e274914515bcf68fbc7 100644 (file)
 \TestPackage{breakurl}
 \TestPackage{CJKutf8}
 \TestPackage{calc}
+\TestPackage{cancel}
 \TestPackage{color} % this one should be there if graphics.sty is there.
 \TestPackage{covington}
 \TestPackage{csquotes}
index bb53d6116caca5cb8f6dc9a671c9b7da772f9b3a..0c6aa6050ac91a3196bfc0dc8c718d13a761d292 100644 (file)
@@ -450,6 +450,27 @@ def revert_cite_engine_type(document):
     document.header[i] = "\\cite_engine natbib_" + engine_type
 
 
+def revert_cancel(document):
+    "add cancel to the preamble if necessary"
+    commands = ["cancelto", "cancel", "bcancel", "xcancel"]
+    i = 0
+    while True:
+        i = find_token(document.body, '\\begin_inset Formula', i)
+        if i == -1:
+            return
+        j = find_end_of_inset(document.body, i)
+        if j == -1:
+            document.warning("Malformed LyX document: Can't find end of Formula inset at line " + str(i))
+            i += 1
+            continue
+        code = "\n".join(document.body[i:j])
+        for c in commands:
+            if code.find("\\%s" % c) != -1:
+                add_to_preamble(document, ["\\usepackage{cancel}"])
+                return
+        i = j
+
+
 ##
 # Conversion hub
 #
@@ -467,10 +488,12 @@ convert = [
            [422, [convert_use_packages]],
            [423, [convert_use_mathtools]],
            [424, [convert_cite_engine_type]],
+           [425, []]
           ]
 
 revert =  [
-           [423, [revert_cite_engine_type]],
+           [424, [revert_cancel]],
+           [423, [revert_cite_engine_type, revert_cancel]],
            [422, [revert_use_mathtools]],
            [421, [revert_use_packages]],
            [420, [revert_longtable_captions]],
@@ -478,7 +501,7 @@ revert =  [
            [418, [revert_australian]],
            [417, [revert_justification]],
            [416, [revert_japanese_encodings]],
-           [415, [revert_negative_space,revert_math_spaces]],
+           [415, [revert_negative_space, revert_math_spaces]],
            [414, [revert_undertilde]],
            [413, [revert_visible_space]]
           ]
index 6351b08092c3ccc255274843b816e6d76f32b9a4..da13ccb34785c9e7b045ce0ff88e8e4d9b6af3cf 100644 (file)
@@ -728,6 +728,9 @@ string const LaTeXFeatures::getPackages() const
                params_.use_package("undertilde") != BufferParams::package_off)
                packages << "\\usepackage{undertilde}\n";
 
+       if (mustProvide("cancel"))
+               packages << "\\usepackage{cancel}\n";
+
        // [x]color and pdfcolmk are handled in getColorOptions() above
 
        // makeidx.sty
index 81249b477d8f9767a0efd6710aad76c55cc8d6b6..84f4e85b71d97f2dfa1f736f415ffa9ae731feaf 100644 (file)
@@ -364,6 +364,7 @@ EXTRA_DIST += mathed/InsetFormulaMacro.cpp
 noinst_LIBRARIES += liblyxmathed.a
 
 SOURCEFILESMATHED = \
+       mathed/CommandInset.cpp \
        mathed/InsetMathAMSArray.cpp \
        mathed/InsetMathArray.cpp \
        mathed/InsetMathBig.cpp \
@@ -374,7 +375,6 @@ SOURCEFILESMATHED = \
        mathed/InsetMathCases.cpp \
        mathed/InsetMathChar.cpp \
        mathed/InsetMathColor.cpp \
-       mathed/CommandInset.cpp \
        mathed/InsetMathComment.cpp \
        mathed/InsetMathDecoration.cpp \
        mathed/InsetMathDecoration.h \
@@ -393,7 +393,8 @@ SOURCEFILESMATHED = \
        mathed/InsetMathKern.cpp \
        mathed/InsetMathLefteqn.cpp \
        mathed/InsetMathLim.cpp \
-       mathed/MathMacro.cpp \
+       mathed/InsetMathCancel.cpp \
+       mathed/InsetMathCancelto.cpp \
        mathed/InsetMathMatrix.cpp \
        mathed/InsetMathNest.cpp \
        mathed/InsetMathNumber.cpp \
@@ -423,6 +424,7 @@ SOURCEFILESMATHED = \
        mathed/MathData.cpp \
        mathed/MathExtern.cpp \
        mathed/MathFactory.cpp \
+       mathed/MathMacro.cpp \
        mathed/MathMacroArgument.cpp \
        mathed/MacroTable.cpp \
        mathed/MathMacroTemplate.cpp \
@@ -432,16 +434,18 @@ SOURCEFILESMATHED = \
        mathed/TextPainter.cpp
 
 HEADERFILESMATHED = \
+       mathed/CommandInset.h \
        mathed/InsetMathAMSArray.h \
        mathed/InsetMathArray.h \
        mathed/InsetMathBig.h \
        mathed/InsetMathBoldSymbol.h \
        mathed/InsetMathBox.h \
        mathed/InsetMathBrace.h \
+       mathed/InsetMathCancel.h \
+       mathed/InsetMathCancelto.h \
        mathed/InsetMathCases.h \
        mathed/InsetMathChar.h \
        mathed/InsetMathColor.h \
-       mathed/CommandInset.h \
        mathed/InsetMathComment.h \
        mathed/InsetMathDelim.h \
        mathed/InsetMathDiff.h \
@@ -459,7 +463,6 @@ HEADERFILESMATHED = \
        mathed/InsetMathKern.h \
        mathed/InsetMathLefteqn.h \
        mathed/InsetMathLim.h \
-       mathed/MathMacro.h \
        mathed/InsetMathMatrix.h \
        mathed/InsetMathNest.h \
        mathed/InsetMathNumber.h \
@@ -491,6 +494,7 @@ HEADERFILESMATHED = \
        mathed/MathExtern.h \
        mathed/MathFactory.h \
        mathed/MathGridInfo.h \
+       mathed/MathMacro.h \
        mathed/MathMacroArgument.h \
        mathed/MacroTable.h \
        mathed/MathMacroTemplate.h \
index 21ef625c7f6ae3b54d0088dbf83f1f270a623e12..c4894569abed5680bb3243cbf95f21caa07696c3 100644 (file)
@@ -123,6 +123,8 @@ static void build_translator()
        insetnames[MATH_BOLDSYMBOL_CODE] = InsetName("mathboldsymbol");
        insetnames[MATH_BOX_CODE] = InsetName("mathbox");
        insetnames[MATH_BRACE_CODE] = InsetName("mathbrace");
+       insetnames[MATH_CANCEL_CODE] = InsetName("mathcancel");
+       insetnames[MATH_CANCELTO_CODE] = InsetName("mathcancelto");
        insetnames[MATH_CASES_CODE] = InsetName("mathcases");
        insetnames[MATH_CHAR_CODE] = InsetName("mathchar");
        insetnames[MATH_COLOR_CODE] = InsetName("mathcolor");
index e05d96c62824b14bd79ac44ea432419c6b5f10c8..9bb26d18685b479a561b6df218a7ece6577545fb 100644 (file)
@@ -127,105 +127,109 @@ enum InsetCode {
        ///
        MATH_BRACE_CODE,
        ///
+       MATH_CANCEL_CODE,
+       ///
+       MATH_CANCELTO_CODE, // 55
+       ///
        MATH_CASES_CODE,
        ///
-       MATH_CHAR_CODE, // 55
+       MATH_CHAR_CODE, 
        ///
        MATH_COLOR_CODE,
        ///
        MATH_COMMENT_CODE,
        ///
-       MATH_DECORATION_CODE,
+       MATH_DECORATION_CODE, // 60
        ///
        MATH_DELIM_CODE,
        ///
-       MATH_DIFF_CODE, // 60
+       MATH_DIFF_CODE,
        ///
        MATH_DOTS_CODE,
        ///
        MATH_ENSUREMATH_CODE,
        ///
-       MATH_ENV_CODE,
+       MATH_ENV_CODE, // 65
        ///
        MATH_EXFUNC_CODE,
        ///
-       MATH_EXINT_CODE, // 65
+       MATH_EXINT_CODE,
        ///
        MATH_FONT_CODE,
        ///
        MATH_FONTOLD_CODE,
        ///
-       MATH_FRAC_CODE,
+       MATH_FRAC_CODE, // 70
        ///
        MATH_GRID_CODE,
        ///
-       MATH_HULL_CODE, // 70
+       MATH_HULL_CODE,
        ///
        MATH_KERN_CODE,
        ///
        MATH_LEFTEQN_CODE,
        ///
-       MATH_LIM_CODE,
+       MATH_LIM_CODE, // 75
        ///
        MATH_MATRIX_CODE,
        ///
-       MATH_MBOX_CODE, // 75
+       MATH_MBOX_CODE,
        ///
        MATH_NEST_CODE,
        ///
        MATH_NUMBER_CODE,
        ///
-       MATH_OVERSET_CODE,
+       MATH_OVERSET_CODE, // 80
        ///
        MATH_PAR_CODE,
        ///
-       MATH_PHANTOM_CODE, // 80
+       MATH_PHANTOM_CODE,
        ///
        MATH_REF_CODE,
        ///
        MATH_ROOT_CODE,
        ///
-       MATH_SCRIPT_CODE,
+       MATH_SCRIPT_CODE, // 85
        ///
        MATH_SIZE_CODE,
        ///
-       MATH_SPACE_CODE, // 85
+       MATH_SPACE_CODE,
        ///
        MATH_SPECIALCHAR_CODE,
        ///
        MATH_SPLIT_CODE,
        ///
-       MATH_SQRT_CODE,
+       MATH_SQRT_CODE, // 90
        ///
        MATH_STACKREL_CODE,
        ///
-       MATH_STRING_CODE,// 90
+       MATH_STRING_CODE,
        ///
        MATH_SUBSTACK_CODE,
        ///
        MATH_SYMBOL_CODE,
        ///
-       MATH_TABULAR_CODE,
+       MATH_TABULAR_CODE, // 95
        ///
        MATH_UNDERSET_CODE,
        ///
-       MATH_UNKNOWN_CODE, // 95
+       MATH_UNKNOWN_CODE,
        ///
        MATH_XARROW_CODE,
        ///
        MATH_XYARROW_CODE,
        ///
-       MATH_XYMATRIX_CODE,
+       MATH_XYMATRIX_CODE, // 100
        ///
        MATH_MACRO_CODE,
        ///
-       ARGUMENT_PROXY_CODE, // 100
+       ARGUMENT_PROXY_CODE,
        ///
        PREVIEW_CODE,
        ///
        MATH_DIAGRAM_CODE, 
        ///
-       SCRIPT_CODE,
+       SCRIPT_CODE, // 105
        ///
        INSET_CODE_SIZE
 };
diff --git a/src/mathed/InsetMathCancel.cpp b/src/mathed/InsetMathCancel.cpp
new file mode 100644 (file)
index 0000000..3010054
--- /dev/null
@@ -0,0 +1,134 @@
+/**
+ * \file InsetMathCancel.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Uwe Stöhr
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "InsetMathCancel.h"
+
+#include "LaTeXFeatures.h"
+#include "MathStream.h"
+
+#include "frontends/Painter.h"
+
+#include <ostream>
+
+namespace lyx {
+
+
+InsetMathCancel::InsetMathCancel(Buffer * buf, Kind k)
+       : InsetMathNest(buf, 1), kind_(k)
+{}
+
+
+Inset * InsetMathCancel::clone() const
+{
+       return new InsetMathCancel(*this);
+}
+
+
+void InsetMathCancel::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+       cell(0).metrics(mi, dim);
+       metricsMarkers(dim);
+}
+
+
+void InsetMathCancel::draw(PainterInfo & pi, int x, int y) const
+{
+       // We first draw the text and then an arrow
+       ColorCode const origcol = pi.base.font.color();
+       cell(0).draw(pi, x + 1, y);
+       Dimension const dim = dimension(*pi.base.bv);
+
+       // y1 \    /
+       //     \  /
+       //      \/
+       //      /\
+       //     /  \
+       // y2 /    \
+       //    x1  x2
+
+       int const x2 = x + dim.wid;
+       int const x1 = x;
+       int const y1 = y - dim.asc;
+       int const y2 = y + dim.des;
+
+       if (kind_ == cancel)
+               pi.pain.line(x2, y1, x1, y2, origcol);
+       else if (kind_ == bcancel)
+               pi.pain.line(x2, y2, x1, y1, origcol);
+       else if (kind_ == xcancel) {
+               pi.pain.line(x2, y1, x1, y2, origcol);
+               pi.pain.line(x2, y2, x1, y1, origcol);
+       }
+
+       drawMarkers(pi, x, y);
+}
+
+
+void InsetMathCancel::write(WriteStream & os) const
+{
+       MathEnsurer ensurer(os);
+       switch (kind_) {
+       case cancel:
+               os << "\\cancel{";
+               break;
+       case bcancel:
+               os << "\\bcancel{";
+               break;
+       case xcancel:
+               os << "\\xcancel{";
+               break;
+       }
+       os << cell(0) << '}';
+}
+
+
+void InsetMathCancel::normalize(NormalStream & os) const
+{
+       switch (kind_) {
+       case cancel:
+               os << "[cancel ";
+               break;
+       case bcancel:
+               os << "[bcancel ";
+               break;
+       case xcancel:
+               os << "[xcancel ";
+               break;
+       }
+       os << cell(0) << ']';
+}
+
+
+void InsetMathCancel::infoize(odocstream & os) const
+{
+       switch (kind_) {
+       case cancel:
+               os << "Cancel";
+               break;
+       case bcancel:
+               os << "Bcancel";
+               break;
+       case xcancel:
+               os << "Xcancel";
+               break;
+       }
+}
+
+void InsetMathCancel::validate(LaTeXFeatures & features) const
+{
+       InsetMathNest::validate(features);
+       if (features.runparams().isLaTeX())
+               features.require("cancel");
+       InsetMathNest::validate(features);
+}
+
+} // namespace lyx
diff --git a/src/mathed/InsetMathCancel.h b/src/mathed/InsetMathCancel.h
new file mode 100644 (file)
index 0000000..b9ca162
--- /dev/null
@@ -0,0 +1,59 @@
+// -*- C++ -*-
+/**
+ * \file InsetMathCancel.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Uwe Stöhr
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef MATH_CANCELINSET_H
+#define MATH_CANCELINSET_H
+
+#include "InsetMathNest.h"
+
+
+namespace lyx {
+
+class InsetMathCancel : public InsetMathNest {
+public:
+       ///
+       enum Kind {
+               cancel,
+               bcancel,
+               xcancel
+       };
+       ///
+       explicit InsetMathCancel(Buffer * buf, Kind);
+       ///
+       void metrics(MetricsInfo & mi, Dimension & dim) const;
+       ///
+       void draw(PainterInfo & pi, int x, int y) const;
+       ///
+       void write(WriteStream & os) const;
+       /// write normalized content
+       void normalize(NormalStream & ns) const;
+       ///
+       void infoize(odocstream & os) const;
+       ///
+       InsetCode lyxCode() const { return MATH_CANCEL_CODE; }
+       /// Nothing for now
+       void mathmlize(MathStream &) const {}
+       /// Nothing for HTML
+       void htmlize(HtmlStream &) const {}
+       ///
+       void validate(LaTeXFeatures &) const;
+
+private:
+       ///
+       virtual Inset * clone() const;
+       ///
+       Kind kind_;
+};
+
+
+
+} // namespace lyx
+#endif
diff --git a/src/mathed/InsetMathCancelto.cpp b/src/mathed/InsetMathCancelto.cpp
new file mode 100644 (file)
index 0000000..d5697d6
--- /dev/null
@@ -0,0 +1,126 @@
+/**
+ * \file InsetMathCancelto.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Uwe Stöhr
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "InsetMathCancelto.h"
+
+#include "Cursor.h"
+#include "LaTeXFeatures.h"
+#include "MathData.h"
+#include "MathStream.h"
+
+#include "frontends/Painter.h"
+
+#include <ostream>
+
+using namespace std;
+
+namespace lyx {
+
+
+InsetMathCancelto::InsetMathCancelto(Buffer * buf)
+       : InsetMathNest(buf, 2)
+{}
+
+
+Inset * InsetMathCancelto::clone() const
+{
+       return new InsetMathCancelto(*this);
+}
+
+
+void InsetMathCancelto::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+       InsetMathNest::metrics(mi);
+       Dimension const & dim0 = cell(0).dimension(*mi.base.bv);
+       Dimension const & dim1 = cell(1).dimension(*mi.base.bv);
+       dim.asc = max(dim0.ascent() + 2, dim0.ascent() + dim1.ascent()) + 2 + 8;
+       dim.des = max(dim0.descent() - 2, dim1.descent()) + 2;
+       dim.wid = dim0.width() + dim1.width() + 10;
+       metricsMarkers(dim);
+}
+
+
+void InsetMathCancelto::draw(PainterInfo & pi, int x, int y) const
+{
+       ColorCode const origcol = pi.base.font.color();
+
+       // We first draw the text and then an arrow
+       Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
+       cell(0).draw(pi, x + 1, y);
+       cell(1).draw(pi, x + dim0.wid + 2 + 8, y - dim0.asc - 8);
+               
+       //Dimension const dim = dimension(*pi.base.bv);
+       
+       // y3____ ___
+       //          /|
+       // y2_     / |
+       //        /
+       //       /
+       //      /
+       //     /
+       // y1 /    | |
+       //    x1  x2 x3
+
+       int const x2 = x + dim0.wid;
+       int const x3 = x2 + 8;
+       int const x1 = x;
+       int const y1 = y + dim0.des;
+       int const y2 = y - dim0.asc;
+       int const y3 = y2 - 8;
+
+       // the main line
+       pi.pain.line(x3, y3, x1, y1, origcol);
+       // the arrow bars
+       pi.pain.line(x3, y3, x2 + 2, y3, origcol);
+       pi.pain.line(x3, y3, x3 - 2, y2 - 2, origcol);
+
+       drawMarkers(pi, x, y);
+}
+
+
+void InsetMathCancelto::write(WriteStream & os) const
+{
+       MathEnsurer ensurer(os);
+       os << "\\cancelto{" << cell(1) << "}{" << cell(0) << '}';
+}
+
+
+void InsetMathCancelto::normalize(NormalStream & os) const
+{
+       os << "[cancelto " << cell(1) << ' ' << cell(0) << ']';
+}
+
+bool InsetMathCancelto::idxUpDown(Cursor & cur, bool up) const
+{
+       Cursor::idx_type const target = up ? 1 : 0;
+       if (cur.idx() == target)
+               return false;
+       cur.idx() = target;
+       cur.pos() = up ? cur.lastpos() : 0;
+       return true;
+}
+
+void InsetMathCancelto::infoize(odocstream & os) const
+{
+       os << "Cancelto";
+}
+
+void InsetMathCancelto::validate(LaTeXFeatures & features) const
+{
+       InsetMathNest::validate(features);
+       if (features.runparams().isLaTeX())
+               features.require("cancel");
+       InsetMathNest::validate(features);
+}
+
+
+} // namespace lyx
diff --git a/src/mathed/InsetMathCancelto.h b/src/mathed/InsetMathCancelto.h
new file mode 100644 (file)
index 0000000..10f942f
--- /dev/null
@@ -0,0 +1,53 @@
+// -*- C++ -*-
+/**
+ * \file InsetMathCancelto.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Uwe Stöhr
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef MATH_CANCELTOINSET_H
+#define MATH_CANCELTOINSET_H
+
+#include "InsetMathNest.h"
+
+
+namespace lyx {
+
+class InsetMathCancelto : public InsetMathNest {
+public:
+       ///
+       explicit InsetMathCancelto(Buffer * buf);
+       ///
+       bool idxUpDown(Cursor & cur, bool up) const;
+       ///
+       void metrics(MetricsInfo & mi, Dimension & dim) const;
+       ///
+       void draw(PainterInfo & pi, int x, int y) const;
+       ///
+       void write(WriteStream & os) const;
+       /// write normalized content
+       void normalize(NormalStream & ns) const;
+       ///
+       void infoize(odocstream & os) const;
+       ///
+       InsetCode lyxCode() const { return MATH_CANCELTO_CODE; }
+       /// Nothing for now
+       void mathmlize(MathStream &) const {}
+       /// Nothing for HTML
+       void htmlize(HtmlStream &) const {}
+       ///
+       void validate(LaTeXFeatures &) const;
+
+private:
+       ///
+       virtual Inset * clone() const;
+};
+
+
+
+} // namespace lyx
+#endif
index f4dc71c2b1d96f66140d7d642e8641b77092dd55..affe7918c69b749479e38cf7e3af9b1a3862a974 100644 (file)
@@ -2128,6 +2128,10 @@ MathCompletionList::MathCompletionList(Cursor const & cur)
        globals.push_back(from_ascii("\\hphantom"));
        globals.push_back(from_ascii("\\phantom"));
        globals.push_back(from_ascii("\\vphantom"));
+       globals.push_back(from_ascii("\\cancel"));
+       globals.push_back(from_ascii("\\bcancel"));
+       globals.push_back(from_ascii("\\xcancel"));
+       globals.push_back(from_ascii("\\cancelto"));
        globals.push_back(from_ascii("\\smash"));
        globals.push_back(from_ascii("\\mathclap"));
        globals.push_back(from_ascii("\\mathllap"));
index 00e585062f48c4456987e3367f45e26b8e64d9dc..160196c643697154c441061b37baa7202bf96559 100644 (file)
@@ -16,6 +16,8 @@
 #include "InsetMathArray.h"
 #include "InsetMathBoldSymbol.h"
 #include "InsetMathBox.h"
+#include "InsetMathCancel.h"
+#include "InsetMathCancelto.h"
 #include "InsetMathCases.h"
 #include "InsetMathColor.h"
 #include "InsetMathDecoration.h"
@@ -501,6 +503,14 @@ MathAtom createInsetMath(docstring const & s, Buffer * buf)
                return MathAtom(new InsetMathPhantom(buf, InsetMathPhantom::phantom));
        if (s == "vphantom")
                return MathAtom(new InsetMathPhantom(buf, InsetMathPhantom::vphantom));
+       if (s == "cancel")
+               return MathAtom(new InsetMathCancel(buf, InsetMathCancel::cancel));
+       if (s == "bcancel")
+               return MathAtom(new InsetMathCancel(buf, InsetMathCancel::bcancel));
+       if (s == "xcancel")
+               return MathAtom(new InsetMathCancel(buf, InsetMathCancel::xcancel));
+       if (s == "cancelto")
+               return MathAtom(new InsetMathCancelto(buf));
        if (s == "smash")
                return MathAtom(new InsetMathPhantom(buf, InsetMathPhantom::smash));
        if (s == "mathclap")
index 288a14a97d16cb1179ff04764736295b5f068cf8..30e5c004a30f459bb8c6cfa6a6c1ad62d3867783 100644 (file)
@@ -42,6 +42,7 @@ following hack as starting point to write some macros:
 #include "InsetMathArray.h"
 #include "InsetMathBig.h"
 #include "InsetMathBrace.h"
+#include "InsetMathCancelto.h"
 #include "InsetMathChar.h"
 #include "InsetMathColor.h"
 #include "InsetMathComment.h"
@@ -1384,6 +1385,14 @@ bool Parser::parse1(InsetMathGrid & grid, unsigned flags,
                        }
                }
 
+               else if (t.cs() == "cancelto") {
+                       MathData ar;
+                       parse(ar, FLAG_ITEM, mode);
+                               cell->push_back(MathAtom(new InsetMathCancelto(buf)));
+                               cell->back().nucleus()->cell(1) = ar;
+                               parse(cell->back().nucleus()->cell(0), FLAG_ITEM, mode);
+               }
+
                else if (t.cs() == "unit") {
                        // Allowed formats \unit[val]{unit}
                        MathData ar;
index bb9812e17a9a3e6aa93d28433b047ebb4835b706..3d831e103906f94b4f7a617a7d8ec18d5a83f540 100644 (file)
@@ -30,8 +30,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 424 // jrioux : \cite_engine_type (authoryear|numerical)
-#define LYX_FORMAT_TEX2LYX 424 // jrioux : \cite_engine_type (authoryear|numerical)
+#define LYX_FORMAT_LYX 425 // uwestoehrx: support for the package cancel
+#define LYX_FORMAT_TEX2LYX 425 // jrioux : \cite_engine_type (authoryear|numerical)
 
 #if LYX_FORMAT_FOR_TEX2LYX != LYX_FORMAT_FOR_LYX
 #warning "tex2lyx produces an out of date file format."