From e3c1fc2ad522d917ca4b9c09527eb1882c199c9b Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Mon, 4 Jan 2021 22:36:01 +0100 Subject: [PATCH] Implement \case for AASTeX. --- src/LaTeXFeatures.cpp | 8 ++++++++ src/mathed/InsetMathFrac.cpp | 28 ++++++++++++++++++++++------ src/mathed/InsetMathFrac.h | 1 + src/mathed/MathFactory.cpp | 2 ++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 95a1a6dfc4..3acbe41df2 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -73,6 +73,11 @@ static docstring const lyxarrow_def = from_ascii( "{\\leavevmode\\,$\\triangleleft$\\,\\allowbreak}\n" "{\\leavevmode\\,$\\triangleright$\\,\\allowbreak}}"); +static docstring const aastex_case_def = from_ascii( + "\\providecommand\\case[2]{\\mbox{$\\frac{#1}{#2}$}}%"); +// Copied from https://github.com/AASJournals/AASTeX60/blob/master/cls/aastex63.cls#L1645 +// Adapted to providecommand for compatibility reasons. + // ZERO WIDTH SPACE (ZWSP) is actually not a space character // but marks a line break opportunity. Several commands provide a // line break opportunity. They differ in side-effects: @@ -1558,6 +1563,9 @@ TexString LaTeXFeatures::getMacros() const if (mustProvide("lyxarrow")) macros << lyxarrow_def << '\n'; + if (mustProvide("aastex_case")) + macros << aastex_case_def << '\n'; + if (mustProvide("lyxzerowidthspace")) macros << lyxZWSP_def << '\n'; diff --git a/src/mathed/InsetMathFrac.cpp b/src/mathed/InsetMathFrac.cpp index 3719904b92..2ad44fc6ef 100644 --- a/src/mathed/InsetMathFrac.cpp +++ b/src/mathed/InsetMathFrac.cpp @@ -140,6 +140,7 @@ MathClass InsetMathFrac::mathClass() const case CFRAC: case CFRACLEFT: case CFRACRIGHT: + case AASTEX_CASE: mc = MC_INNER; break; case NICEFRAC: @@ -239,7 +240,8 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const case DFRAC: case TFRAC: case OVER: - case ATOP: { + case ATOP: + case AASTEX_CASE: { int const dy = axis_height(mi.base); Changer dummy = // \tfrac is always in text size @@ -248,7 +250,8 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const (kind_ == CFRAC || kind_ == CFRACLEFT || kind_ == CFRACRIGHT - || kind_ == DFRAC) ? mi.base.font.changeStyle(DISPLAY_STYLE) : + || kind_ == DFRAC + || kind_ == AASTEX_CASE) ? mi.base.font.changeStyle(DISPLAY_STYLE) : // all others mi.base.changeFrac(); Changer dummy2 = mi.base.changeEnsureMath(); @@ -321,7 +324,8 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const case DFRAC: case TFRAC: case OVER: - case ATOP: { + case ATOP: + case AASTEX_CASE: { int const dy = axis_height(pi.base); Changer dummy = // \tfrac is always in text size @@ -330,7 +334,8 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const (kind_ == CFRAC || kind_ == CFRACLEFT || kind_ == CFRACRIGHT - || kind_ == DFRAC) ? pi.base.font.changeStyle(DISPLAY_STYLE) : + || kind_ == DFRAC + || kind_ == AASTEX_CASE) ? pi.base.font.changeStyle(DISPLAY_STYLE) : // all others pi.base.changeFrac(); Dimension const dim1 = cell(1).dimension(*pi.base.bv); @@ -422,6 +427,9 @@ void InsetMathFrac::write(TeXMathStream & os) const case CFRACRIGHT: os << "\\cfrac[r]{" << cell(0) << "}{" << cell(1) << '}'; break; + case AASTEX_CASE: + os << "\\case{" << cell(0) << "}{" << cell(1) << '}'; + break; } } @@ -449,9 +457,11 @@ docstring InsetMathFrac::name() const return from_ascii("unit"); case ATOP: return from_ascii("atop"); + case AASTEX_CASE: + return from_ascii("case"); + default: + return docstring(); } - // shut up stupid compiler - return docstring(); } @@ -509,6 +519,7 @@ void InsetMathFrac::mathmlize(MathMLStream & ms) const case CFRAC: case CFRACLEFT: case CFRACRIGHT: + case AASTEX_CASE: ms << MTag("mfrac") << MTag("mrow") << cell(0) << ETag("mrow") << MTag("mrow") << cell(1) << ETag("mrow") @@ -565,6 +576,7 @@ void InsetMathFrac::htmlize(HtmlStream & os) const case CFRAC: case CFRACLEFT: case CFRACRIGHT: + case AASTEX_CASE: os << MTag("span", "class='frac'") << MTag("span", "class='numer'") << cell(0) << ETag("span") << MTag("span", "class='denom'") << cell(1) << ETag("span") @@ -604,12 +616,16 @@ void InsetMathFrac::validate(LaTeXFeatures & features) const if (kind_ == CFRAC || kind_ == CFRACLEFT || kind_ == CFRACRIGHT || kind_ == DFRAC || kind_ == TFRAC) features.require("amsmath"); + if (kind_ == AASTEX_CASE) + features.require("aastex_case"); + if (features.runparams().math_flavor == OutputParams::MathAsHTML) // CSS adapted from eLyXer features.addCSSSnippet( "span.frac{display: inline-block; vertical-align: middle; text-align:center;}\n" "span.numer{display: block;}\n" "span.denom{display: block; border-top: thin solid #000040;}"); + InsetMathNest::validate(features); } diff --git a/src/mathed/InsetMathFrac.h b/src/mathed/InsetMathFrac.h index 87b230623a..c2427ec764 100644 --- a/src/mathed/InsetMathFrac.h +++ b/src/mathed/InsetMathFrac.h @@ -46,6 +46,7 @@ public: /// enum Kind { FRAC, + AASTEX_CASE, CFRAC, CFRACLEFT, CFRACRIGHT, diff --git a/src/mathed/MathFactory.cpp b/src/mathed/MathFactory.cpp index 18e4c06f0a..08f0b01e39 100644 --- a/src/mathed/MathFactory.cpp +++ b/src/mathed/MathFactory.cpp @@ -624,6 +624,8 @@ MathAtom createInsetMath(docstring const & s, Buffer * buf) return MathAtom(new InsetMathFrac(buf, InsetMathFrac::CFRACLEFT)); if (s == "cfracright") return MathAtom(new InsetMathFrac(buf, InsetMathFrac::CFRACRIGHT)); + if (s == "case") // TODO: only if class is aastex(6|62) + return MathAtom(new InsetMathFrac(buf, InsetMathFrac::AASTEX_CASE)); //if (s == "infer") // return MathAtom(new MathInferInset); if (s == "atop") -- 2.39.5