/* predefMacros.java * ========================================================================= * This file is part of the JLaTeXMath Library - http://forge.scilab.org/jlatexmath * * Copyright (C) 2009 DENIZET Calixte * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * A copy of the GNU General Public License can be found in the file * LICENSE.txt provided with the source distribution of this program (see * the META-INF directory in the source jar). This license can also be * found on the GNU website at http://www.gnu.org/licenses/gpl.html. * * If you did not receive a copy of the GNU General Public License along * with this program, contact the lead developer, or write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. * * Linking this library statically or dynamically with other modules * is making a combined work based on this library. Thus, the terms * and conditions of the GNU General Public License cover the whole * combination. * * As a special exception, the copyright holders of this library give you * permission to link this library with independent modules to produce * an executable, regardless of the license terms of these independent * modules, and to copy and distribute the resulting executable under terms * of your choice, provided that you also meet, for each linked independent * module, the terms and conditions of the license of that module. * An independent module is a module which is not derived from or based * on this library. If you modify this library, you may extend this exception * to your version of the library, but you are not obliged to do so. * If you do not wish to do so, delete this exception statement from your * version. * */ package com.himamis.retex.renderer.share; import java.util.Map; import com.himamis.retex.renderer.share.Cancel.Type; import com.himamis.retex.renderer.share.character.Character; import com.himamis.retex.renderer.share.exception.ParseException; import com.himamis.retex.renderer.share.platform.FactoryProvider; import com.himamis.retex.renderer.share.platform.Graphics; import com.himamis.retex.renderer.share.platform.graphics.Color; import com.himamis.retex.renderer.share.platform.graphics.GraphicsFactory; /** * This class contains the most of basic commands of LaTeX, they're activated in byt the class * PredefinedCommands.java. **/ public class PredefMacros { private static final Graphics graphics; static { graphics = new Graphics(); NewEnvironmentMacro.addNewEnvironment("array", "\\array@@env{#1}{", "}", 1); NewEnvironmentMacro.addNewEnvironment("tabular", "\\array@@env{#1}{", "}", 1); NewEnvironmentMacro.addNewEnvironment("matrix", "\\matrix@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("smallmatrix", "\\smallmatrix@@env{", "}", 0); NewEnvironmentMacro .addNewEnvironment("pmatrix", "\\left(\\begin{matrix}", "\\end{matrix}\\right)", 0); NewEnvironmentMacro .addNewEnvironment("bmatrix", "\\left[\\begin{matrix}", "\\end{matrix}\\right]", 0); NewEnvironmentMacro.addNewEnvironment("Bmatrix", "\\left\\{\\begin{matrix}", "\\end{matrix}\\right\\}", 0); NewEnvironmentMacro .addNewEnvironment("vmatrix", "\\left|\\begin{matrix}", "\\end{matrix}\\right|", 0); NewEnvironmentMacro.addNewEnvironment("Vmatrix", "\\left\\|\\begin{matrix}", "\\end{matrix}\\right\\|", 0); NewEnvironmentMacro.addNewEnvironment("eqnarray", "\\begin{array}{rcl}", "\\end{array}", 0); NewEnvironmentMacro.addNewEnvironment("align", "\\align@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("flalign", "\\flalign@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("alignat", "\\alignat@@env{#1}{", "}", 1); NewEnvironmentMacro.addNewEnvironment("aligned", "\\aligned@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("alignedat", "\\alignedat@@env{#1}{", "}", 1); NewEnvironmentMacro.addNewEnvironment("multline", "\\multline@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("cases", "\\left\\{\\begin{array}{l@{\\!}l}", "\\end{array}\\right.", 0); NewEnvironmentMacro.addNewEnvironment("split", "\\begin{array}{rl}", "\\end{array}", 0); NewEnvironmentMacro.addNewEnvironment("gather", "\\gather@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("gathered", "\\gathered@@env{", "}", 0); NewEnvironmentMacro.addNewEnvironment("math", "\\(", "\\)", 0); NewEnvironmentMacro.addNewEnvironment("displaymath", "\\[", "\\]", 0); NewCommandMacro.addNewCommand("operatorname", "\\mathop{\\mathrm{#1}}\\nolimits ", 1); NewCommandMacro.addNewCommand("DeclareMathOperator", "\\newcommand{#1}{\\mathop{\\mathrm{#2}}\\nolimits}", 2); NewCommandMacro.addNewCommand("substack", "{\\scriptstyle\\begin{array}{c}#1\\end{array}}", 1); NewCommandMacro.addNewCommand("dfrac", "\\genfrac{}{}{}{}{#1}{#2}", 2); NewCommandMacro.addNewCommand("tfrac", "\\genfrac{}{}{}{1}{#1}{#2}", 2); NewCommandMacro.addNewCommand("dbinom", "\\genfrac{(}{)}{0pt}{}{#1}{#2}", 2); NewCommandMacro.addNewCommand("tbinom", "\\genfrac{(}{)}{0pt}{1}{#1}{#2}", 2); NewCommandMacro.addNewCommand("pmod", "\\qquad\\mathbin{(\\mathrm{mod}\\ #1)}", 1); NewCommandMacro.addNewCommand("mod", "\\qquad\\mathbin{\\mathrm{mod}\\ #1}", 1); NewCommandMacro.addNewCommand("pod", "\\qquad\\mathbin{(#1)}", 1); NewCommandMacro.addNewCommand("dddot", "\\mathop{#1}\\limits^{...}", 1); NewCommandMacro.addNewCommand("ddddot", "\\mathop{#1}\\limits^{....}", 1); NewCommandMacro.addNewCommand("spdddot", "^{\\mathrm{...}}", 0); NewCommandMacro.addNewCommand("spbreve", "^{\\makeatletter\\sp@breve\\makeatother}", 0); NewCommandMacro.addNewCommand("sphat", "^{\\makeatletter\\sp@hat\\makeatother}", 0); NewCommandMacro.addNewCommand("spddot", "^{\\displaystyle..}", 0); NewCommandMacro.addNewCommand("spcheck", "^{\\vee}", 0); NewCommandMacro.addNewCommand("sptilde", "^{\\sim}", 0); NewCommandMacro.addNewCommand("spdot", "^{\\displaystyle.}", 0); NewCommandMacro.addNewCommand("d", "\\underaccent{\\dot}{#1}", 1); NewCommandMacro.addNewCommand("b", "\\underaccent{\\bar}{#1}", 1); NewCommandMacro.addNewCommand("Bra", "\\left\\langle{#1}\\right\\vert", 1); NewCommandMacro.addNewCommand("Ket", "\\left\\vert{#1}\\right\\rangle", 1); NewCommandMacro.addNewCommand("textsuperscript", "{}^{\\text{#1}}", 1); NewCommandMacro.addNewCommand("textsubscript", "{}_{\\text{#1}}", 1); NewCommandMacro.addNewCommand("textit", "\\mathit{\\text{#1}}", 1); NewCommandMacro.addNewCommand("textbf", "\\mathbf{\\text{#1}}", 1); NewCommandMacro.addNewCommand("textsf", "\\mathsf{\\text{#1}}", 1); NewCommandMacro.addNewCommand("texttt", "\\mathtt{\\text{#1}}", 1); NewCommandMacro.addNewCommand("textrm", "\\text{#1}", 1); NewCommandMacro.addNewCommand("degree", "^\\circ", 0); NewCommandMacro.addNewCommand("with", "\\mathbin{\\&}", 0); NewCommandMacro.addNewCommand("parr", "\\mathbin{\\rotatebox[origin=c]{180}{\\&}}", 0); NewCommandMacro.addNewCommand("copyright", "\\textcircled{\\raisebox{0.2ex}{c}}", 0); NewCommandMacro.addNewCommand("L", "\\mathrm{\\polishlcross L}", 0); NewCommandMacro.addNewCommand("l", "\\mathrm{\\polishlcross l}", 0); NewCommandMacro.addNewCommand("Join", "\\mathop{\\rlap{\\ltimes}\\rtimes}", 0); NewCommandMacro.addNewCommand("longdiv", "{\\overline{\\smash{)}#1}}", 1); NewCommandMacro.addNewCommand("questeq", "{\\stackrel{?}{=}}", 0); } public static final Atom fcscore_macro(final String[] args) throws ParseException { int n = Integer.parseInt(args[1]); if (n > 5) { final int q = n / 5; final int r = n % 5; RowAtom rat = new RowAtom(); for (int i = 0; i < q; i++) { rat.add(new FcscoreAtom(5)); } rat.add(new FcscoreAtom(r)); return rat; } return new FcscoreAtom(n); } public static final Atom st_macro(final TeXParser tp, final String[] args) throws ParseException { return new StrikeThroughAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom Braket_macro(final TeXParser tp, final String[] args) throws ParseException { String str = args[1].replaceAll("\\|", "\\\\middle\\\\vert "); return new TeXFormula(tp, "\\left\\langle " + str + "\\right\\rangle").root; } public static final Atom Set_macro(final TeXParser tp, final String[] args) throws ParseException { String str = args[1].replaceFirst("\\|", "\\\\middle\\\\vert "); return new TeXFormula(tp, "\\left\\{" + str + "\\right\\}").root; } public static final Atom spATbreve_macro() throws ParseException { VRowAtom vra = new VRowAtom(new TeXFormula("\\displaystyle\\!\\breve{}").root); vra.setRaise(TeXConstants.UNIT_EX, 0.6f); return new SmashedAtom(vra, null); } public static final Atom spAThat_macro() throws ParseException { VRowAtom vra = new VRowAtom(new TeXFormula("\\displaystyle\\widehat{}").root); vra.setRaise(TeXConstants.UNIT_EX, 0.6f); return new SmashedAtom(vra, null); } public static final Atom hvspace_macro(final String[] args) throws ParseException { int i; for (i = 0; i < args[1].length() && !java.lang.Character.isLetter(args[1].charAt(i)); i++) { ; } double f = 0; try { f = Double.parseDouble(args[1].substring(0, i)); } catch (NumberFormatException e) { throw new ParseException(e.toString()); } int unit; if (i != args[1].length()) { unit = SpaceAtom.getUnit(args[1].substring(i).toLowerCase()); } else { unit = TeXConstants.UNIT_POINT; } if (unit == -1) { throw new ParseException("Unknown unit \"" + args[1].substring(i) + "\" !"); } return args[0].charAt(0) == 'h' ? new SpaceAtom(unit, f, 0, 0) : new SpaceAtom(unit, 0, f, 0); } public static final Atom clrlap_macro(final TeXParser tp, final String[] args) throws ParseException { return new LapedAtom(new TeXFormula(tp, args[1]).root, args[0].charAt(0)); } public static final Atom mathclrlap_macro(final TeXParser tp, final String[] args) throws ParseException { return new LapedAtom(new TeXFormula(tp, args[1]).root, args[0].charAt(4)); } // public static final Atom includegraphics_macro(final TeXParser tp, final // String[] args) // throws ParseException { // return new GraphicsAtom(args[1], args[2]); // } public static final Atom rule_macro(final String[] args) throws ParseException { double[] winfo = SpaceAtom.getLength(args[1]); if (winfo.length == 1) { throw new ParseException("Error in getting width in \\rule command !"); } double[] hinfo = SpaceAtom.getLength(args[2]); if (hinfo.length == 1) { throw new ParseException("Error in getting height in \\rule command !"); } double[] rinfo = SpaceAtom.getLength(args[3]); if (rinfo.length == 1) { throw new ParseException("Error in getting raise in \\rule command !"); } return new RuleAtom((int) winfo[0], winfo[1], (int) hinfo[0], hinfo[1], (int) rinfo[0], -rinfo[1]); } /* Thanks to Juan Enrique Escobar Robles for this macro */ public static final Atom cfrac_macro(final TeXParser tp, final String[] args) throws ParseException { int alig = TeXConstants.ALIGN_CENTER; if ("r".equals(args[3])) { alig = TeXConstants.ALIGN_RIGHT; } else if ("l".equals(args[3])) { alig = TeXConstants.ALIGN_LEFT; } TeXFormula num = new TeXFormula(tp, args[1], false); TeXFormula denom = new TeXFormula(tp, args[2], false); if (num.root == null || denom.root == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } Atom f = new FractionAtom(num.root, denom.root, true, alig, TeXConstants.ALIGN_CENTER); RowAtom rat = new RowAtom(); rat.add(new StyleAtom(TeXConstants.STYLE_DISPLAY, f)); return rat; } public static final Atom frac_macro(final TeXParser tp, final String[] args) throws ParseException { TeXFormula num = new TeXFormula(tp, args[1], false); TeXFormula denom = new TeXFormula(tp, args[2], false); if (num.root == null || denom.root == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } return new FractionAtom(num.root, denom.root, true); } public static final Atom sfrac_macro(final TeXParser tp, final String[] args) throws ParseException { TeXFormula num = new TeXFormula(tp, args[1], false); TeXFormula denom = new TeXFormula(tp, args[2], false); if (num.root == null || denom.root == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } double scaleX = 0.75; double scaleY = 0.75; double raise1 = 0.45f; double shiftL = -0.13f; double shiftR = -0.065f; Atom slash = SymbolAtom.get("slash"); if (!tp.isMathMode()) { scaleX = 0.6; scaleY = 0.5; raise1 = 0.75f; shiftL = -0.24f; shiftR = -0.24f; slash = new VRowAtom(new ScaleAtom(SymbolAtom.get("textfractionsolidus"), 1.25, 0.65)); ((VRowAtom) slash).setRaise(TeXConstants.UNIT_EX, 0.4f); } VRowAtom snum = new VRowAtom(new ScaleAtom(num.root, scaleX, scaleY)); snum.setRaise(TeXConstants.UNIT_EX, raise1); RowAtom at = new RowAtom(snum); at.add(new SpaceAtom(TeXConstants.UNIT_EM, shiftL, 0f, 0f)); at.add(slash); at.add(new SpaceAtom(TeXConstants.UNIT_EM, shiftR, 0f, 0f)); at.add(new ScaleAtom(denom.root, scaleX, scaleY)); return at; } public static final Atom genfrac_macro(final TeXParser tp, final String[] args) throws ParseException { TeXFormula left = new TeXFormula(tp, args[1], false); SymbolAtom L = null, R = null; if (left.root instanceof SymbolAtom) { L = (SymbolAtom) left.root; } TeXFormula right = new TeXFormula(tp, args[2], false); if (right.root instanceof SymbolAtom) { R = (SymbolAtom) right.root; } boolean rule = true; double[] ths = SpaceAtom.getLength(args[3]); if (args[3] == null || args[3].length() == 0 || ths.length == 1) { ths = new double[] { 0.0f, 0.0f }; rule = false; } int style = 0; if (args[4].length() != 0) { style = Integer.parseInt(args[4]); } TeXFormula num = new TeXFormula(tp, args[5], false); TeXFormula denom = new TeXFormula(tp, args[6], false); if (num.root == null || denom.root == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } Atom at = new FractionAtom(num.root, denom.root, rule, (int) ths[0], ths[1]); RowAtom rat = new RowAtom(); rat.add(new StyleAtom(style * 2, new FencedAtom(at, L, R))); return rat; } public static final Atom over_macro(final TeXParser tp) throws ParseException { Atom num = tp.getFormulaAtom(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } return new FractionAtom(num, denom, true); } public static final Atom overwithdelims_macro(final TeXParser tp, final String[] args) throws ParseException { Atom num = tp.getFormulaAtom(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } Atom left = new TeXFormula(tp, args[1], false).root; if (left instanceof BigDelimiterAtom) { left = ((BigDelimiterAtom) left).delim; } Atom right = new TeXFormula(tp, args[2], false).root; if (right instanceof BigDelimiterAtom) { right = ((BigDelimiterAtom) right).delim; } if (left instanceof SymbolAtom && right instanceof SymbolAtom) { return new FencedAtom(new FractionAtom(num, denom, true), (SymbolAtom) left, (SymbolAtom) right); } RowAtom ra = new RowAtom(); ra.add(left); ra.add(new FractionAtom(num, denom, true)); ra.add(right); return ra; } public static final Atom atop_macro(final TeXParser tp) throws ParseException { Atom num = tp.getFormulaAtom(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } return new FractionAtom(num, denom, false); } public static final Atom atopwithdelims_macro(final TeXParser tp, final String[] args) throws ParseException { Atom num = tp.getFormulaAtom(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } Atom left = new TeXFormula(tp, args[1], false).root; if (left instanceof BigDelimiterAtom) { left = ((BigDelimiterAtom) left).delim; } Atom right = new TeXFormula(tp, args[2], false).root; if (right instanceof BigDelimiterAtom) { right = ((BigDelimiterAtom) right).delim; } if (left instanceof SymbolAtom && right instanceof SymbolAtom) { return new FencedAtom(new FractionAtom(num, denom, false), (SymbolAtom) left, (SymbolAtom) right); } RowAtom ra = new RowAtom(); ra.add(left); ra.add(new FractionAtom(num, denom, false)); ra.add(right); return ra; } public static final Atom choose_macro(final TeXParser tp) throws ParseException { return brackets(tp, "lbrack", "rbrack"); } /** * eg {a \bangle b} * http://www.combinatorics.net/weblib/commands/command.html * * @param tp * @return * @throws ParseException */ public static final Atom bangle_macro(final TeXParser tp) throws ParseException { return brackets(tp, "langle", "rangle"); } /** * eg {a \brack b} http://www.combinatorics.net/weblib/commands/command.html * * @param tp * @return * @throws ParseException */ public static final Atom brack_macro(final TeXParser tp) throws ParseException { return brackets(tp, "lbrack", "rbrack"); } /** * eg {a \brace b} http://www.combinatorics.net/weblib/commands/command.html * * @param tp * @return * @throws ParseException */ public static final Atom brace_macro(final TeXParser tp) throws ParseException { return brackets(tp, "lbrace", "rbrace"); } private static Atom brackets(TeXParser tp, String leftBracket, String rightBracket) { Atom num = tp.getFormulaAtom(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (num == null || denom == null) { throw new ParseException( "Both numerator and denominator of choose can't be empty!"); } return new FencedAtom(new FractionAtom(num, denom, false), new SymbolAtom(leftBracket, TeXConstants.TYPE_OPENING, true), new SymbolAtom(rightBracket, TeXConstants.TYPE_CLOSING, true)); } public static final Atom binom_macro(final TeXParser tp, final String[] args) throws ParseException { TeXFormula num = new TeXFormula(tp, args[1], false); TeXFormula denom = new TeXFormula(tp, args[2], false); if (num.root == null || denom.root == null) { throw new ParseException("Both binomial coefficients must be not empty !!"); } return new FencedAtom(new FractionAtom(num.root, denom.root, false), new SymbolAtom("lbrack", TeXConstants.TYPE_OPENING, true), new SymbolAtom("rbrack", TeXConstants.TYPE_CLOSING, true)); } public static final Atom above_macro(final TeXParser tp) throws ParseException { Atom num = tp.getFormulaAtom(); double[] dim = tp.getLength(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (dim == null || dim.length != 2) { throw new ParseException("Invalid length in above macro"); } if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } return new FractionAtom(num, denom, (int) dim[0], dim[1]); } public static final Atom abovewithdelims_macro(final TeXParser tp, final String[] args) throws ParseException { Atom num = tp.getFormulaAtom(); double[] dim = tp.getLength(); Atom denom = new TeXFormula(tp, tp.getOverArgument(), false).root; if (dim == null || dim.length != 2) { throw new ParseException("Invalid length in above macro"); } if (num == null || denom == null) { throw new ParseException("Both numerator and denominator of a fraction can't be empty!"); } Atom left = new TeXFormula(tp, args[1], false).root; if (left instanceof BigDelimiterAtom) { left = ((BigDelimiterAtom) left).delim; } Atom right = new TeXFormula(tp, args[2], false).root; if (right instanceof BigDelimiterAtom) { right = ((BigDelimiterAtom) right).delim; } if (left instanceof SymbolAtom && right instanceof SymbolAtom) { return new FencedAtom(new FractionAtom(num, denom, (int) dim[0], dim[1]), (SymbolAtom) left, (SymbolAtom) right); } RowAtom ra = new RowAtom(); ra.add(left); ra.add(new FractionAtom(num, denom, true)); ra.add(right); return ra; } public static final Atom textstyle_macros(final TeXParser tp, final String[] args) throws ParseException { String style = args[0]; if ("frak".equals(args[0])) { style = "mathfrak"; } else if ("Bbb".equals(args[0])) { style = "mathbb"; } else if ("bold".equals(args[0])) { return new BoldAtom(new TeXFormula(tp, args[1], false).root); } else if ("cal".equals(args[0])) { style = "mathcal"; } TeXFormula.FontInfos fontInfos = TeXFormula.externalFontMap.get(Character.UnicodeBlock.BASIC_LATIN); if (fontInfos != null) { TeXFormula.externalFontMap.put(Character.UnicodeBlock.BASIC_LATIN, null); } Atom at = new TeXFormula(tp, args[1], false).root; if (fontInfos != null) { TeXFormula.externalFontMap.put(Character.UnicodeBlock.BASIC_LATIN, fontInfos); } return new TextStyleAtom(at, style); } public static final Atom mbox_macro(final TeXParser tp, final String[] args) throws ParseException { Atom group = new RomanAtom(new TeXFormula(tp, args[1], "mathnormal", false, false).root); return new StyleAtom(TeXConstants.STYLE_TEXT, group); } public static final Atom text_macro(final TeXParser tp, final String[] args) throws ParseException { return new RomanAtom(new TeXFormula(tp, args[1], "mathnormal", false, false).root); } public static final Atom underscore_macro() throws ParseException { return new UnderscoreAtom(); } public static final Atom accent_macros(final TeXParser tp, final String[] args) throws ParseException { return new AccentedAtom(new TeXFormula(tp, args[1], false).root, args[0]); } public static final Atom grkaccent_macro(final TeXParser tp, final String[] args) throws ParseException { return new AccentedAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root, false); } public static final Atom accent_macro(final TeXParser tp, final String[] args) throws ParseException { return new AccentedAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root); } public static final Atom accentbis_macros(final TeXParser tp, final String[] args) throws ParseException { String acc = ""; switch (args[0].charAt(0)) { case '~': acc = "tilde"; break; case '\'': acc = "acute"; break; case '^': acc = "hat"; break; case '\"': acc = "ddot"; break; case '`': acc = "grave"; break; case '=': acc = "bar"; break; case '.': acc = "dot"; break; case 'u': acc = "breve"; break; case 'v': acc = "check"; break; case 'H': acc = "doubleacute"; break; case 't': acc = "tie"; break; case 'r': acc = "mathring"; break; case 'U': acc = "cyrbreve"; } return new AccentedAtom(new TeXFormula(tp, args[1], false).root, acc); } public static final Atom cedilla_macro(final TeXParser tp, final String[] args) throws ParseException { return new CedillaAtom(new TeXFormula(tp, args[1]).root); } public static final Atom IJ_macro(final String[] args) throws ParseException { return new IJAtom(args[0].charAt(0) == 'I'); } public static final Atom TStroke_macro(final String[] args) throws ParseException { return new TStrokeAtom(args[0].charAt(0) == 'T'); } public static final Atom LCaron_macro(final String[] args) throws ParseException { return new LCaronAtom(args[0].charAt(0) == 'L'); } public static final Atom tcaron_macro() throws ParseException { return new tcaronAtom(); } public static final Atom ogonek_macro(final TeXParser tp, final String[] args) throws ParseException { return new OgonekAtom(new TeXFormula(tp, args[1]).root); } public static final Atom nbsp_macro() throws ParseException { return new SpaceAtom(); } public static final Atom sqrt_macro(final TeXParser tp, final String[] args) throws ParseException { if (args[2] == null) { return new NthRoot(new TeXFormula(tp, args[1], false).root, null); } return new NthRoot(new TeXFormula(tp, args[1], false).root, new TeXFormula(tp, args[2], false).root); } public static final Atom overrightarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, false, true); } public static final Atom overleftarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, true, true); } public static final Atom overleftrightarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, true); } public static final Atom underrightarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, false, false); } public static final Atom underleftarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, true, false); } public static final Atom underleftrightarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverArrowAtom(new TeXFormula(tp, args[1], false).root, false); } public static final Atom xleftarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new XArrowAtom(new TeXFormula(tp, args[1], false).root, new TeXFormula(tp, args[2]).root, true); } public static final Atom xrightarrow_macro(final TeXParser tp, final String[] args) throws ParseException { return new XArrowAtom(new TeXFormula(tp, args[1], false).root, new TeXFormula(tp, args[2]).root, false); } public static final Atom sideset_macro(final TeXParser tp, final String[] args) throws ParseException { TeXFormula tf = new TeXFormula(); tf.add(new PhantomAtom(new TeXFormula(tp, args[3]).root, false, true, true)); tf.append(tp.getIsPartial(), args[1]); tf.add(new SpaceAtom(TeXConstants.UNIT_MU, -0.3f, 0f, 0f)); tf.append(tp.getIsPartial(), args[3] + "\\nolimits" + args[2]); return new TypedAtom(TeXConstants.TYPE_ORDINARY, TeXConstants.TYPE_ORDINARY, tf.root); } public static final Atom prescript_macro(final TeXParser tp, final String[] args) throws ParseException { Atom base = new TeXFormula(tp, args[3]).root; tp.addAtom(new ScriptsAtom(new PhantomAtom(base, false, true, true), new TeXFormula(tp, args[2]).root, new TeXFormula(tp, args[1]).root, false)); tp.addAtom(new SpaceAtom(TeXConstants.UNIT_MU, -0.3f, 0f, 0f)); return new TypedAtom(TeXConstants.TYPE_ORDINARY, TeXConstants.TYPE_ORDINARY, base); } public static final Atom underbrace_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("rbrace"), TeXConstants.UNIT_EX, 0, false); } public static final Atom overbrace_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("lbrace"), TeXConstants.UNIT_EX, 0, true); } public static final Atom underbrack_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("rsqbrack"), TeXConstants.UNIT_EX, 0, false); } public static final Atom overbrack_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("lsqbrack"), TeXConstants.UNIT_EX, 0, true); } public static final Atom underparen_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("rbrack"), TeXConstants.UNIT_EX, 0, false); } public static final Atom overparen_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverUnderDelimiter(new TeXFormula(tp, args[1], false).root, null, SymbolAtom.get("lbrack"), TeXConstants.UNIT_EX, 0, true); } public static final Atom overline_macro(final TeXParser tp, final String[] args) throws ParseException { return new OverlinedAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom underline_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderlinedAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom mathop_macro(final TeXParser tp, final String[] args) throws ParseException { TypedAtom at = new TypedAtom(TeXConstants.TYPE_BIG_OPERATOR, TeXConstants.TYPE_BIG_OPERATOR, new TeXFormula(tp, args[1], false).root); at.type_limits = TeXConstants.SCRIPT_NORMAL; return at; } public static final Atom mathpunct_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_PUNCTUATION, TeXConstants.TYPE_PUNCTUATION, new TeXFormula(tp, args[1], false).root); } public static final Atom mathord_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_ORDINARY, TeXConstants.TYPE_ORDINARY, new TeXFormula(tp, args[1], false).root); } public static final Atom mathrel_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, new TeXFormula(tp, args[1], false).root); } public static final Atom mathinner_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_INNER, TeXConstants.TYPE_INNER, new TeXFormula(tp, args[1], false).root); } public static final Atom mathbin_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_BINARY_OPERATOR, TeXConstants.TYPE_BINARY_OPERATOR, new TeXFormula(tp, args[1], false).root); } public static final Atom mathopen_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_OPENING, TeXConstants.TYPE_OPENING, new TeXFormula(tp, args[1], false).root); } public static final Atom mathclose_macro(final TeXParser tp, final String[] args) throws ParseException { return new TypedAtom(TeXConstants.TYPE_CLOSING, TeXConstants.TYPE_CLOSING, new TeXFormula(tp, args[1], false).root); } public static final Atom joinrel_macro() throws ParseException { return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, new SpaceAtom( TeXConstants.UNIT_MU, -2.6f, 0, 0)); } public static final Atom smash_macro(final TeXParser tp, final String[] args) throws ParseException { return new SmashedAtom(new TeXFormula(tp, args[1], false).root, args[2]); } public static final Atom vdots_macro() throws ParseException { return new VdotsAtom(); } public static final Atom ddots_macro() throws ParseException { return new TypedAtom(TeXConstants.TYPE_INNER, TeXConstants.TYPE_INNER, new DdotsAtom()); } public static final Atom iddots_macro() throws ParseException { return new TypedAtom(TeXConstants.TYPE_INNER, TeXConstants.TYPE_INNER, new IddotsAtom()); } public static final Atom nolimits_macro(final TeXParser tp) throws ParseException { Atom at = tp.getLastAtom(); at.type_limits = TeXConstants.SCRIPT_NOLIMITS; return at.duplicate(); } public static final Atom limits_macro(final TeXParser tp) throws ParseException { Atom at = tp.getLastAtom(); at.type_limits = TeXConstants.SCRIPT_LIMITS; return at.duplicate(); } public static final Atom normal_macro(final TeXParser tp) throws ParseException { Atom at = tp.getLastAtom(); at.type_limits = TeXConstants.SCRIPT_NORMAL; return at.duplicate(); } public static final Atom left_macro(final TeXParser tp, final String[] args) throws ParseException { String grp = tp.getGroup("\\left", "\\right"); Atom left = new TeXFormula(tp, args[1], false).root; if (left instanceof BigDelimiterAtom) { left = ((BigDelimiterAtom) left).delim; } Atom right = tp.getArgument(); if (right instanceof BigDelimiterAtom) { right = ((BigDelimiterAtom) right).delim; } if (left instanceof SymbolAtom && right instanceof SymbolAtom) { TeXFormula tf = new TeXFormula(tp, grp, false); return new FencedAtom(tf.root, (SymbolAtom) left, tf.middle, (SymbolAtom) right); } RowAtom ra = new RowAtom(); ra.add(left); ra.add(new TeXFormula(tp, grp, false).root); ra.add(right); return ra; } public static final Atom leftparenthesis_macro(final TeXParser tp) throws ParseException { String grp = tp.getGroup("\\(", "\\)"); return new MathAtom(new TeXFormula(tp, grp, false).root, TeXConstants.STYLE_TEXT); } public static final Atom leftbracket_macro(final TeXParser tp) throws ParseException { String grp = tp.getGroup("\\[", "\\]"); return new MathAtom(new TeXFormula(tp, grp, false).root, TeXConstants.STYLE_DISPLAY); } public static final Atom middle_macro(final TeXParser tp, final String[] args) throws ParseException { return new MiddleAtom(new TeXFormula(tp, args[1]).root); } public static final Atom cr_macro(final TeXParser tp) throws ParseException { if (tp.isArrayMode()) { tp.addRow(); } else { ArrayOfAtoms array = new ArrayOfAtoms(); array.add(tp.formula.root); array.addRow(); TeXParser parser = new TeXParser(tp.getIsPartial(), tp.getStringFromCurrentPos(), array, false, tp.isIgnoreWhiteSpace()); parser.parse(); array.checkDimensions(); tp.finish(); tp.formula.root = array.getAsVRow();// new MatrixAtom(tp.getIsPartial(), array, // MatrixAtom.ARRAY, TeXConstants.ALIGN_LEFT, // false); } return null; } public static final Atom backslashcr_macro(final TeXParser tp) throws ParseException { return cr_macro(tp); } public static final Atom intertext_macro(final TeXParser tp, final String[] args) throws ParseException { if (!tp.isArrayMode()) { throw new ParseException("Bad environment for \\intertext command !"); } String str = args[1].replaceAll("\\^\\{\\\\prime\\}", "\'"); str = str.replaceAll("\\^\\{\\\\prime\\\\prime\\}", "\'\'"); Atom at = new RomanAtom(new TeXFormula(tp, str, "mathnormal", false, false).root); at.type = TeXConstants.TYPE_INTERTEXT; tp.addAtom(at); tp.addRow(); return null; } public static final Atom smallmatrixATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.SMALLMATRIX); } public static final Atom matrixATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.MATRIX); } public static final Atom multicolumn_macro(final TeXParser tp, final String[] args) throws ParseException { int n = Integer.parseInt(args[1]); tp.addAtom(new MulticolumnAtom(n, args[2], new TeXFormula(tp, args[3]).root)); ((ArrayOfAtoms) tp.formula).addCol(n); return null; } public static final Atom hdotsfor_macro(final TeXParser tp, final String[] args) throws ParseException { int n = Integer.parseInt(args[1]); double f = 1; if (args[2] != null) { f = Double.parseDouble(args[2]); } tp.addAtom(new HdotsforAtom(n, f)); ((ArrayOfAtoms) tp.formula).addCol(n); return null; } public static final Atom arrayATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[2], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, args[1], true); } public static final Atom alignATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.ALIGN); } public static final Atom flalignATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.FLALIGN); } public static final Atom alignatATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[2], array, false); parser.parse(); array.checkDimensions(); int n = Integer.parseInt(args[1]); if (array.col != 2 * n) { throw new ParseException("Bad number of equations in alignat environment !"); } return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.ALIGNAT); } public static final Atom alignedATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.ALIGNED); } public static final Atom alignedatATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[2], array, false); parser.parse(); array.checkDimensions(); int n = Integer.parseInt(args[1]); if (array.col != 2 * n) { throw new ParseException("Bad number of equations in alignedat environment !"); } return new MatrixAtom(tp.getIsPartial(), array, MatrixAtom.ALIGNEDAT); } public static final Atom multlineATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); if (array.col > 1) { throw new ParseException("Character '&' is only available in array mode !"); } if (array.col == 0) { return null; } return new MultlineAtom(tp.getIsPartial(), array, MultlineAtom.MULTLINE); } public static final Atom gatherATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); if (array.col > 1) { throw new ParseException("Character '&' is only available in array mode !"); } if (array.col == 0) { return null; } return new MultlineAtom(tp.getIsPartial(), array, MultlineAtom.GATHER); } public static final Atom gatheredATATenv_macro(final TeXParser tp, final String[] args) throws ParseException { ArrayOfAtoms array = new ArrayOfAtoms(); TeXParser parser = new TeXParser(tp.getIsPartial(), args[1], array, false); parser.parse(); array.checkDimensions(); if (array.col > 1) { throw new ParseException("Character '&' is only available in array mode !"); } if (array.col == 0) { return null; } return new MultlineAtom(tp.getIsPartial(), array, MultlineAtom.GATHERED); } public static final Atom shoveright_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1]).root; at.alignment = TeXConstants.ALIGN_RIGHT; return at; } public static final Atom shoveleft_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1]).root; at.alignment = TeXConstants.ALIGN_LEFT; return at; } public static final Atom newcommand_macro(final TeXParser tp, final String[] args) throws ParseException { String newcom = args[1]; Integer nbArgs; if (!tp.isValidName(newcom)) { throw new ParseException("Invalid name for the command :" + newcom); } if (args[3] == null) { nbArgs = new Integer(0); } else { nbArgs = Integer.parseInt(args[3]); } if (args[4] == null) { NewCommandMacro.addNewCommand(newcom.substring(1), args[2], nbArgs.intValue()); } else { NewCommandMacro.addNewCommand(newcom.substring(1), args[2], nbArgs.intValue(), args[4]); } return null; } public static final Atom renewcommand_macro(final TeXParser tp, final String[] args) throws ParseException { String newcom = args[1]; Integer nbArgs; if (!tp.isValidName(newcom)) { throw new ParseException("Invalid name for the command :" + newcom); } if (args[3] == null) { nbArgs = new Integer(0); } else { nbArgs = Integer.parseInt(args[3]); } // if (nbArgs == null) // throw new ParseException("The optional argument should be an integer !"); NewCommandMacro.addReNewCommand(newcom.substring(1), args[2], nbArgs.intValue()); return null; } public static final Atom makeatletter_macro(final TeXParser tp) throws ParseException { tp.makeAtLetter(); return null; } public static final Atom makeatother_macro(final TeXParser tp) throws ParseException { tp.makeAtOther(); return null; } public static final Atom newenvironment_macro(final String[] args) throws ParseException { int opt = args[4] == null ? 0 : Integer.parseInt(args[4]); // if (opt == null) // throw new ParseException("The optional argument should be an integer !"); NewEnvironmentMacro.addNewEnvironment(args[1], args[2], args[3], opt); return null; } public static final Atom renewenvironment_macro(final String[] args) throws ParseException { Integer opt = args[4] == null ? 0 : Integer.parseInt(args[4]); // if (opt == null) // throw new ParseException("The optional argument should be an integer !"); NewEnvironmentMacro.addReNewEnvironment(args[1], args[2], args[3], opt.intValue()); return null; } public static final Atom fbox_macro(final TeXParser tp, final String[] args) throws ParseException { return new FBoxAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom stackrel_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new UnderOverAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[3], false).root, TeXConstants.UNIT_MU, 0.5f, true, new TeXFormula(tp, args[1], false).root, TeXConstants.UNIT_MU, 2.5f, true); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom stackbin_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new UnderOverAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[3], false).root, TeXConstants.UNIT_MU, 0.5f, true, new TeXFormula(tp, args[1], false).root, TeXConstants.UNIT_MU, 2.5f, true); return new TypedAtom(TeXConstants.TYPE_BINARY_OPERATOR, TeXConstants.TYPE_BINARY_OPERATOR, at); } public static final Atom overset_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new UnderOverAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root, TeXConstants.UNIT_MU, 2.5f, true, true); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom underset_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new UnderOverAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root, TeXConstants.UNIT_MU, 0.5f, true, false); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom accentset_macro(final TeXParser tp, final String[] args) throws ParseException { return new AccentedAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root); } public static final Atom underaccent_macro(final TeXParser tp, final String[] args) throws ParseException { return new UnderOverAtom(new TeXFormula(tp, args[2], false).root, new TeXFormula(tp, args[1], false).root, TeXConstants.UNIT_MU, 0.3f, true, false); } public static final Atom undertilde_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; return new UnderOverAtom(at, new AccentedAtom(new PhantomAtom(at, true, false, false), "widetilde"), TeXConstants.UNIT_MU, 0.3f, true, false); } public static final Atom boldsymbol_macro(final TeXParser tp, final String[] args) throws ParseException { return new BoldAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom mathrm_macro(final TeXParser tp, final String[] args) throws ParseException { return new RomanAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom rm_macro(final TeXParser tp) throws ParseException { return new RomanAtom( new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root); } public static final Atom mathbf_macro(final TeXParser tp, final String[] args) throws ParseException { return new BoldAtom(new RomanAtom(new TeXFormula(tp, args[1], false).root)); } public static final Atom bf_macro(final TeXParser tp) throws ParseException { return new BoldAtom(new RomanAtom(new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root)); } public static final Atom mathtt_macro(final TeXParser tp, final String[] args) throws ParseException { return new TtAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom tt_macro(final TeXParser tp) throws ParseException { return new TtAtom(new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root); } public static final Atom mathit_macro(final TeXParser tp, final String[] args) throws ParseException { return new ItAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom it_macro(final TeXParser tp) throws ParseException { return new ItAtom(new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root); } public static final Atom mathsf_macro(final TeXParser tp, final String[] args) throws ParseException { return new SsAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom sf_macro(final TeXParser tp) throws ParseException { return new SsAtom(new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root); } public static final Atom LaTeX_macro() throws ParseException { return new LaTeXAtom(); } // public static final Atom GeoGebra_macro(final TeXParser tp, final String[] args) throws ParseException { // TeXFormula tf = new TeXFormula("\\mathbb{G}\\mathsf{e}"); // tf.add(new GeoGebraLogoAtom()); // tf.add("\\mathsf{Gebra}"); // return new ColorAtom(tf.root, null, graphics.createColor(102, 102, 102)); // } public static final Atom hphantom_macro(final TeXParser tp, final String[] args) throws ParseException { return new PhantomAtom(new TeXFormula(tp, args[1], false).root, true, false, false); } public static final Atom vphantom_macro(final TeXParser tp, final String[] args) throws ParseException { return new PhantomAtom(new TeXFormula(tp, args[1], false).root, false, true, true); } public static final Atom phantom_macro(final TeXParser tp, final String[] args) throws ParseException { return new PhantomAtom(new TeXFormula(tp, args[1], false).root, true, true, true); } public static final Atom big_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } return new BigDelimiterAtom((SymbolAtom) at, 1); } public static final Atom Big_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } return new BigDelimiterAtom((SymbolAtom) at, 2); } public static final Atom bigg_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } return new BigDelimiterAtom((SymbolAtom) at, 3); } public static final Atom Bigg_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } return new BigDelimiterAtom((SymbolAtom) at, 4); } public static final Atom bigl_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 1); att.type = TeXConstants.TYPE_OPENING; return att; } public static final Atom Bigl_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 2); att.type = TeXConstants.TYPE_OPENING; return att; } public static final Atom biggl_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 3); att.type = TeXConstants.TYPE_OPENING; return att; } public static final Atom Biggl_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 4); att.type = TeXConstants.TYPE_OPENING; return att; } public static final Atom bigr_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 1); att.type = TeXConstants.TYPE_CLOSING; return att; } public static final Atom Bigr_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 2); att.type = TeXConstants.TYPE_CLOSING; return att; } public static final Atom biggr_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 3); att.type = TeXConstants.TYPE_CLOSING; return att; } public static final Atom Biggr_macro(final TeXParser tp, final String[] args) throws ParseException { Atom at = new TeXFormula(tp, args[1], false).root; if (!(at instanceof SymbolAtom)) { return at; } Atom att = new BigDelimiterAtom((SymbolAtom) at, 4); att.type = TeXConstants.TYPE_CLOSING; return att; } public static final Atom displaystyle_macro(final TeXParser tp) throws ParseException { Atom group = new TeXFormula(tp, tp.getOverArgument(), false).root; return new StyleAtom(TeXConstants.STYLE_DISPLAY, group); } public static final Atom scriptstyle_macro(final TeXParser tp) throws ParseException { Atom group = new TeXFormula(tp, tp.getOverArgument(), false).root; return new StyleAtom(TeXConstants.STYLE_SCRIPT, group); } public static final Atom textstyle_macro(final TeXParser tp) throws ParseException { Atom group = new TeXFormula(tp, tp.getOverArgument(), false).root; return new StyleAtom(TeXConstants.STYLE_TEXT, group); } public static final Atom scriptscriptstyle_macro(final TeXParser tp) throws ParseException { Atom group = new TeXFormula(tp, tp.getOverArgument(), false).root; return new StyleAtom(TeXConstants.STYLE_SCRIPT_SCRIPT, group); } public static final Atom rotatebox_macro(final TeXParser tp, final String[] args) throws ParseException { return new RotateAtom(new TeXFormula(tp, args[2]).root, args[1] == null ? 0 : Double.parseDouble(args[1]), args[3]); } public static final Atom reflectbox_macro(final TeXParser tp, final String[] args) throws ParseException { return new ReflectAtom(new TeXFormula(tp, args[1]).root); } public static final Atom scalebox_macro(final TeXParser tp, final String[] args) throws ParseException { return new ScaleAtom(new TeXFormula(tp, args[2]).root, Double.parseDouble(args[1]), args[3] == null ? Double.parseDouble(args[1]) : Double.parseDouble(args[3])); } public static final Atom resizebox_macro(final TeXParser tp, final String[] args) throws ParseException { return new ResizeAtom(new TeXFormula(tp, args[3]).root, args[1], args[2], args[1].equals("!") || args[2].equals("!")); } public static final Atom raisebox_macro(final TeXParser tp, final String[] args) throws ParseException { double[] raise = SpaceAtom.getLength(args[1]); if (raise.length == 1) { throw new ParseException("Error in getting raise in \\raisebox command !"); } double[] height = SpaceAtom.getLength(args[3]); double[] depth = SpaceAtom.getLength(args[4]); if (height.length == 1 || height[1] == 0) { height = new double[] { -1, 0 }; } if (depth.length == 1 || depth[1] == 0) { depth = new double[] { -1, 0 }; } return new RaiseAtom(new TeXFormula(tp, args[2]).root, (int) raise[0], raise[1], (int) height[0], height[1], (int) depth[0], depth[1]); } public static final Atom shadowbox_macro(final TeXParser tp, final String[] args) throws ParseException { return new ShadowAtom(new TeXFormula(tp, args[1]).root); } public static final Atom ovalbox_macro(final TeXParser tp, final String[] args) throws ParseException { return new OvalAtom(new TeXFormula(tp, args[1]).root); } public static final Atom doublebox_macro(final TeXParser tp, final String[] args) throws ParseException { return new DoubleFramedAtom(new TeXFormula(tp, args[1]).root); } public static final Atom definecolor_macro(final String[] args) throws ParseException { Color color = null; if ("gray".equals(args[2])) { double f = Double.parseDouble(args[3]); color = graphics.createColor(f, f, f); } else if ("rgb".equals(args[2])) { String[] tokens = args[3].split(",|;"); if (tokens.length != 3) { throw new ParseException("The color definition must have three components !"); } double r = Double.parseDouble(tokens[0].trim()); double g = Double.parseDouble(tokens[1].trim()); double b = Double.parseDouble(tokens[2].trim()); color = graphics.createColor(r, g, b); } else if ("cmyk".equals(args[2])) { String[] tokens = args[3].split(",|;"); if (tokens.length != 4) { throw new ParseException("The color definition must have four components !"); } double[] cmyk = new double[4]; for (int i = 0; i < 4; i++) { cmyk[i] = Double.parseDouble(tokens[i].trim()); } double k = 1 - cmyk[3]; color = graphics.createColor(k * (1 - cmyk[0]), k * (1 - cmyk[1]), k * (1 - cmyk[2])); } else { throw new ParseException("The color model is incorrect !"); } ColorAtom.Colors.put(args[1], color); return null; } public static final Atom fgcolor_macro(final TeXParser tp, final String[] args) throws ParseException { try { return new ColorAtom(new TeXFormula(tp, args[2]).root, null, ColorAtom.getColor(args[1])); } catch (NumberFormatException e) { throw new ParseException(e.toString()); } } public static final Atom bgcolor_macro(final TeXParser tp, final String[] args) throws ParseException { try { return new ColorAtom(new TeXFormula(tp, args[2]).root, ColorAtom.getColor(args[1]), null); } catch (NumberFormatException e) { throw new ParseException(e.toString()); } } public static final Object cellcolor_macro(final TeXParser tp, final String[] args) throws ParseException { try { tp.cellColor(ColorAtom.getColor(args[1])); return null; } catch (NumberFormatException e) { throw new ParseException(e.toString()); } } public static final Atom selection_macro(final TeXParser tp, final String[] args) throws ParseException { try { return new SelectionAtom(new TeXFormula(tp, args[1]).root, ColorAtom.getColor("#CCCCFF"), null); } catch (NumberFormatException e) { throw new ParseException(e.toString()); } } public static final Atom cursor_macro(final String[] args) throws ParseException { try { return new CursorAtom( FactoryProvider.getInstance().getGraphicsFactory() .createColor( GraphicsFactory.CURSOR_RED, GraphicsFactory.CURSOR_GREEN, GraphicsFactory.CURSOR_BLUE), Double.parseDouble(args[1])); } catch (NumberFormatException e) { throw new ParseException(e.toString()); } } public static final Atom textcolor_macro(final TeXParser tp, final String[] args) throws ParseException { return new ColorAtom(new TeXFormula(tp, args[2]).root, null, ColorAtom.getColor(args[1])); } public static final Atom colorbox_macro(final TeXParser tp, final String[] args) throws ParseException { Color c = ColorAtom.getColor(args[1]); return new FBoxAtom(new TeXFormula(tp, args[2]).root, c, c); } public static final Atom cancel_macro(final TeXParser tp, final String[] args, Type type) throws ParseException { return new CancelAtom(new TeXFormula(tp, args[1]).root, type); } public static final Atom fcolorbox_macro(final TeXParser tp, final String[] args) throws ParseException { return new FBoxAtom(new TeXFormula(tp, args[3]).root, ColorAtom.getColor(args[2]), ColorAtom.getColor(args[1])); } public static final Atom cong_macro() throws ParseException { VRowAtom vra = new VRowAtom(SymbolAtom.get("equals")); vra.add(new SpaceAtom(TeXConstants.UNIT_MU, 0f, 1.5f, 0f)); vra.add(SymbolAtom.get("sim")); vra.setRaise(TeXConstants.UNIT_MU, -1f); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, vra); } public static final Atom doteq_macro() throws ParseException { Atom at = new UnderOverAtom(SymbolAtom.get("equals"), SymbolAtom.get("ldotp"), TeXConstants.UNIT_MU, 3.7f, false, true); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } // public static final Atom jlmDynamic_macro(final TeXParser tp, final String[] args) throws ParseException { // if (DynamicAtom.hasAnExternalConverterFactory()) { // return new DynamicAtom(args[1], args[2]); // } else { // throw new ParseException("No ExternalConverterFactory set !"); // } // } // public static final Atom jlmExternalFont_macro(final String[] args) // throws ParseException { // JavaFontRenderingBox.setFont(args[1]); // return null; // } // // public static final Atom jlmText_macro(final String[] args) throws // ParseException { // return new JavaFontRenderingAtom(args[1], Font.PLAIN); // } // // public static final Atom jlmTextit_macro(final String[] args) throws // ParseException { // return new JavaFontRenderingAtom(args[1], Font.ITALIC); // } // // public static final Atom jlmTextbf_macro(final String[] args) throws // ParseException { // return new JavaFontRenderingAtom(args[1], Font.BOLD); // } // // public static final Atom jlmTextitbf_macro(final String[] args) throws // ParseException { // return new JavaFontRenderingAtom(args[1], Font.BOLD | Font.ITALIC); // } // public static final Atom DeclareMathSizes_macro(final TeXParser tp, final String[] args) // throws ParseException { // DefaultTeXFont.setMathSizes(Double.parseDouble(args[1]), Double.parseDouble(args[2]), // Double.parseDouble(args[3]), Double.parseDouble(args[4])); // return null; // } // public static final Atom magnification_macro(final TeXParser tp, final String[] args) // throws ParseException { // DefaultTeXFont.setMagnification(Double.parseDouble(args[1])); // return null; // } public static final Atom hline_macro(final TeXParser tp) throws ParseException { if (!tp.isArrayMode()) { throw new ParseException("The macro \\hline is only available in array mode !"); } return new HlineAtom(); } public static final Atom size_macros(final TeXParser tp, final String[] args) throws ParseException { double f = 1f; if ("tiny".equals(args[0])) { f = 0.5f; } else if ("scriptsize".equals(args[0])) { f = 0.7f; } else if ("footnotesize".equals(args[0])) { f = 0.8f; } else if ("small".equals(args[0])) { f = 0.9f; } else if ("normalsize".equals(args[0])) { f = 1f; } else if ("large".equals(args[0])) { f = 1.2f; } else if ("Large".equals(args[0])) { f = 1.4f; } else if ("LARGE".equals(args[0])) { f = 1.8f; } else if ("huge".equals(args[0])) { f = 2f; } else if ("Huge".equals(args[0])) { f = 2.5f; } return new MonoScaleAtom(new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root, f); } public static final Atom jlatexmathcumsup_macro(final TeXParser tp, final String[] args) throws ParseException { return new CumulativeScriptsAtom(tp.getLastAtom(), null, new TeXFormula(tp, args[1]).root); } public static final Atom jlatexmathcumsub_macro(final TeXParser tp, final String[] args) throws ParseException { return new CumulativeScriptsAtom(tp.getLastAtom(), new TeXFormula(tp, args[1]).root, null); } public static final Atom dotminus_macro() throws ParseException { Atom at = new UnderOverAtom(SymbolAtom.get("minus"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, -3.3f, false, true); return new TypedAtom(TeXConstants.TYPE_BINARY_OPERATOR, TeXConstants.TYPE_BINARY_OPERATOR, at); } public static final Atom ratio_macro() throws ParseException { Atom at = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom geoprop_macro() throws ParseException { RowAtom ddot = new RowAtom(SymbolAtom.get("normaldot")); ddot.add(new SpaceAtom(TeXConstants.UNIT_MU, 4f, 0f, 0f)); ddot.add(SymbolAtom.get("normaldot")); Atom at = new UnderOverAtom(SymbolAtom.get("minus"), ddot, TeXConstants.UNIT_MU, -3.4f, false, ddot, TeXConstants.UNIT_MU, -3.4f, false); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom minuscolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("minus")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); at.add(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom minuscoloncolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("minus")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); at.add(colon); at.add(colon); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom simcolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("sim")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); at.add(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom simcoloncolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("sim")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); at.add(colon); at.add(colon); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom approxcolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("approx")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); at.add(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom approxcoloncolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("approx")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); at.add(colon); at.add(colon); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom equalscolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("equals")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); at.add(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom equalscoloncolon_macro() throws ParseException { RowAtom at = new RowAtom(SymbolAtom.get("equals")); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.095f, 0f, 0f)); Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); at.add(colon); at.add(colon); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom colonminus_macro() throws ParseException { RowAtom at = new RowAtom(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("minus")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom coloncolonminus_macro() throws ParseException { Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); RowAtom at = new RowAtom(colon); at.add(colon); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("minus")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom colonequals_macro() throws ParseException { RowAtom at = new RowAtom(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("equals")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom coloncolonequals_macro() throws ParseException { Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); RowAtom at = new RowAtom(colon); at.add(colon); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("equals")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom coloncolon_macro() throws ParseException { Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); RowAtom at = new RowAtom(colon); at.add(colon); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom colonsim_macro() throws ParseException { RowAtom at = new RowAtom(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("sim")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom coloncolonsim_macro() throws ParseException { Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); RowAtom at = new RowAtom(colon); at.add(colon); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("sim")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom colonapprox_macro() throws ParseException { RowAtom at = new RowAtom(new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true)); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("approx")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom coloncolonapprox_macro() throws ParseException { Atom colon = new UnderOverAtom(SymbolAtom.get("normaldot"), SymbolAtom.get("normaldot"), TeXConstants.UNIT_MU, 5.2f, false, true); RowAtom at = new RowAtom(colon); at.add(colon); at.add(new SpaceAtom(TeXConstants.UNIT_EM, -0.32f, 0f, 0f)); at.add(SymbolAtom.get("approx")); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom smallfrowneq_macro() throws ParseException { Atom at = new UnderOverAtom(SymbolAtom.get("equals"), SymbolAtom.get("smallfrown"), TeXConstants.UNIT_MU, -2f, true, true); return new TypedAtom(TeXConstants.TYPE_RELATION, TeXConstants.TYPE_RELATION, at); } public static final Atom hstrok_macro(final TeXParser tp) throws ParseException { RowAtom ra = new RowAtom(new SpaceAtom(TeXConstants.UNIT_EX, -0.1f, 0f, 0f)); ra.add(SymbolAtom.get("bar")); VRowAtom vra = new VRowAtom(new LapedAtom(ra, 'r')); vra.setRaise(TeXConstants.UNIT_EX, -0.1f); RowAtom at = new RowAtom(vra); at.add(new RomanAtom(new CharAtom('h', tp.formula.textStyle))); return at; } public static final Atom Hstrok_macro(final TeXParser tp) throws ParseException { RowAtom ra = new RowAtom(new SpaceAtom(TeXConstants.UNIT_EX, 0.28f, 0f, 0f)); ra.add(SymbolAtom.get("textendash")); VRowAtom vra = new VRowAtom(new LapedAtom(ra, 'r')); vra.setRaise(TeXConstants.UNIT_EX, 0.55f); RowAtom at = new RowAtom(vra); at.add(new RomanAtom(new CharAtom('H', tp.formula.textStyle))); return at; } public static final Atom dstrok_macro(final TeXParser tp) throws ParseException { RowAtom ra = new RowAtom(new SpaceAtom(TeXConstants.UNIT_EX, 0.25f, 0f, 0f)); ra.add(SymbolAtom.get("bar")); VRowAtom vra = new VRowAtom(new LapedAtom(ra, 'r')); vra.setRaise(TeXConstants.UNIT_EX, -0.1f); RowAtom at = new RowAtom(vra); at.add(new RomanAtom(new CharAtom('d', tp.formula.textStyle))); return at; } public static final Atom Dstrok_macro(final TeXParser tp) throws ParseException { RowAtom ra = new RowAtom(new SpaceAtom(TeXConstants.UNIT_EX, -0.1f, 0f, 0f)); ra.add(SymbolAtom.get("bar")); VRowAtom vra = new VRowAtom(new LapedAtom(ra, 'r')); vra.setRaise(TeXConstants.UNIT_EX, -0.55f); RowAtom at = new RowAtom(vra); at.add(new RomanAtom(new CharAtom('D', tp.formula.textStyle))); return at; } public static final Atom kern_macro(final String[] args) throws ParseException { double[] info = SpaceAtom.getLength(args[1]); if (info.length == 1) { throw new ParseException("Error in getting kern in \\kern command !"); } return new SpaceAtom((int) info[0], info[1], 0f, 0f); } public static final Atom char_macro(final TeXParser tp, final String[] args) throws ParseException { String number = args[1]; int radix = 10; if (number.startsWith("0x") || number.startsWith("0X")) { number = number.substring(2); radix = 16; } else if (number.startsWith("x") || number.startsWith("X")) { number = number.substring(1); radix = 16; } else if (number.startsWith("0")) { number = number.substring(1); radix = 8; } int n = Integer.parseInt(number, radix); return tp.convertCharacter((char) n, true); } public static final Atom T_macro(final TeXParser tp, final String[] args) throws ParseException { return new RotateAtom(new TeXFormula(tp, args[1]).root, 180, "origin=cc"); } public static final Atom romannumeral_macro(final String[] args) throws ParseException { int[] numbers = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String[] letters = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" }; String roman = ""; int num = Integer.parseInt(args[1].trim()); for (int i = 0; i < numbers.length; i++) { while (num >= numbers[i]) { roman += letters[i]; num -= numbers[i]; } } if (args[0].charAt(0) == 'r') { roman = roman.toLowerCase(); } return new TeXFormula(roman, false).root; } public static final Atom textcircled_macro(final TeXParser tp, final String[] args) throws ParseException { return new TextCircledAtom(new RomanAtom(new TeXFormula(tp, args[1]).root)); } public static final Atom textsc_macro(final TeXParser tp, final String[] args) throws ParseException { return new SmallCapAtom(new TeXFormula(tp, args[1], false).root); } public static final Atom sc_macro(final TeXParser tp) throws ParseException { return new SmallCapAtom( new TeXFormula(tp, tp.getOverArgument(), null, false, tp.isIgnoreWhiteSpace()).root); } public static final Atom quad_macro() throws ParseException { return new SpaceAtom(TeXConstants.UNIT_EM, 1f, 0f, 0f); } public static final Atom qquad_macro() throws ParseException { return new SpaceAtom(TeXConstants.UNIT_EM, 2f, 0f, 0f); } public static final Atom muskip_macros(final String[] args) throws ParseException { int type = 0; if (args[0].equals(",")) { type = TeXConstants.THINMUSKIP; } else if (args[0].equals(":")) { type = TeXConstants.MEDMUSKIP; } else if (args[0].equals(";")) { type = TeXConstants.THICKMUSKIP; } else if (args[0].equals("thinspace")) { type = TeXConstants.THINMUSKIP; } else if (args[0].equals("medspace")) { type = TeXConstants.MEDMUSKIP; } else if (args[0].equals("thickspace")) { type = TeXConstants.THICKMUSKIP; } else if (args[0].equals("!")) { type = TeXConstants.NEGTHINMUSKIP; } else if (args[0].equals("negthinspace")) { type = TeXConstants.NEGTHINMUSKIP; } else if (args[0].equals("negmedspace")) { type = TeXConstants.NEGMEDMUSKIP; } else if (args[0].equals("negthickspace")) { type = TeXConstants.NEGTHICKMUSKIP; } return new SpaceAtom(type); } public static final Atom surd_macro() throws ParseException { return new VCenteredAtom(SymbolAtom.get("surdsign")); } public static final Atom int_macro() throws ParseException { Atom integral = SymbolAtom.get("int").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; return integral; } public static final Atom oint_macro() throws ParseException { Atom integral = SymbolAtom.get("oint").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; return integral; } public static final Atom iint_macro() throws ParseException { Atom integral = SymbolAtom.get("int").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; RowAtom ra = new RowAtom(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.lookAtLastAtom = true; return new TypedAtom(TeXConstants.TYPE_BIG_OPERATOR, TeXConstants.TYPE_BIG_OPERATOR, ra); } public static final Atom iiint_macro() throws ParseException { Atom integral = SymbolAtom.get("int").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; RowAtom ra = new RowAtom(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.lookAtLastAtom = true; return new TypedAtom(TeXConstants.TYPE_BIG_OPERATOR, TeXConstants.TYPE_BIG_OPERATOR, ra); } public static final Atom iiiint_macro() throws ParseException { Atom integral = SymbolAtom.get("int").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; RowAtom ra = new RowAtom(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -6f, 0f, 0f)); ra.add(integral); ra.lookAtLastAtom = true; return new TypedAtom(TeXConstants.TYPE_BIG_OPERATOR, TeXConstants.TYPE_BIG_OPERATOR, ra); } public static final Atom idotsint_macro() throws ParseException { Atom integral = SymbolAtom.get("int").duplicate(); integral.type_limits = TeXConstants.SCRIPT_NOLIMITS; RowAtom ra = new RowAtom(integral); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -1f, 0f, 0f)); Atom cdotp = SymbolAtom.get("cdotp"); RowAtom cdots = new RowAtom(cdotp); cdots.add(cdotp); cdots.add(cdotp); ra.add(new TypedAtom(TeXConstants.TYPE_INNER, TeXConstants.TYPE_INNER, cdots)); ra.add(new SpaceAtom(TeXConstants.UNIT_MU, -1f, 0f, 0f)); ra.add(integral); ra.lookAtLastAtom = true; return new TypedAtom(TeXConstants.TYPE_BIG_OPERATOR, TeXConstants.TYPE_BIG_OPERATOR, ra); } public static final Atom lmoustache_macro() throws ParseException { Atom at = new BigDelimiterAtom( (SymbolAtom) SymbolAtom.get("lmoustache").duplicate(), 1); at.type = TeXConstants.TYPE_OPENING; return at; } public static final Atom rmoustache_macro() throws ParseException { Atom at = new BigDelimiterAtom( (SymbolAtom) SymbolAtom.get("rmoustache").duplicate(), 1); at.type = TeXConstants.TYPE_CLOSING; return at; } public static final Atom insertBreakMark_macro() throws ParseException { return new BreakMarkAtom(); } public static final Atom jlmXML_macro(final TeXParser tp, final String[] args) throws ParseException { Map<String, String> map = tp.formula.jlmXMLMap; String str = args[1]; StringBuilder buffer = new StringBuilder(); int start = 0; int pos; while ((pos = str.indexOf("$")) != -1) { if (pos < str.length() - 1) { start = pos; while (++start < str.length() && java.lang.Character.isLetter(str.charAt(start))) { ; } String key = str.substring(pos + 1, start); String value = map.get(key); if (value != null) { buffer.append(str.substring(0, pos)); buffer.append(value); } else { buffer.append(str.substring(0, start)); } str = str.substring(start); } else { buffer.append(str); str = ""; } } buffer.append(str); str = buffer.toString(); return new TeXFormula(tp, str).root; } }