From 4a9c2acbf7a50a6205cc3f42f374a4b3047c9bf1 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Mon, 25 Jul 2016 04:56:31 +0200 Subject: [PATCH] Add some more symbols (#502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds support for the following input sequences: -- --- ` ' `` '' \degree \pounds \maltese resulting in – — ‘ ’ “ ” ° £ ✠ symbols already present in our fonts. As part of this modification, the recognition of multiple dashes was moved from the lexer to the parser. This is neccessary since in math mode a sequence of hyphens is just a sequence of minus signs. Just like a pair of apostrophes in math mode is a double prime not a right double quotation mark. To make this easier, parseGroup and parseOptionalGroup have been merged. --- src/Lexer.js | 6 +- src/Parser.js | 83 ++++++++++-------- src/buildCommon.js | 8 +- src/symbols.js | 14 ++- .../images/DashesAndQuotes-chrome.png | Bin 0 -> 8466 bytes .../images/DashesAndQuotes-firefox.png | Bin 0 -> 8203 bytes test/screenshotter/images/Symbols1-chrome.png | Bin 0 -> 6420 bytes .../screenshotter/images/Symbols1-firefox.png | Bin 0 -> 5519 bytes test/screenshotter/ss_data.yaml | 4 + test/screenshotter/test.tex | 2 +- 10 files changed, 73 insertions(+), 44 deletions(-) create mode 100644 test/screenshotter/images/DashesAndQuotes-chrome.png create mode 100644 test/screenshotter/images/DashesAndQuotes-firefox.png create mode 100644 test/screenshotter/images/Symbols1-chrome.png create mode 100644 test/screenshotter/images/Symbols1-firefox.png diff --git a/src/Lexer.js b/src/Lexer.js index 648c705b..5243bf28 100644 --- a/src/Lexer.js +++ b/src/Lexer.js @@ -63,7 +63,6 @@ Token.prototype.range = function(endToken, text) { /* The following tokenRegex * - matches typical whitespace (but not NBSP etc.) using its first group - * - matches symbol combinations which result in a single output character * - does not match any control character \x00-\x1f except whitespace * - does not match a bare backslash * - matches any ASCII character except those just mentioned @@ -78,9 +77,8 @@ Token.prototype.range = function(endToken, text) { * still reject the input. */ var tokenRegex = new RegExp( - "([ \r\n\t]+)|(" + // whitespace - "---?" + // special combinations - "|[!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint + "([ \r\n\t]+)|" + // whitespace + "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair "|\\\\(?:[a-zA-Z]+|[^\uD800-\uDFFF])" + // function name ")" diff --git a/src/Parser.js b/src/Parser.js index 64b1689b..4bfde913 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -545,7 +545,7 @@ Parser.prototype.parseArguments = function(func, funcData) { if (argType) { arg = this.parseGroupOfType(argType, true); } else { - arg = this.parseOptionalGroup(); + arg = this.parseGroup(true); } if (!arg) { args.push(null); @@ -623,12 +623,7 @@ Parser.prototype.parseGroupOfType = function(innerMode, optional) { } // By the time we get here, innerMode is one of "text" or "math". // We switch the mode of the parser, recurse, then restore the old mode. - var res; - if (optional) { - res = this.parseOptionalGroup(); - } else { - res = this.parseGroup(); - } + var res = this.parseGroup(optional); this.switchMode(outerMode); return res; }; @@ -638,7 +633,7 @@ Parser.prototype.parseGroupOfType = function(innerMode, optional) { * brace-enclosed tokens plus some position information. * * @param {string} modeName Used to describe the mode in error messages - * @param {boolean} optional Whether the group is optional or required + * @param {boolean=} optional Whether the group is optional or required */ Parser.prototype.parseStringGroup = function(modeName, optional) { if (optional && this.nextToken.text !== "[") { @@ -707,53 +702,71 @@ Parser.prototype.parseSizeGroup = function(optional) { }; /** - * Parses a group, which is either a single nucleus (like "x") or an expression - * in braces (like "{x+y}") + * If the argument is false or absent, this parses an ordinary group, + * which is either a single nucleus (like "x") or an expression + * in braces (like "{x+y}"). + * If the argument is true, it parses either a bracket-delimited expression + * (like "[x+y]") or returns null to indicate the absence of a + * bracket-enclosed group. * + * @param {boolean=} optional Whether the group is optional or required * @return {?ParseFuncOrArgument} */ -Parser.prototype.parseGroup = function() { +Parser.prototype.parseGroup = function(optional) { var firstToken = this.nextToken; // Try to parse an open brace - if (this.nextToken.text === "{") { + if (this.nextToken.text === (optional ? "[" : "{")) { // If we get a brace, parse an expression this.consume(); - var expression = this.parseExpression(false); + var expression = this.parseExpression(false, optional ? "]" : null); var lastToken = this.nextToken; // Make sure we get a close brace - this.expect("}"); + this.expect(optional ? "]" : "}"); + if (this.mode === "text") { + this.formLigatures(expression); + } return new ParseFuncOrArgument( new ParseNode("ordgroup", expression, this.mode, firstToken, lastToken), false); } else { - // Otherwise, just return a nucleus - return this.parseSymbol(); + // Otherwise, just return a nucleus, or nothing for an optional group + return optional ? null : this.parseSymbol(); } }; /** - * Parses a group, which is an expression in brackets (like "[x+y]") + * Form ligature-like combinations of characters for text mode. + * This includes inputs like "--", "---", "``" and "''". + * The result will simply replace multiple textord nodes with a single + * character in each value by a single textord node having multiple + * characters in its value. The representation is still ASCII source. * - * @return {?ParseFuncOrArgument} + * @param {Array.} group the nodes of this group, + * list will be moified in place */ -Parser.prototype.parseOptionalGroup = function() { - var firstToken = this.nextToken; - // Try to parse an open bracket - if (this.nextToken.text === "[") { - // If we get a brace, parse an expression - this.consume(); - var expression = this.parseExpression(false, "]"); - var lastToken = this.nextToken; - // Make sure we get a close bracket - this.expect("]"); - return new ParseFuncOrArgument( - new ParseNode("ordgroup", expression, this.mode, - firstToken, lastToken), - false); - } else { - // Otherwise, return null, - return null; +Parser.prototype.formLigatures = function(group) { + var i; + var n = group.length - 1; + for (i = 0; i < n; ++i) { + var a = group[i]; + var v = a.value; + if (v === "-" && group[i + 1].value === "-") { + if (i + 1 < n && group[i + 2].value === "-") { + group.splice(i, 3, new ParseNode( + "textord", "---", "text", a, group[i + 2])); + n -= 2; + } else { + group.splice(i, 2, new ParseNode( + "textord", "--", "text", a, group[i + 1])); + n -= 1; + } + } + if ((v === "'" || v === "`") && group[i + 1].value === v) { + group.splice(i, 2, new ParseNode( + "textord", v + v, "text", a, group[i + 1])); + n -= 1; + } } }; diff --git a/src/buildCommon.js b/src/buildCommon.js index b60e1860..d793b5b3 100644 --- a/src/buildCommon.js +++ b/src/buildCommon.js @@ -23,9 +23,11 @@ var greekCapitals = [ "\\Omega", ]; -var dotlessLetters = [ +// The following have to be loaded from Main-Italic font, using class mainit +var mainitLetters = [ "\u0131", // dotless i, \imath "\u0237", // dotless j, \jmath + "\u00a3", // \pounds ]; /** @@ -101,7 +103,7 @@ var mathit = function(value, mode, color, classes) { if (/[0-9]/.test(value.charAt(0)) || // glyphs for \imath and \jmath do not exist in Math-Italic so we // need to use Main-Italic instead - utils.contains(dotlessLetters, value) || + utils.contains(mainitLetters, value) || utils.contains(greekCapitals, value)) { return makeSymbol( value, "Main-Italic", mode, color, classes.concat(["mainit"])); @@ -126,7 +128,7 @@ var makeOrd = function(group, options, type) { var font = options.font; if (font) { - if (font === "mathit" || utils.contains(dotlessLetters, value)) { + if (font === "mathit" || utils.contains(mainitLetters, value)) { return mathit(value, mode, color, classes); } else { var fontName = fontMap[font].fontName; diff --git a/src/symbols.js b/src/symbols.js index 6170cb5e..aef7c874 100644 --- a/src/symbols.js +++ b/src/symbols.js @@ -589,6 +589,18 @@ defineSymbol(math, main, accent, "\u02d9", "\\dot"); defineSymbol(math, main, mathord, "\u0131", "\\imath"); defineSymbol(math, main, mathord, "\u0237", "\\jmath"); +defineSymbol(text, main, textord, "\u2013", "--"); +defineSymbol(text, main, textord, "\u2014", "---"); +defineSymbol(text, main, textord, "\u2018", "`"); +defineSymbol(text, main, textord, "\u2019", "'"); +defineSymbol(text, main, textord, "\u201c", "``"); +defineSymbol(text, main, textord, "\u201d", "''"); +defineSymbol(math, main, textord, "\u00b0", "\\degree"); +defineSymbol(text, main, textord, "\u00b0", "\\degree"); +defineSymbol(math, main, mathord, "\u00a3", "\\pounds"); +defineSymbol(math, ams, textord, "\u2720", "\\maltese"); +defineSymbol(text, ams, textord, "\u2720", "\\maltese"); + defineSymbol(text, main, spacing, "\u00a0", "\\ "); defineSymbol(text, main, spacing, "\u00a0", " "); defineSymbol(text, main, spacing, "\u00a0", "~"); @@ -605,7 +617,7 @@ for (i = 0; i < mathTextSymbols.length; i++) { } // All of these are textords in text mode -var textSymbols = "0123456789`!@*()-=+[]'\";:?/.,"; +var textSymbols = "0123456789!@*()-=+[]\";:?/.,"; for (i = 0; i < textSymbols.length; i++) { ch = textSymbols.charAt(i); defineSymbol(text, main, textord, ch, ch); diff --git a/test/screenshotter/images/DashesAndQuotes-chrome.png b/test/screenshotter/images/DashesAndQuotes-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..14fdba805131952184af00f006b1a9588a5019c9 GIT binary patch literal 8466 zcmeAS@N?(olHy`uVBq!ia0y~yU}0cjU}oT8U|?XFf6?nA1B1d%PZ!6KiaBrZR?ZQA z`tbP2bn%FYgr{~QTu}mCO`%Kfg&!5ZSS2p{_Wa_gweGJSZ7VXfSGsF&^U^-LIACLz zZPr@dd+b|-R#z-q;riN6^jqhfW;FTDr@wpt2dM2nc}8urztPDv z#%gR1(^h_AVpt)=#K57<&|pA5wWX*(zWn*AKaXondz0bcMUKObIa``#qduPtuMta<1@R8ei!g}Y!BO9~- z>W2TF^6>5Ny6=y#d|AcKeuZb&mR%>Z^Z$JLnYlc#dinmyyfCvmtMXr&&UvdJ2Ba-i5V8v?`38`|GaH(=%L(qPw%kiPJ2F2 zM&wn|x+QxT|JvehyJ6`a{k7LW*3N#{ z7_GfsVt&6#+N%57vDxAKU+n&RY1_FuRlK*AKJL%$`hR8hBq=qC;*x7i^~(%%P z$KRTo8uRXC(FqH|@1vIj`KGrE~Wkn5(xVC3=S1EXEgacd~1V zHftP^#DCtJ_?`sYFA#;wkCB>!nV`q}z8CVAEWDU}a*+xFbd zjeT%?PVW1U?M41#Q>+>Ex0OKs*i~1VFB~uC57A-p z51+ZJy*B>!iYG8@Fz2MG}0N?8K+J7etB1NujK3Rj~B!SzuxfKGQrumXjA#Y)p=1R<^E3@jwDHo z-@Utf6Jy2=y}z~z6a74GU)A&0&kQoNT(9>xT=n1H<=?z zD3>-?IWRrDe5u^i`7Qf>G%wG!jCud(w~zJiK*4i*D)Lune9KRdm5Tp2*?VW`Zy(9& z>6gq^W&zSXQ`7e>=bGk3n+*RIn zH}Y1hai11!FgLmv@b}yd<0hS`zmtRO|6lY;u6yQJ|MP)weT?M!gh2kV^q&l0R;4iL zdF(6v{C;ZY_C25G845ea&NC67Tdj7%D$=pu@Y#$v-tLm0(=@m5TBB7M?{m&LvPFh* z$E_K!_gr?D{2cOtb&p-LuT=aUwT9j14MhyULW~%keL@e~ZkzSdX~}E`;W^c5K_$i= zM?abRh-te_!hz>Jg*xYNmcgkyjqi6kzy58H8 z=T@s__s^P^>$`QgyU(m2*L*UM@3y%8$N%YU9j7veu+%-;m8WLBXNlPrkrTW2<(s>j znez;*MN5yq`^0!-RTJZkphw(q=Dobhe{gL zYD<1GU)|xmQJ@3mJMt-%xtI5xp(=$pf~sJ z8TamG-%USb-n~1GpDExVL(IgQGy8>~+>+jI_N;fp^b@N?*&e)n5^Hs7xBuCD?^;6{ z`{&C^?tl0H>0FSzrGnTOzklzuf7Tq6=|AH3J-%$ud(Y&~3?+U8MNkO%t~~zdAH(&3 zzC~9%Jy!D^kY2g_i_H0@E1Q>F{V_k$TQ~2R+^O^?>G%;0g*lwPzpR+aff#4AJlQ~#$2#aGuK+xggySJEJ7d-D1^t?w6) z&p&$o;r+^G@oNmPu7CFDY|giW1NX&$-hP-pr~Itr;a%Hb-pGEk!?Qo^iN|IywuI8# zPn_pv*ZxX*_Hs9m#Fobor`ycQUc4dk{~Y=9))k>_3fqcbWj^^Sl2G>Q5O>p^XZ(-C z_vpS)2`plHaDHWL)zO*rrp(E?{>3KVzP9@D#ovF9-rT;qPCmKpTTR!NiUz}U(cLj+ z?l&Ym>(^ENc(k|uOUCu|-<;*Yf7dAQ=rwMy{=Y|VI*Wzaq4iIV{qAk7-o4AQ`rixB z=Z~*>u^p)Gn;9d2^Ng)cDEsA?YxpC^mPd!GW3I|D{LS_hiH+{&wwK z9+(rG^+p5oVcUQQ0)|0ybKNB@#rr;X#)q#xZj-)sB&_$k3-J^$i2o=#;JsQD zOgmUtuEOr?{%nPv>XM{`p(`{CeMiIW5Mg{{+XQmXs5_8-EiA1=2ec>)o-4CA`!-xH_U_Wa%N??Ke_pM*Yf*S->2TZ zJV#M|muu8K-s!6HxBd3cIiFB{C;TSEj`pdu)*9dYb*8W{Afx`#WBK*b1v_i+_o>=S*i?)D8oIYY|5FM8Q{?o0S( z`x7dg=&NAA9U^=o#{H8lmF=a{Mq+@+zfvty!`9B3WKbG9-OhDa(5~v2e{luk;UR7VkgvUq>p4n=<74EbjrS%$ z5`ULxVe#)(!Pi?6hv)p5w)OY1H=n)RVISFiec-)`FK@J}CQ@0Dn;uRpspC1i>8lds=?+MAfN zOtPL5_%(gv*-wAh&b53qQA#iE@slgz8>dQ(lw6cwW;gNU!*`3%CG~pT{U2|!d*1SX znN4aZER_D;;MdqE|Fgzv`?G^9zo*WZc)a!Y^3=UXb~5z~&=I! zcmG!}b^N5~_4odwu(xRS$S%XZ-OxcYgQFG*-?7oA}BUZIbQ&T(`^5bKX&G}|~`TpF~ zY+|-twHju>8SZ5G$e(}pjO~D=<%!zFHC(yI78g!B=5OHNU4BMlcct9DmkMv>XO)_5 z;{B%a^I>4E=m+oW|5faURp;IvnrgeC+TvfX`S;Cz6JxGiV*0T3Z^W}BTezj)JQn#9 zF)hLDJHwh+X+7UfY`)FCKCiRB?%_Vh8=6~YvRYezSRp0{brhLv8Mg8c-fvq$1S?|&3SNUqwh26hH2srnPrV>OX9Qo&+>mf zJYOm29b-qnfB%;~hfHsMG@RS`&ur)Y3+?82ydsvfZ-4!9!-PEDdWJiDuN;52!;3?1 z!0 z*8TE-v0wPMwzi5gR5Ki$Fdd~Vlmndd2g7c6B> z==?indF-)g`)q|h?r+jNl_uBl{qgrr<@3L)yxaG1gTN{@M9ozPYA=*NQ+i#bv{nnf**kJJgn!{n8 z8wY>*wy$4)`&!(dWgmE3j)yZ$%ej8CecySL`t1EHJ{M;nZ~Js`;@?-d?>odF)mCKq zzq4q2nPhgDB-4X=yk$8ej2?EgYimwNBr)78ub;Pfvf~lPiZ>Tz#L{$KCoi78_h`-X zzBBf-Ul;#5z$ZWRzq(#LV~YzuZ@+f-{#wyet{$d)+svOPn^(m%u_t_+p>;k! zD)+ukd-=3)dl(D8pV3WR^6AgN7ynEH`_iZCSq6lBJN%mM!8Dn0uET40Ub{Yh*3Lt6 zXV<>?`?*(qX1$sEvmcJjBR<;~{^UCFXP1om^zg4e&+^|+Ib{CO@Y4H@J9plBb0=i` zihZqI5)D7ucho1pZ49?F$bY%Y_ge~YwD`WXiJ#aK=FEM+ZQ#U_s5@?_b87ybt7~hj zx82MBWV3G)yqN;DtR0H`PqZE66lmyw)0h>S=|6e$DN%;+hgW!P z>lE9uI{N1^rN8ag$KNFPD)TkuzuUcU-qg6h9nMpj63i?6d)|CwW;vi+^6OpEq1kQKAuxEJZ{#3Gkz04%81Ao2*%d8O*2WdU6%ovz)k>X}Rs+;ZOT?H^?*3jr}1Wz4CwT z=GPAl-|bsyU;6Kw-o3pH%UG;pz3u)nKj`zERQRsl_OuAYcjgoF)9u=0!gjk$*-ZI5 z`L6Z1-V}{P{BJXul{eQtV0&O5c*bPH{^zyjCRa+dUN1;s&%MVOkypO6;?B$)%D?^O zQ_r0F@a&mAL;6k8hnK#1|F#xaJEk>9{*=1wPo@NZ>%8cU_TB}0CpJ&B&-dA#!N<8R zS~fJ2dD(8p8B!;Gm^Z#oD!sPSVV>!--^+^hI%HdZRX?4RYAKs6U-?{R{^{E(d+*t% z`{aH*v8a)?j(x&DPP6lIH|+nN4}X+@!8=}0y5X^r{=YMI8D)VljZfsR{4MriXV2;V z>1Q5ZJoC}g`tX_0*+=5e|L)rz^e=O|#_Nceg%^3JPr1#wb9%Dz!*{>)<6F{h)mQJE zmUYMaPQU#h_5*)6)jZ$A{dPJ-+UXga-O}ZZr5bo0t}d1ozx_EhNA|AS^6EDyu3!HC zDCUmkZq7u@yZg#d-N@Z?&-R7ps^$Yt7S|&enMuyye{Qvr=}mQx?n$;SR=<-cpFJF6 z&Twvl{JV+zzUs{0GEx_QUaq;$d!U}-+Kv9^)%U){d~2yr2xvbR@#bHEo6crNgT0sU zOWD7aDZOKMNVZh!ZJgS(CtGawkGYrIl)dR*J4Z5ZUfs)^@3IUuSKVaWaL>|x(oMCu zXX@j5xQg!mnDpkg&N0oWb2D$oJhS`Mc{fn}#^N_;?St%V7n(hJ&%*qMy2xmkIgT)n4SKG)`QEccmjfwHV(N0O?~9Z8(`TdDBSs)Y}G+2VWHs*_GJpR&6A>F3Vc zTHhX_=>6Th#g>$@S8p!AVa>|QaUiQae$K~}XVS7xEmLj z$b5WJZx_FF;m+05FS>tQxc;|mk@TCjb06o{?7sQB<>kr9?Y?ur_=Pklw3&XZfu+KeQkC#kW}PRyfYIC;Rw0Q|I)xJ^6xv z-fsBu`~T@AZ>we3ZhlnM30GoRel$#FU+kUiv`1@VPN@Auu^YTN$pR&&$bXKv|mA}(={a*zG%tm#LRq|cS-ZS}sN64y5U zvBzHP?LP6xce$HzRi0Y3_pasE_sRb+)Qan6O=Rpa^?N_B?tYH>{+{A+4u>~4kF48v z^{?>v;;(Nv-YBY$YS_m-=izog&X3X#?gtnh-`(8zQgDUs^?71H%+l}X)(2|5Klw}L z`-%F*`t!}UB~_LC3gT*G>(AdW54*PD@51bw1E1I3@A>JSyrz{+VV{%VyX#vL?yloV zz0jTH$)fNrVbjLHbMy~hn-e(qPqe$e(62L0{G8uDO>O6Sb7$N255jfRtEy^@zV7KX zcCzYx$IdOT=KSg06K3|374K|*Oqg#{z9Z|ztLHv4m)9rH);qkvHrqsbLV9K9r@H3t zD_&X`{V_>Dvqwz2;YY3U_f>_>*4y9iysKG0<>!S3=J%sE6}|oS>)5e~eAmGI~1OsYqvA+yYB5WiMraN`oSMGFa^t?lIKupDL9j z&&Xi4{kiY030n^~rwTBXgw6j``RCkS-^&x6|AoD`T)94eSN+FlPahmK@?uN4#Mk|& zIlE8lvuEpP)9)Al-F1(jFTJn+eO&FgdX*<9a^?4zJ-7T_yY7%@p2M{|gX&*}w_}2j zTh1{2)7o`B(!4TdyP~>|*8k?KzaOaY^*Oe1{;KC!LuW$(q6B;_pV1~uH?Ln6XbGcMCI*?RIV;P`6p@nx|~VUZH2nAo7cZt z{n}jmvb4|XU0laAZ4bVW%dO7M$g5wUvF%#^>%DF3HywWeeM_^i|1`MU ztFzy>dG1%DXavffVCfb|SpYOl_)b;@)9COKi|dwmrHf4k|sg?AqMd42i4 z)v5g{>Jr@#TBQmDpTBvd*HG-uGfh~c;pDmb_qgtVczCR5rAgrCP5O^MzWcD`%?Huc z9$+XCNx5WdOK5*eL++tZSv zZ})4dhOf6Ji*s8(`knYUNxrvsUd^$clPiw>{mx;%*Lc#LIGZN%tShc_OWS|{IX+E7 zM_YqIT)KEc{SS`hbE|8Pojbor%xv4?_LR2$a%pcmA2CMUUOSKR$7Vxo*PkJ~6n6i8 zH0{Q7&F62~?pOa?`^_}$Y;{I2i~f}r-Bz#N-!bjjeIy~$kx?S`jLiK9pWZDy|LIiv zn%tyczdLlRW~o{4`DFdlQaba@y2NAibmSUB{#UU*n0@SySmqJ&ZJz7vt^WUvJyZN7 z-QM@#CFxz+CB^rf?|T#!6>`R{m?&O)jPGTuVNPx5!A(p|A0`=E|88Gz`mDuc^R^ee zPQQ!ZzVziR$-2~Eq5gFlXYvw{?TxTyXnrNpa5VPpgpT{(>v#XZWUsU5*bJ5L2~uzM zX3Z9w<0RB1o+a9S>(_-?*;ye;8}>9X{5dt_c2+@k9~vr4@|IPI}mw%UDo1T^N!UB zT;Id8VSZnnZvmGl2goT|zi0km7}We!ls%#HVD&d=#rvC^|1Ns)`N)k4o69?^7}~BG zGSvFK&vN^}8HeakbCPX*IfJ0{TikcPK6A125IvDKivQHoon3% zy<>YGNypqg{e|~yWfQ{{eTLUPKYdIe-w(VR?N(WP$MrJjz8{~tp|;m&tvo2u#r$EP z;cj1S>~6v{H(q?${PX$AWlLs(Jprquu9ThsKi8YDO;DiWed_ap7sJ@Ner|HF;V=IG_fqQpdxf9p?cH|o_n!1sRyj(0wqDPDUR{>ee zEXba}_WPfk&F`*Vt71#=`!-WNf5Xh$gm>ciUoY9t{XTB%a>L!~-=eEt95JzGK0YTS zcIK5MNn(2fZbx5Pd3Afg{MFsJFBo1n&fn0z{M|;+?b8ger`?}eX0~kp`#NXkkE7aChVfC*7SZg4a&xIcam;aesOK%$b%qimdbXSBRdAev`S= zkc-Wk(@N@t=KG^FEbly$dOv-xZSl)hvX>9X*M0lzAANh8t@TgicXxGJ)&Io4J@eLa zpZ)dlIXi#5zWBL`@rKUVp6JDTf6Y(sdH*KjS&P%v=<;Q@s^{e<|F`@8_4&JVCBw^DT|u-w76% zxV-m{r~K**D?!Q4TldwKrr5XIhw>)dr_J52b?>~bU(Mw0cji|fsPwP3HTOE0pwXDl zQf2Y?)$5tj+keGY$u3ac&VIkLY~KF|yz90t|NSa(L-&2jH2(kF8n6CO?&G(QH)Ck7 zdusF7G2Qmvnrmz7Uo-vQcSrq8l#9t~zAbNeo|mq>B{#D^qbRuM_`g-s{r|c@dnVuY zexCo1N5*`|JVuYbQ|<}f+4@08VEfMZJh!XT=fr2ETfa}axSr?DtS5R5bFCOu#j-xE zT{%5^&iB2G-$hQ0GJkDcX88Zq&-XvdgH~R@v^@6a{l5#3+RGO<iu z(|La`nD6;=e)^r4zjHP&js2o~^Lu%9OWFJFpX8se`_r$S{cgpB%@3c>yq`aP^QQhw zRtIad^LFgpE4cb<*8hL*DgKRH_M6N9_s#0czjbt{d)f1ETPJV2f8^TRB@155?@Dre z7`Y&A=jN@>Wz{E)%8!5k(;Rtk&fGtHZuT~8SF>NZgH`v6(DrlX_ZZr$)5GV#w|iJD zRXKkcb@JJ;(R*Q8`N z*NoxeTB+1CdN;Q}NZuQM`21z&d*9jWdosNOnKqaRH^gjDyDj}s@^VZn^92j-|Ido= zM*mj%-uNfZ+%V1U-Lx}1c@M{3Ug4Dew(HBmpV{u4t4nq;Y`N9DvC?{${KI=DJFjSP z3UVCCJeD)>_q@x$pFFNxI`5{T`MO{|*Ii}{%71--TVtO4_}-_xGoEQlH*|C5Jq?aW-aiBaR$?Zdmj z`Lu>>a-NO8GW};>)tPyf|CXQh`M~?TaQ}-{+}&1D3}Lqxf9OB8yKwK_kjTfAKj-{l zym5Vo{13MJH+B!7O?_GaJ|kY@?xQOEuCmex%fDs5+jsx+zi7QppGBW`9CTR9^kL)Q zW=YxWC7-tDy|b%wzGuf{3(Cy@~Xaqb1$-T zJ}?&81(^TtFWXjq_l9%vx2^lzCqJ4M7Bijw|J=FjZ}_nUYcb56yZkvzPw?LAx6R@) zQ!4(h)>kQAySw}iA49y>uEmF056tVlEK+keXaB#SZn^2H&HM){lKZ~!ZsYy3R`u59 z1^s<*GrD&$J*Z8qHDA_#de1`<_6IK2?n|w0T8rn@e#lUF>^t=P#K*&ntgWIL?roKJ z-z`>iXaC8)rWZf|7rFg_c|+wty)XK=uQzQ!R{Q(jVYhgRhbR6BCGk1rgtzHSHfVn9 z`x1C`_OX}WzBJ#?e{v@O@cHx|?Dku)ytv18cgrGcE+&Eh!D}zffAfb&f5*){)|{>n z4WTz4FdIC4@bO>ri#N9l_NSO_4HIv;W_h{3?1#8}j@g3t?fTg{yBnwTG}N9q^wpkQ z*&kf>ei8qk`ul=)c86_$1gaj(dz<@S|KDUC4u?1XTZ8UxKY!PL{`<|}o~7{r*A0ne zxOaD7IBS&Ly1UJ-PvZjB|0l(MT&cuxdfgAV`G>BDePY~ke)gryoPR=X-u(Uj@xy1y zcL%*$ANaoi_o$X<67PZC>?|4OM;}}$lizryEB@t6m!0a1H!=9E&Uv`yKX36Gez9q` z&VTZgD%U7YWH$KzLhj%4SFz$|+iXj`*c6Hz9{ zhL&|3O!Z$}{q_3Wu^Wr`UjLc4bl)FM+qoLwQ$oZVrgz_4dh2qk+gmxECG|Jiwd;D1 zC?zq7&3_X+eQ)BIm*#(pA6_yIzj<)c*KHgh)DA-TUNt@w* z$^6`)*$j(V64ZYO?J#?PEORGAO!3R5SLIiQ7%@zKE1S%8Y~?-2ZwIrt=l`Bp))d_J z?gP_>M8C@2*R1uu4yn8Ix@s}Je)Ih8p34S4Hm~N~klX)>p+f)cI_*z+bLVg$a7d0@ zSGCWJ?ZI!)f2n7-@ZZzk7rXZK26YR=|IsDw+o!BwakXd4(_9vg8)933y_H%oR#N`_ z$+TO3TbAYhy7l3%+HKP}$KMovpI`Pr^0}~M&g4}#4E(n&wRU8jKN7`yU|!`Cepqy}|6BTE-reeLDuuZX+uyzuIeNYI6H`GY)8(FL@~Yu|ZZqPx+G<98W|M0$tInLa z`EDcUyZzO_`B^L$UwZw2>+(+w6}wNromT();(tHK;* zZk^MAK0c@AuhhHcc&JXw8D>p(K=_Wuein+^Av?&;>vuiyAYs(f$7?*wsKEnBmVn^mVKo#!kL{we=v z&aJjvs&|!b4etN@9dZBfbBpYrkGV|iZ5ZTlolYw`8?F3pA4@^`qFkeA_NvEt&vPG$ zV?FMm_iE;cSsS+-e*XNkdi(y%yLWIJTHc#`PmHzt^7g9dwlk${f@0^qIv4o(^3Uyd zmlJj!-S#`&;#+dC(C?;lj(ZRPr=?UK`2DNY>D@c=IsfhkXWcpF`a>)s-`fA*+u-+n zpVF$zw6@+jQdqGSi zCu3FMnr-p_bH48Te=IfHeP>Qh>6=9>Z=RFdTDJfDZvXi?m0zcQyT9}GTK#`Hd+u|( zaU8h+#)kLY-n07uCmFtTU3}?&`rY(1&#s=I&fBngQ(@!#V_~~XQ`%Fn+Shr?SBg8! zz5g9kJ@50v$M-#bKNNoF-p2O-b>-UfTgu6H;oaVfZD0HLnq2m{zv#!4>|;FA6I@;qbaru7Z+pEi<{lZ(eZh3-xp1?M`g{{QQRMLGC!) z2YFZXW=zpNH`#jTn&$MqTPt49`sTKNA?v+xgZ<}f-kX-GMhlnlRa)Y&_+_{EnmS}%N_e|;avw|cku-Rtg>#s=5+HZ5jJSX!>M z`k%O-$I@$O?UuH04%%lmwfbtF?BQr9D~7ZG{q8={>G`+(Y~epMyV@@)zkk+0Ut-3P zR`W;pePvDME9Lcjjb0x=x65}rm;SD}nUQ7OueOCR>)!QX*OyCg4G;b(nem=!THWDu z0rv|pznlB_f@!;n<^H+qSr&iYf>T_0)#H_4=3nuvJY1=5wfNwS;LFl~dv1PWROis2 z^X`vjj?DW&#)*AwF@G29-Fx)jR^zYrOQVB7xoa2iFTXv(;-1hYMvJ>Y{|mp%O22-P zd9S9~-z9AM?dCiut9xfM8s?R7ZhCS0Udt@=jT3*L+T$u~#ISPPOXg4FXTM#2|0$5M zm!alCoMhF8-Gwi1d|hc)z3Nu)wxW3H-J$<^qvv&~vs7l~IDZSjP_V$({rlwT9nI`v z|3w{6@jB#xmw7zjM{36J+;Zz>X0K;!tL0CdozXwJ>)b8*?b~kGWdBXOzx!5@tO>)) zE0a8DKTBKlf9J+n4keLZh9%G5J+R&RF8EIF#miOc^WLUSKT?}@;ly&5XoI&Ka?P_| znb(||^5$o8*xia_|6_w{GOAThKRrcI%_VuKM=Tk0V!fUNt_(^ZH)t=F88k56j1Wx$5Zq*RAINvmfF0 zkF9hq8vHsK7!GkTDD;d{qd_p53Pv-+Xjw2?9FEoqqqX5^ZAjhP@Xde5`_H(v>U9qp QfM)qUUHx3vIVCg!0HEOY82|tP literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/Symbols1-chrome.png b/test/screenshotter/images/Symbols1-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..d2adc7c85e98836d60e8de2568e688177674bd34 GIT binary patch literal 6420 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 ABLDyZ literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index a2ae511d..4f2ce6d6 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -36,6 +36,7 @@ Cases: | Colors: tex: \blue{a}\color{#0f0}{b}\color{red}{c} nolatex: different syntax and different scope +DashesAndQuotes: \text{``a'' b---c -- d----`e'-{-}-f}--``x'' DeepFontSizing: tex: | a^{\big| x^{\big(}}_{\Big\uparrow} + @@ -109,6 +110,9 @@ SupSubHorizSpacing: | SupSubLeftAlignReset: | \omega^8_{888} \quad \frac{1}{\hat{\omega}^{8}_{888}} \quad \displaystyle\sum_{\omega^{8}_{888}} SupSubOffsets: \displaystyle \int_{2+3}x f^{2+3}+3\lim_{2+3+4+5}f +Symbols1: | + \maltese\degree\pounds\$ + \text{\maltese\degree} Text: \frac{a}{b}\text{c~ {ab} \ e}+fg UnsupportedCmds: tex: \err\,\frac\fracerr3\,2^\superr_\suberr\,\sqrt\sqrterr diff --git a/test/screenshotter/test.tex b/test/screenshotter/test.tex index 2945e8b8..85c5d203 100644 --- a/test/screenshotter/test.tex +++ b/test/screenshotter/test.tex @@ -1,6 +1,6 @@ \documentclass[10pt]{article} -\usepackage{amsmath,amssymb} +\usepackage{amsmath,amssymb,textcomp,gensymb} \usepackage[mathscr]{eucal} \usepackage{eufrak} \usepackage[papersize={133pt,100pt},margin=0.5pt]{geometry}