From 5283a1a995b81f7e003ff4064b7e3e249de91666 Mon Sep 17 00:00:00 2001 From: jkriege2 Date: Wed, 10 Aug 2022 12:12:30 +0200 Subject: [PATCH] JKQTMathText: IMPROVED/REWORKED rendering of blackboard font: now several different rendering modes can be selected using JKQTMathText::setFontBlackboradMode() --- doc/dox/jkqtmathtext_supportedlatex.dox | 7 +- doc/dox/whatsnew.dox | 1 + doc/images/jkqtmathtext/jkqtmathtext_bb.png | Bin 6761 -> 5899 bytes .../jkqtmathtext_bb_font_directly.png | Bin 0 -> 8651 bytes .../jkqtmathtext/jkqtmathtext_bb_sim.png | Bin 10075 -> 0 bytes .../jkqtmathtext/jkqtmathtext_bb_simulate.png | Bin 0 -> 16000 bytes ...qtmathtext_bb_unicode_or_font_directly.png | Bin 0 -> 6484 bytes .../jkqtmathtext_bb_unicode_or_simulate.png | Bin 0 -> 7907 bytes doc/jkqtmathtext_docimages_formating.jkmt | 21 +- examples/jkqtmathtext_test/testform.cpp | 8 +- examples/jkqtmathtext_test/testform.ui | 39 +++- lib/jkqtcommon/jkqtpstringtools.h | 5 + lib/jkqtmathtext/jkqtmathtext.cpp | 15 +- lib/jkqtmathtext/jkqtmathtext.h | 36 ++-- lib/jkqtmathtext/jkqtmathtexttools.cpp | 47 ++++ lib/jkqtmathtext/jkqtmathtexttools.h | 37 ++++ .../nodes/jkqtmathtexttextnode.cpp | 201 +++++++++++++----- lib/jkqtmathtext/nodes/jkqtmathtexttextnode.h | 37 ++-- tools/jkqtmathtext_render/README.md | 2 +- .../jkqtmathtext_render.cpp | 21 +- 20 files changed, 363 insertions(+), 114 deletions(-) create mode 100644 doc/images/jkqtmathtext/jkqtmathtext_bb_font_directly.png delete mode 100644 doc/images/jkqtmathtext/jkqtmathtext_bb_sim.png create mode 100644 doc/images/jkqtmathtext/jkqtmathtext_bb_simulate.png create mode 100644 doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png create mode 100644 doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png diff --git a/doc/dox/jkqtmathtext_supportedlatex.dox b/doc/dox/jkqtmathtext_supportedlatex.dox index dce5b5433f..0677471e9c 100644 --- a/doc/dox/jkqtmathtext_supportedlatex.dox +++ b/doc/dox/jkqtmathtext_supportedlatex.dox @@ -34,7 +34,12 @@ - \c \\textfrak{...} \c \\mathfrak{...} : draw the contained text in fraktur font face \image html jkqtmathtext/jkqtmathtext_frak.png - \c \\textscript{...} \c \\mathscript{...} : draw the contained text in script font face \image html jkqtmathtext/jkqtmathtext_script.png - \c \\textbb{...} \c \\mathbb{...} : draw the contained text in blackboard font face \image html jkqtmathtext/jkqtmathtext_bb.png - The class JKQTMathText also supports simulating blackboard fonts, if they are not available as an actual font on the system. Then the example would look like this: \image html jkqtmathtext/jkqtmathtext_bb_sim.png + Blackboard fonts are not widely available on target systems (viable fonts are e.g. "Double Stroke", "CloisterOpenFace BT", "GoudyHandtooled BT", "Castellar", "MathJax_AMS", "Castellar Standard", "MathJax_AMS Standard", "Colonna MT"). But the most important blackboard characters are usually available in the higher unicode codepoints of Fonts specialized for math (e.g. XIST, STIX, ASANA). Therefore JKQTMathText supports using these characters, or simulating a blackboard font in addition to using one of the fonts above. You can set that by setting JKQTMathText::setFontBlackboradMode() with one of the options from JKQTMathTextBlackboradDrawingMode: + - MTBBDMfontDirectly: use a blackboard font specified by JKQTMathText::setFontBlackboard() \image html jkqtmathtext/jkqtmathtext_bb_font_directly.png using \c JKQTMathText::setFontBlackboard("Castellar") + - MTBBDMsimulate: \image html jkqtmathtext/jkqtmathtext_bb_simulate.png using \c JKQTMathText::setFontBlackboard("Arial") + - MTBBDMunicodeCharactersOrFontDirectly: \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png using \c JKQTMathText::setFontBlackboard("Castellar") + - MTBBDMunicodeCharactersOrSimulate: \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png using \c JKQTMathText::setFontBlackboard("Arial") + . - \c \\script{...} \c \\textscript{...} \c \\mathscript{...} : draw the contained text in a script font face \image html jkqtmathtext/jkqtmathtext_fonts.png - \c \\sc{...} : draw the text in small caps \image html jkqtmathtext/jkqtmathtext_sc.png - \c \\ul{...} \c \\underline{...} \c \\underlined{...} : draw the text with underlining \image html jkqtmathtext/jkqtmathtext_ul.png diff --git a/doc/dox/whatsnew.dox b/doc/dox/whatsnew.dox index 1c0fe11cf1..3d90084b72 100644 --- a/doc/dox/whatsnew.dox +++ b/doc/dox/whatsnew.dox @@ -53,6 +53,7 @@ Changes, compared to \ref page_whatsnew_V4_0_0 "v4.0.0" include:
  • IMPROVED/NEW/breaking: refactored LaTeX parser in JKQTMathText
  • REMOVED/breaking: \c \\v[a-zA-Z] and shorthand for \c \\vec{a-zA-Z} was removed, implementation of \c \\bbR,\c \\bbC,... changed
  • IMPROVED/REWORKED rendering of text in text- and math-mode. Now it is more consistent with the output of LaTeX itself
  • +
  • IMPROVED/REWORKED rendering of blackboard font: now several different rendering modes can be selected using JKQTMathText::setFontBlackboradMode()
  • BREAKING/REWORKED: The \\verb!...!-command now works the same as in LaTeX
  • NEW: now supports new decoration instructions: \c \\cancel, \c \\xcancel, \c \\bcancel, \c \\sout, \c \\ocirc, \c \\widetilde, \c \\widehat, \c \\breve
  • NEW: reworked drawing of decorations: improved appearance and positioning!
  • diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb.png b/doc/images/jkqtmathtext/jkqtmathtext_bb.png index c34b4b41fd6b13d0349da83c1dd90af31cdfb429..282917bff637aca4a633be181aaf2bd7b1796af8 100644 GIT binary patch literal 5899 zcmZvAby!qU*ZqKiv~+_=#|T3xAfa@34qZcvbV?{CHPQo!C?Oy*bc%pVHzUHpP*Tzi z-Qah9-|ze5_dLJnxl?z}J@?#w_Fil46|bkGN=D2?3<813)YX&>Kp@;7z;_-(0^ohr z?8XuJAo5a!`hq~@`Tt%xcNce$K_I$zbtQSDp!d6Z+Ac=xXMLR)4x)EbmApiR>b_`DX20u0@{xgqVb`PONG~<8HXDbu^ z-(Xyn3k@*k5nWB=H07OD4Gj%1>_U6+m4}tG83I;mR*O5^<@hSM#7SV!^_z8h!$^E@P3Z{K>q|Q!}9a!+rvk>*! z0lHI?WSG>8Tv%W3No?Bsni5u=X{EDD4X=+e>t1K}=&T0rwX(88VudX1i?8HnO~OnM zSeB5I>in@5fk;ZmJ-t0wytq2uooyOQ*j3)G7*Vo|t>V}@yFyJ*#}yP5NW6IE9s^ZX zeN!YF5c4rtG%=>GPL!0Cls!|UpreCr$%`RJOXVcK$3Ey_86WY`qRC}8nWq}P-GeGp zHQr6vDE3rEugD8fwW;AFs5);PCBa8;vu( z`4Kd}xcJobvb4Zm$8bDz&jSYI4!|zl zObO4qPgTBN#Hxxjg%v%v2=Ba~o}T`8H9J@INEr%c4F7u*`0pA`#*Xlt%R)mAdd|Wf zMpjmIw$RsqotjE{9xC^Iy5<3|JRKn( zO~KsU+|H$(Cly=rUFpERXz)K_xBGv*~(liiMCsCoa@H` zJAuKN8#3CMnr0P`mrS^Zp3MiAOc??XQC==E@n|Z3tP|A-?+kj9*Q@*V1`m|NMUEh;w3*lwnW#CPkdeGL3KT%29v%@B@iZkqPUu&kb)<}M-@-g&2XRr)grBxeU9eDku z<3fcw`Zo{cb9ME-wY9bBdgn2jsZei+HMZK61im4WSpM*S&&CwBv{eoCVUP@h?$qxI zJU*VN5?bHuaYEcXJ)K>5ik)kv2GziZ=zgKmcWTJrkq|_EuB=p&VH>*?q9AO!hv3|B z`8F)0-SKu}Vgj0w;j&C`m}-U(a^>`DOrV!);-w;*JaKBHbAp}*=>SFB=2NfNS2h8)Zv!) zM;Ko(jG~N%;+P*IxkVXB%U6e{kQV;y@C7rfp&TezgKyekYpTPGI_hbDPV*?@%|a0o zk=HXbP#_>v-ZPe!au>r}&w%ox7_WMxBkJ5zTjTl>)$d}5IFbL_*ON$JkC}s0axuYw zY@d{i;tr3F+5?~wJLX)vdkoGtIV-wMkIc|0HbR3fnzUL=%F746*=>cUz1KsJHz?Bv zKCN6FZC7^|HZ;)O58Z#g^vLg!kD%cyR1PSC?v(>DRHx4RdSRpt#ziI1k@{*8Yr3T> z%(GFlQO{p891)})}gxHwZo(;2#+oaq;w21(34vdg77JD#L&! zQlZ9w+e8t6NSzTSVA$W10;FL^R+cp8eB3uK>{+6pBuj5PuP!MqyTQ)j(2&1aouqLb z465Sq|42hqlWdKhKiGaX0!*hE7}#7~sIpBHc6)o}8G5-{T0%gEaS1zLdQ<+$B#kTd zYPUHy;ZydBT~H8%ph=}(;{-4*%~R9MMS#lcGt31WR#<}a@)V_~%2 z`v%Fd&3z4~{s(|mza}SRSfv9#V>A#jU~_&0V>CW)!oH4=j@d_95}xkOZ>!B@z!=-x z+gp6sbx@49KqyB)$dZ7d1ROrDVuu>zh)HYCTU`XqvOQ$7hOHz4;<|=O7$1EdjoR4Y z)5&{M3}&OHr6qjR1$woxV9g>MV#KdYzWA((YIYdd9KB#rL3oOumNJ3o( zF`4){Px$ik5*%2eqh31E;=fJzmQ}js@+m&|MW~!i`1Q0={&*u7`v{Fwo4>%+N?9{2 z@vZ-t1FnyID}Bioy~HE3$XA(M>W{FSpLTX;>ZKkkMMXuG)4VLSN6pV8D=ek>6@BPH zU%q^?oJ1uoE!piXb}pt4bLNsw!>7J@n7nQucIK-0MRhX|KWLTWu1h8V$wJe+RDi2Rj;q1a} zEuLC;v=FeVWuY*DjZLbp;isnoeu06`$YPpT!3WFA4Gj(7){ppoY>XoF2nZ*zxO~Jp z^Ru(=Oj@dOv4bA7P4a1<-mhp9eAh1nj*`u&8@F z!7%)6Ozw)b*>kapHs1_L1-|4>KPKRU_0c>-hLMzpafqUI|yibD+j}IxZ`Y@+Z zXDFf!Vt`N1reg-jrE}5q-`kkJ;GN)Ksw5r{ZFKKs5q*J9rK7 zc9X8^N&a+X=6}D3@K%a`%Y>eQKj%(g@}OoOaTFu$?@6QO6T8O z!TuXYhq*7REi>I|F(ldbqqIIrccx5ILo)|x6OwD%5PJJYfZzv6&6qi@Ef7oBP<0T* z(%9JeuP^!_7gqlDywvP%c4LlQx2-krb_sghN-wdLtuQ7<$L3g6Htzf;+|S>i{}x-S z`!S$#Q-JQU7>`<8Tl=Wv;!&i|?5myU_d;R`+ViD+f@?x}MBQ>WZJTJ8E_{;XREjh* z+-g-`;P%vR#J%=zHTzImX>~Em^gy7qArXtk3dhy>RNy5}k9@M@b;pA^XC8;ND_=0p z^}I4XBLpEz?Kb_MY{%XHh#~omL>dn=;?Mjck(e5@mvR-0e0*u&&}pSqQDFgqe3f;3 zx!KQ#1cZf>yT7q9?cm_x^Y#Nly2P@nR1$ij{DuZ`tfyN=dHIjw;o+|WT9^Qc;oBrj zn35?EN|__;miSE<36%@Nle=Y_qW+gzYZpV0LrU%7aLogOIj1Mt50!)D<~X~X6IZ3- zCLQ^CF~)ss=Doy7Dy_2s`%NmOgOjWBA^h|8LR+A2{4F^iZm==UaE7h9?FgPMYtj0Z zWNfsrr)TvpjgsSq_t6xa3Y_|k5Y@K`-s-5YH-s$#WrnV@>Z*01&U>2v-c&z9ynyIB=P6e9c7 zy>g(8gEt$!rZ2i;$pkcOB-!5+Qfc61dUF3FHV9W2VTZ}<>en2l;XEv4MVb;L$U+yM?g~mg<4mUaEzw=;rC|(SWTM9aM8d7Aja?cH#yU~Gx2Gcl~LiUNY zw7#|Viy7WRm0a%Cf8u@1tB8695-) z*FT&a+>;RQ@KJ;?bQf!8Y3aIhrp9TMo^MrDL&U@!+{T&M*qUUq#PICD=&j73(F`QY zPu^z7nhbC1#9`HHe$GA@{1LK8Nli^1>&a1sa1@Q#&V9VppUNqKBm76& zZ<$S=m><%7^uBt4e3(BfSHjbTV7=9M9dI~|qKvg79DkXbcca&~SOrr>?VZIY78a`T zEP>VoTuqF-#<;t;H)Sl>Ppnm?VE>G6t%>$yd~NcStit=Jj?jGiGMA`@1{21RR5E$~ z{BCbv;vGG{j1vQpn3T#!`!5$DpZSD^B`iUC8I-i83i!XSuaCz5`B(=leIERKfb^8~ z`V9iutkmFbw-&imbeG-NvxS!otgOb2grBdG7R}E~Rk()iAq?X4Ez}_-z5fm8Jim9H=c2l*a>+OabH}|dUnF*XW=m)dV_(k z`sV5^GwW@f2bVe(pa(16J$S7Ec)bgCkf0!RJmKysiW8#3jF4RDVW(^F2-|cRtzL&# zMR8E(po|-C=DavziXyKojn|mG%N8R*1j#J`*c9O7*K_Irx z7Gkw#;FY5bKWx!iD%XI%1rWk{_r{yj_D=myW_b^{6Or;{N_$yi?}(xR$d;lol;84L2`Jtr}OfSc+6! zB62Y^pRF2q?M|67&In+A!S!F>AvrMt-UNQQ?Alu&v{IDt8ARk z#?v3^pgAKyEPf6vOMZXcdH!Ap4LX=<7<2p-H4}E4rp1$v)AjqrBB&Bfr1SRlNFFFU zz|NtU;s3JXV@J?#-aMY-FTE(YAWmLo*=j&ThxgC^J0m)`wV40;sYd_?K@2nWXuMoq`31i-^=DO5BnUK11Ao;y1w^v$9XMt2)NrIb!8o;Dh1of{{ghodm;b; literal 6761 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

    =g171lBppUJHY5pb?RNF*;jG5gdHUbv%)-aH z#U*0jrcdv8NPBV%v`q3KpGrzgwL)l9 z0e1cPQ^_k?`(hWgYra~sl2;8Y6kMq4&lMGls;akR7)04)wMt)AbZ1{36h$S?w6{w` z5jBJz9UW=JUB7;jgJ0Y1>gdaD0|AtroLo4Y?LSj}@%Jmb((Bl+!Qe|-uVx=0)0W+6 z`vuS$=}BVWP=$*s6obB9#Ce?@NP2&rQuv=>8bhhquNiOyAfTV&-apgN5{8-QL z4W5TwDLncq%gyp?`eyxoi5x2(?+_D_d@Y1AOYgSEc?P=t3=J92&d#uz7;geGw7zSb z)GZ*XLDNL3UuPq2Y5Az-a@&3j4nJtnowO0w*4CCvU<2)1?|!x;YUV|mmt3kl?pWzRot7dso9&SI^iN;ixlo9b1HOIx_6U|pl*@@QBZ8;@?)6fo5dba# z(Eo3?r)$%Y)<(29y^eR}6%`2#ct1Rhq%%z&Q}YDvS1wQtrlzJwdgG2N5h)i=PEIT3 zI(bWffarPo@}+-D3ias3L}}Aw!a#r7P|||gaW@hA^^J}84l>D%_-}L}?MK@)E3{6) z)8bAs1r65FPym_42?SEuiF7F;$Hz$*w$*e|)yP_Rd7e3fu)hw5%`S1EKOO;Tn_WG+ zmz=t7`yDBS#D}Z*MVd2tFs63Gup{L5{pD}bWzUn52B{I-V{&)#^vss-f7_sJ86O`{ zazWQc-Me=WJ1B}VI^A0dsc$Sd$Smv#D?oZQC|L_o;^P3J7I}`ew&sR^F$f2E?vegs z%>zY)x9nUTKN)8>tlM?CHNip{_;8m#G$iC5XwVw|-3V%Lc*l(340=-ZT%@fUYQRea z1U~3c%_d9Y8)%gXI`~B#7V&*SQam6h1Z!W)31zH)v3sAMz7t#xpw{9t+JRo;{IB5X z=;*>|u~yUh7iPk1;u%PP`q=BpWR%_Zko z!2!!q(G7t=L zBm%%jS^>RN@kl8x7nMZqiBcf*!eUqCqj}Rh)3;xzus~QXtPZ3@jMinBn_ahMI4P@Z z#1OPq2i#;d#gF#hw&#-M$$A@w1%7Z(o9GV@jS^Hak+mvd*;PKo_g0fr{|DSh-&Up~ zwM^VN8!8skUH>L3XgrYTi`K|{_3dS!q!&jHfm&YlG88yxZs1KvZydo zp#NCutEHW0i~_LKR&`ZP*f*b0{&t)9X>eR27Ku@@+#b;~k6EhpK6M0bS;1kl&|ODm zN_m^fN}SiPU$3vPe|-FS3vxL#3balM63XK8AaYz=NJ!{YQ`0oI{zJK3{cw>mw#aj1 zIcwS|KPBcw{n3(funfyJlw^B>d`x)oMvx@P6qSPGF9vyp$4hZ5Jxw^H#73&RE6Us4 zc`)Ny8uz0ImO$B>o0}U<9ZFHAg7WQt!n=2f-{wvZ%SLnfO||vk{OsLR3}>V7`Lh%& znWDb<9}r_d zv>ZIthQkqv6m8QNH3x}T%5{Y|q@{quQczG>Bz?;k64E;`(6uw$ymF*6XP+x0zvzV9 zNBq>wsKPQUpjWae@ z5_kITvwgAc1Pu;L3jNH#l}D)sb6yexws*&TKgQO#UaB7I7cVEdAdyVKU;=^5Lnvyt z{{C(7yUB&y_Sc2e+91o_@bx;b85`k?ON`$K$ZS0>{ zPDn~ZGL!%E_ElAlUi~h`%)C~-_B5PUl_Ii>4cL^z$nuM10W5HN(Y3(!WxESY=VPHI zVPA>gEGaJ57*H&SdZJQ3rd;q=?U)Z{RORz3)2S6imAR9ms)tWb8j3FlWcmw|(yPm? zFgjEAW4?(egMH09z;;h9w5BmT3my{6C-FSj&lUSwqg7s|fbOa;I{==nRpBe^SDw>v znp*M?C2G4>$~|OC#n(@Lq@@E6zGHmQl|K)TmVno~(HsBZ(U!;Af#t?NTJn`@b_uD~ zwu-u_ksjQ0ua84DmLq(7tc;}g>@(H+hL+Wy;PWi*8H*}%1Q6uAyAB4;uC`5)|IJeRX&9TntNd@O;z%G> z@AltSa$f##O7h+=@xMV!k|?C);J+)%Qxi diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb_font_directly.png b/doc/images/jkqtmathtext/jkqtmathtext_bb_font_directly.png new file mode 100644 index 0000000000000000000000000000000000000000..096cfa7de0ca14eb0a920d07500315207526e08e GIT binary patch literal 8651 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 KWh$ghLjDK1Lox;c literal 0 HcmV?d00001 diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb_sim.png b/doc/images/jkqtmathtext/jkqtmathtext_bb_sim.png deleted file mode 100644 index 9754055af1889eb483b1867e7d46c0e942a04816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10075 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 Xd*rEs$^(2YM>=s#_vlMCo5248;?Gb; diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb_simulate.png b/doc/images/jkqtmathtext/jkqtmathtext_bb_simulate.png new file mode 100644 index 0000000000000000000000000000000000000000..67ab273425eaec73aab5e7b7318b8cb985d8d630 GIT binary patch literal 16000 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 literal 0 HcmV?d00001 diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png b/doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png new file mode 100644 index 0000000000000000000000000000000000000000..34dc467f018a327d0c9459747bed3b2335cc0011 GIT binary patch literal 6484 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 WA_ve71+YzmqbR5PrsmcAkpBm6WAPOL literal 0 HcmV?d00001 diff --git a/doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png b/doc/images/jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png new file mode 100644 index 0000000000000000000000000000000000000000..736e2642778e493b76461d87aba89774718b03b8 GIT binary patch literal 7907 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 YdJJzW>LFwYTWbUb85QY@S0+LK53*G^ga7~l literal 0 HcmV?d00001 diff --git a/doc/jkqtmathtext_docimages_formating.jkmt b/doc/jkqtmathtext_docimages_formating.jkmt index 85f3301f31..3a4c0594f1 100644 --- a/doc/jkqtmathtext_docimages_formating.jkmt +++ b/doc/jkqtmathtext_docimages_formating.jkmt @@ -21,11 +21,24 @@ jkqtmathtext_script.png {\backslash}textscript: \textscript{Script text}\ \ \ \ \ {\backslash}mathscript: $\mathscript{L}=T-V$ --- jkqtmathtext_bb.png -{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text} +--fontblackboard=Arial --fontblackboardmode=default +{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}, \mathbb{1, \pi}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text! 123 \pi \"A\"o} --- -jkqtmathtext_bb_sim.png ---fontblackboardsimulated=XITS Math -{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text} +jkqtmathtext_bb_font_directly.png +--fontblackboardmode=font_directly +{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}, \mathbb{1, \pi}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text! 123 \pi \"A\"o} +--- +jkqtmathtext_bb_simulate.png +--fontblackboard=Arial --fontblackboardmode=simulate +{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}, \mathbb{1, \pi}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text! 123 \pi \"A\"o} +--- +jkqtmathtext_bb_unicode_or_font_directly.png +--fontblackboardmode=unicode_or_font_directly +{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}, \mathbb{1, \pi}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text! 123 \pi \"A\"o} +--- +jkqtmathtext_bb_unicode_or_simulate.png +--fontblackboard=Arial --fontblackboardmode=unicode_or_simulate +{\backslash}mathbb: $x\in\mathbb{R}, z\in\mathbb{C}, \mathbb{1, \pi}$\ \ \ \ \ {\backslash}textbb: \textbb{Blackboard text! 123 \pi \"A\"o} --- jkqtmathtext_ol.png {\backslash}ol: \ol{overlined text} diff --git a/examples/jkqtmathtext_test/testform.cpp b/examples/jkqtmathtext_test/testform.cpp index 42127e9240..dbdd86436b 100644 --- a/examples/jkqtmathtext_test/testform.cpp +++ b/examples/jkqtmathtext_test/testform.cpp @@ -283,7 +283,7 @@ TestForm::TestForm(QWidget *parent) : ui->cmbEncodingBlackboard->setCurrentIndex(static_cast(mt.getFontEncodingBlackboard())); ui->cmbUnicodeSymbol->setCurrentFont(QFont(mt.getFallbackFontSymbols())); ui->cmbEncodingSymbol->setCurrentIndex(static_cast(mt.getFontEncodingFallbackFontSymbols())); - ui->chkSimulateBlackboard->setChecked(mt.isFontBlackboardSimulated()); + ui->cmdBlackboradMode->setCurrentText(JKQTMathTextBlackboradDrawingMode2String(mt.getFontBlackboradMode())); @@ -297,7 +297,7 @@ TestForm::TestForm(QWidget *parent) : connect(ui->chkBigBox, SIGNAL(toggled(bool)), this, SLOT(updateMath())); connect(ui->chkAntiAlias, SIGNAL(toggled(bool)), this, SLOT(updateMath())); connect(ui->chkAntiAliasText, SIGNAL(toggled(bool)), this, SLOT(updateMath())); - connect(ui->chkSimulateBlackboard, SIGNAL(toggled(bool)), this, SLOT(updateMath())); + connect(ui->cmdBlackboradMode, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMath())); connect(ui->cmbLastAlign, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMath())); connect(ui->cmbFont, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMath())); connect(ui->cmbScript, SIGNAL(currentIndexChanged(int)), this, SLOT(updateMath())); @@ -446,7 +446,7 @@ QString TestForm::getFonts(const JKQTMathText& mt) const str<<"Script: "<chkSimulateBlackboard->isChecked()); + mt.setFontBlackboradMode(String2JKQTMathTextBlackboradDrawingMode(ui->cmdBlackboradMode->currentText())); if (ui->cmbFont->currentIndex()==1) qDebug()<<"useXITS: "<cmbFont->currentIndex()==2) qDebug()<<"useSTIX: "< - - - - simulate blackboard - - - @@ -528,6 +521,38 @@ + + + + 0 + + + + unicode_or_font_directly + + + + + unicode_or_simulate + + + + + font_directly + + + + + simulate + + + + + default + + + + diff --git a/lib/jkqtcommon/jkqtpstringtools.h b/lib/jkqtcommon/jkqtpstringtools.h index 7fd0a8f096..f93dbefab1 100644 --- a/lib/jkqtcommon/jkqtpstringtools.h +++ b/lib/jkqtcommon/jkqtpstringtools.h @@ -55,6 +55,11 @@ JKQTCOMMON_LIB_EXPORT Qt::BrushStyle jkqtp_String2QBrushStyle(const QString& sty */ JKQTCOMMON_LIB_EXPORT std::string jkqtp_UnicodeToUTF8(uint32_t codepoint); +/** \copydoc jkqtp_UnicodeToUTF8() */ +inline QString jkqtp_UnicodeToUTF8Q(uint32_t codepoint) { + return QString::fromStdString(jkqtp_UnicodeToUTF8(codepoint)); +} + /** \brief convert a double to a string, using the loacle "C" * \ingroup jkqtptools_string */ diff --git a/lib/jkqtmathtext/jkqtmathtext.cpp b/lib/jkqtmathtext/jkqtmathtext.cpp index 3a4573b1b3..728e39c0f0 100644 --- a/lib/jkqtmathtext/jkqtmathtext.cpp +++ b/lib/jkqtmathtext/jkqtmathtext.cpp @@ -99,7 +99,7 @@ JKQTMathText::JKQTMathText(QObject* parent): sqrt_height_factor=1.2; sqrt_smallfont_factor=0.57; - blackboardSimulated=true; + blackboradFontMode=MTBBDMdefault; static QString serifFont="serif"; @@ -166,8 +166,10 @@ JKQTMathText::JKQTMathText(QObject* parent): setFontCaligraphic(decorativeFont, estimateJKQTMathTextFontEncoding(decorativeFont)); if (blackboardFont!="blackboard") { setFontBlackboard(blackboardFont, estimateJKQTMathTextFontEncoding(blackboardFont)); + setFontBlackboradMode(MTBBDMunicodeCharactersOrFontDirectly); } else { - setFontBlackboardSimulated(blackboardFont=="blackboard"); + setFontBlackboard(sansFont, estimateJKQTMathTextFontEncoding(sansFont)); + setFontBlackboradMode(MTBBDMunicodeCharactersOrSimulate); } setFontScript(scriptFont, estimateJKQTMathTextFontEncoding(scriptFont)); setFontFraktur(fracturFont, estimateJKQTMathTextFontEncoding(fracturFont)); @@ -638,20 +640,19 @@ JKQTMathTextFontEncoding JKQTMathText::getFontEncodingMathRoman() const void JKQTMathText::setFontBlackboard(const QString &__value, JKQTMathTextFontEncoding encoding) { - blackboardSimulated=false; auto f=getReplacementFont(__value, __value, encoding); fontDefinitions[MTEblackboard].fontName = f.first; fontDefinitions[MTEblackboard].fontEncoding = f.second; } -void JKQTMathText::setFontBlackboardSimulated(bool doSimulate) +JKQTMathTextBlackboradDrawingMode JKQTMathText::getFontBlackboradMode() const { - blackboardSimulated=doSimulate; + return blackboradFontMode; } -bool JKQTMathText::isFontBlackboardSimulated() const +void JKQTMathText::setFontBlackboradMode(JKQTMathTextBlackboradDrawingMode mode) { - return blackboardSimulated; + blackboradFontMode=mode; } QString JKQTMathText::getFontBlackboard() const diff --git a/lib/jkqtmathtext/jkqtmathtext.h b/lib/jkqtmathtext/jkqtmathtext.h index efc845ae8b..7aed476aca 100644 --- a/lib/jkqtmathtext/jkqtmathtext.h +++ b/lib/jkqtmathtext/jkqtmathtext.h @@ -373,11 +373,12 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathText : public QObject { * */ void setFontBlackboard(const QString & fontName, JKQTMathTextFontEncoding encoding=JKQTMathTextFontEncoding::MTFEStandard); - /** \copydoc blackboardSimulated */ - void setFontBlackboardSimulated(bool doSimulate); - /** \copydoc blackboardSimulated \see setFontBlackboardSimulated() */ - bool isFontBlackboardSimulated() const; - /** \brief retrieves the font to be used for text in the logical font MTEblackboard \see setFontBlackboardSimulated() */ + /** \copydoc blackboradFontMode */ + JKQTMathTextBlackboradDrawingMode getFontBlackboradMode() const; + /** \copydoc blackboradFontMode */ + void setFontBlackboradMode(JKQTMathTextBlackboradDrawingMode mode); + + /** \brief retrieves the font to be used for text in the logical font MTEblackboard \see blackboradFontMode */ QString getFontBlackboard() const; /** \brief set the font \a fontName and it's encoding \a encoding to be used for symbols in the logical font \a font */ void setFallbackFontSymbols(const QString & fontName, JKQTMathTextFontEncoding encoding=JKQTMathTextFontEncoding::MTFEStandard); @@ -635,17 +636,26 @@ class JKQTMATHTEXT_LIB_EXPORT JKQTMathText : public QObject { /** \brief stores information about the different fonts used by LaTeX markup */ QHash fontDefinitions; - /** \brief if enabled, the blackboard-characters are simulated by using font outlines only + + /** \brief specifies how to draw blackboard font characters (i.e. \c \\mathbb{N} ) * - * A possible choice for a blackboard font (Castellar) looks like this: - * \image html jkqtmathtext/jkqtmathtext_bb.png - * If such a font is not available, you can set this property blackboardSimulated - * to \c true and chose a font, like e.g. Arial to output blackboard-letters as: - * \image html jkqtmathtext/jkqtmathtext_bb_sim.png + * Blackboard fonts are not widely available on target systems (viable fonts are e.g. + * "Double Stroke", "CloisterOpenFace BT", "GoudyHandtooled BT", "Castellar", "MathJax_AMS", "Castellar Standard", "MathJax_AMS Standard", "Colonna MT"). + * But the most important blackboard characters are usually available in the higher unicode + * codepoints of Fonts specialized for math (e.g. XIST, STIX, ASANA). * - * \see setFontBlackboard() setFontBlackboardSimulated() + * Therefore JKQTMathText supports using these characters, or simulating a blackboard font in + * addition to using one of the fonts above. You can set that by setting + * JKQTMathText::setFontBlackboradMode() with one of the options from JKQTMathTextBlackboradDrawingMode: + * - MTBBDMfontDirectly: use a blackboard font specified by JKQTMathText::setFontBlackboard() \image html jkqtmathtext/jkqtmathtext_bb_font_directly.png using \c JKQTMathText::setFontBlackboard("Castellar") + * - MTBBDMsimulate: \image html jkqtmathtext/jkqtmathtext_bb_simulate.png using \c JKQTMathText::setFontBlackboard("Arial") + * - MTBBDMunicodeCharactersOrFontDirectly: \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png using \c JKQTMathText::setFontBlackboard("Castellar") + * - MTBBDMunicodeCharactersOrSimulate: \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png using \c JKQTMathText::setFontBlackboard("Arial") + * . + * + * \see setFontBlackboard() setBlackboardFontMode() */ - bool blackboardSimulated; + JKQTMathTextBlackboradDrawingMode blackboradFontMode; /** \brief resizing factor for braces in math mode */ diff --git a/lib/jkqtmathtext/jkqtmathtexttools.cpp b/lib/jkqtmathtext/jkqtmathtexttools.cpp index 124c0558dc..369414846a 100644 --- a/lib/jkqtmathtext/jkqtmathtexttools.cpp +++ b/lib/jkqtmathtext/jkqtmathtexttools.cpp @@ -548,6 +548,19 @@ QFont JKQTMathTextEnvironment::getFont(JKQTMathText* parent) const { return f; } +JKQTMathTextEnvironment JKQTMathTextEnvironment::exchangedFontForRoman() const +{ + if (insideMath) return exchangedFontFor(MTEmathRoman); + else return exchangedFontFor(MTEroman); +} + +JKQTMathTextEnvironment JKQTMathTextEnvironment::exchangedFontFor(JKQTMathTextEnvironmentFont font) const +{ + JKQTMathTextEnvironment newEnv=*this; + newEnv.font=font; + return newEnv; +} + QString JKQTMathTextEnvironment::toHtmlStart(JKQTMathTextEnvironment defaultEv, JKQTMathText* parentMathText) const { QString s; if (fontSizeUnit==POINTS) s=s+"font-size: "+QLocale::c().toString(fontSize)+"pt; "; @@ -845,3 +858,37 @@ JKQTMathTextVerticalOrientation String2JKQTMathTextVerticalOrientation(QString t if (tokenName=="c" || tokenName=="center" || tokenName=="centered") return MTVOCentered; return MTVOCentered; } + +QString JKQTMathTextBlackboradDrawingMode2String(JKQTMathTextBlackboradDrawingMode mode) +{ + switch(mode) { + case MTBBDMfontDirectly: return "font_directly"; + case MTBBDMsimulate: return "simulate"; + case MTBBDMunicodeCharactersOrFontDirectly: return "unicode_or_font_directly"; + case MTBBDMunicodeCharactersOrSimulate: return "unicode_or_simulate"; + } + return "font_directly"; +} + + +JKQTMathTextBlackboradDrawingMode String2JKQTMathTextBlackboradDrawingMode(QString mode) +{ + mode=mode.toLower().simplified().trimmed(); + if (mode=="font_directly" || mode=="font" || mode=="directly") return MTBBDMfontDirectly; + if (mode=="simulate") return MTBBDMsimulate; + if (mode=="unicode_or_font_directly" || mode=="unicode_or_font" || mode=="unicode_or_directly") return MTBBDMunicodeCharactersOrFontDirectly; + if (mode=="unicode_or_simulate") return MTBBDMunicodeCharactersOrSimulate; + if (mode=="default") return MTBBDMdefault; + return MTBBDMdefault; +} + +void JKQTMathTextDrawStringSimBlackboard(QPainter &painter, const QFont &f, const QColor& color, double x, double y, const QString &txt) +{ + const QFontMetricsF fm(f, painter.device()); + const QPen p(color, fm.lineWidth()/4.0, Qt::SolidLine); + painter.setPen(p); + QPainterPath path; + path.addText(QPointF(x, y), f, txt); + path.addText(QPointF(x+fm.lineWidth()/2.0, y), f, txt); + painter.drawPath(path); +} diff --git a/lib/jkqtmathtext/jkqtmathtexttools.h b/lib/jkqtmathtext/jkqtmathtexttools.h index 265a0c4d04..c3b97dd67a 100644 --- a/lib/jkqtmathtext/jkqtmathtexttools.h +++ b/lib/jkqtmathtext/jkqtmathtexttools.h @@ -139,6 +139,31 @@ enum JKQTMathTextFontEncoding { JKQTMATHTEXT_LIB_EXPORT JKQTMathTextFontEncoding estimateJKQTMathTextFontEncoding(QFont font); +/** \brief used to specify how blackboard-fonts are drawn + * \ingroup jkqtmathtext_tools + * + * \see JKQTMathTextBlackboradDrawingMode2String(), String2JKQTMathTextBlackboradDrawingMode() +*/ +enum JKQTMathTextBlackboradDrawingMode { + MTBBDMfontDirectly=0, /*!< \brief draw using the font specified by JKQTMathText::setFontBlackboard() \image html jkqtmathtext/jkqtmathtext_bb_font_directly.png */ + MTBBDMsimulate, /*!< \brief simulate a blackboard font (i.e. draw the characters' outline only), based on the font specified by JKQTMathText::setFontBlackboard() (e.g. Arial or another sans-serif font is a good choice) \image html jkqtmathtext/jkqtmathtext_bb_simulate.png */ + MTBBDMunicodeCharactersOrFontDirectly, /*!< \brief use the currently set font and look for special unicode-characters in it, uses the fallbackSymbolFont as fallback, use MTBBDMfontDirectly for characters that are not available \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_font_directly.png */ + MTBBDMunicodeCharactersOrSimulate, /*!< \brief use the currently set font and look for special unicode-characters in it, uses the fallbackSymbolFont as fallback, use MTBBDMsimulate for characters that are not available \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png */ + MTBBDMdefault=MTBBDMunicodeCharactersOrFontDirectly /*!< \brief default drawing mode, same as MTBBDMunicodeCharactersOrFontDirectly */ +}; + +/** \brief this converts a JKQTMathTextBlackboradDrawingMode into a string + * \ingroup jkqtmathtext_tools + * \see String2JKQTMathTextBlackboradDrawingMode(), JKQTMathTextBlackboradDrawingMode +*/ +JKQTMATHTEXT_LIB_EXPORT QString JKQTMathTextBlackboradDrawingMode2String(JKQTMathTextBlackboradDrawingMode mode); +/** \brief this converts a QString into a JKQTMathTextBlackboradDrawingMode + * \ingroup jkqtmathtext_tools + * \see JKQTMathTextBlackboradDrawingMode2String(), JKQTMathTextBlackboradDrawingMode +*/ +JKQTMATHTEXT_LIB_EXPORT JKQTMathTextBlackboradDrawingMode String2JKQTMathTextBlackboradDrawingMode(QString mode); + + /** \brief convert MTfontEncoding to a string * \ingroup jkqtmathtext_tools @@ -277,6 +302,10 @@ struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextEnvironment { /** \brief build a
    QFont object from the settings in this object */ QFont getFont(JKQTMathText* parent) const; + /** \brief return a copy of this object with the font exchanged for \a font */ + JKQTMathTextEnvironment exchangedFontFor(JKQTMathTextEnvironmentFont font) const; + /** \brief return a copy of this object with the font exchanged for the matching roman font */ + JKQTMathTextEnvironment exchangedFontForRoman() const; /** \brief return the encoding of the given Font */ JKQTMathTextFontEncoding getFontEncoding(JKQTMathText *parent) const; /** \brief generate a HTML prefix that formats the text after it according to the settings in this object @@ -364,6 +393,14 @@ JKQTMATHTEXT_LIB_EXPORT QPainterPath JKQTMathTextMakeArrow(double x, double y, d */ JKQTMATHTEXT_LIB_EXPORT QPainterPath JKQTMathTextMakeDArrow(double x, double y, double width, double arrowW, bool left=false, bool right=true); +/** \brief draw a given \a txt in the font \a f using additional informaion (but not currentEv::getFont() ) from \a currentEv at (\a x , \a y ) using the given \a painter + * + * This function implements drawing of synthesized fonts, e.g. MTEblackboard when JKQTMathText::isFontBlackboardSimulated() is \c true . + * + * example output: + * \image html jkqtmathtext/jkqtmathtext_bb_unicode_or_simulate.png + */ +JKQTMATHTEXT_LIB_EXPORT void JKQTMathTextDrawStringSimBlackboard(QPainter& painter, const QFont& f, const QColor &color, double x, double y, const QString& txt); struct JKQTMATHTEXT_LIB_EXPORT JKQTMathTextTBRData { explicit JKQTMathTextTBRData(const QFont& f, const QString& text, QPaintDevice *pd); diff --git a/lib/jkqtmathtext/nodes/jkqtmathtexttextnode.cpp b/lib/jkqtmathtext/nodes/jkqtmathtexttextnode.cpp index 22282745df..8d5a4adebb 100644 --- a/lib/jkqtmathtext/nodes/jkqtmathtexttextnode.cpp +++ b/lib/jkqtmathtext/nodes/jkqtmathtexttextnode.cpp @@ -54,26 +54,8 @@ QString JKQTMathTextTextBaseNode::getText() const return text; } -void JKQTMathTextTextBaseNode::drawString(QPainter &painter, const JKQTMathTextEnvironment ¤tEv, double x, double y, const QString &txt) const { - const QFont f=currentEv.getFont(parentMathText); - drawString(painter, currentEv, f, x, y, txt); -} -void JKQTMathTextTextBaseNode::drawString(QPainter &painter, const JKQTMathTextEnvironment ¤tEv, const QFont &f, double x, double y, const QString &txt) const -{ - const QFontMetricsF fm(f, painter.device()); - const QPen p(currentEv.color, fm.lineWidth()/2.0, Qt::SolidLine); - painter.setPen(p); - if (currentEv.font==MTEblackboard && parentMathText->isFontBlackboardSimulated()) { - QPainterPath path; - path.addText(QPointF(x, y), f, txt); - path.addText(QPointF(x+fm.lineWidth()/2.0, y), f, txt); - painter.drawPath(path); - } else { - painter.setFont(f); - painter.drawText(QPointF(x, y), txt); - } -} + QString JKQTMathTextTextBaseNode::textTransform(const QString &text, const JKQTMathTextEnvironment &/*currentEv*/) const { @@ -91,10 +73,34 @@ bool JKQTMathTextTextBaseNode::toHtml(QString &html, JKQTMathTextEnvironment cur +QHash JKQTMathTextTextNode::blackboardUnicodeTable=QHash(); + +void JKQTMathTextTextNode::fillStaticTables() { + if (blackboardUnicodeTable.size()>0) return; + + blackboardUnicodeTable['C']=0x2102; + blackboardUnicodeTable['H']=0x210D; + blackboardUnicodeTable['N']=0x2115; + blackboardUnicodeTable['P']=0x2119; + blackboardUnicodeTable['Q']=0x211A; + blackboardUnicodeTable['R']=0x211D; + blackboardUnicodeTable['Z']=0x2124; + + for (const QChar ch: QString("ABDEFGIJKLMOSTUVWXYZ")) { + blackboardUnicodeTable[ch]=0x1D538+(ch.unicode()-QChar('A').unicode()); + } + for (const QChar ch: QString("abcdefghijklmnopqrstuvwxyz")) { + blackboardUnicodeTable[ch]=0x1D552+(ch.unicode()-QChar('a').unicode()); + } + for (const QChar ch: QString("0123456789")) { + blackboardUnicodeTable[ch]=0x1D7D8+(ch.unicode()-QChar('0').unicode()); + } +} JKQTMathTextTextNode::JKQTMathTextTextNode(JKQTMathText* _parent, const QString& textIn, bool addWhitespace, bool stripInnerWhitepace): JKQTMathTextTextBaseNode(_parent, "") { + fillStaticTables(); QString textTransformed=textIn; if (stripInnerWhitepace) { @@ -117,28 +123,26 @@ JKQTMathTextTextNode::~JKQTMathTextTextNode() = default; void JKQTMathTextTextNode::getSizeInternal(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, const JKQTMathTextNodeSize* /*prevNodeSize*/) { QStringList textpart; - QList fontForcedUpright; + QList fontMode; QList textpartXPos; - getSizeInternalAndData(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos,textpart, fontForcedUpright, textpartXPos); + getSizeInternalAndData(painter, currentEv, width, baselineHeight, overallHeight, strikeoutPos,textpart, fontMode, textpartXPos); } -void JKQTMathTextTextNode::getSizeInternalAndData(QPainter &painter, JKQTMathTextEnvironment currentEv, double &width, double &baselineHeight, double &overallHeight, double &strikeoutPos, QStringList &textpart, QList &fontForcedUpright, QList &textpartXPos) +void JKQTMathTextTextNode::getSizeInternalAndData(QPainter &painter, JKQTMathTextEnvironment currentEv, double &width, double &baselineHeight, double &overallHeight, double &strikeoutPos, QStringList &textpart, QList &fontMode, QList &textpartXPos) { textpart.clear(); - fontForcedUpright.clear(); + fontMode.clear(); const QString txt=textTransform(text, currentEv); - if (currentEv.insideMath && currentEv.insideMathForceDigitsUpright) { - splitTextForMathMode(txt, textpart, fontForcedUpright); - } else { - textpart.append(text); - fontForcedUpright.append(false); - } - + splitTextForLayout(painter, currentEv, txt, textpart, fontMode); const QFont f=currentEv.getFont(parentMathText); - const QFont fnonItalic=JKQTMathTextGetNonItalic(f); - const QFontMetricsF fmNonItalic(fnonItalic, painter.device()); + const QFont fUpright=JKQTMathTextGetNonItalic(f); + const QFont fFallbackSym=currentEv.exchangedFontFor(MTEFallbackSymbols).getFont(parentMathText); + const QFont fRoman=currentEv.exchangedFontForRoman().getFont(parentMathText); + const QFontMetricsF fmUpright(fUpright, painter.device()); const QFontMetricsF fm(f, painter.device()); + const QFontMetricsF fmFallbackSym(fFallbackSym, painter.device()); + const QFontMetricsF fmRoman(fRoman, painter.device()); #if (QT_VERSION>=QT_VERSION_CHECK(5, 15, 0)) const double sp=fm.horizontalAdvance(' '); #else @@ -148,8 +152,26 @@ void JKQTMathTextTextNode::getSizeInternalAndData(QPainter &painter, JKQTMathTex double ascent=0; double descent=0; for (int i=0; i0 && textpart[i].at(textpart[i].size()-1).isSpace()) { @@ -166,7 +188,7 @@ void JKQTMathTextTextNode::getSizeInternalAndData(QPainter &painter, JKQTMathTex strikeoutPos=fm.strikeOutPos(); } -void JKQTMathTextTextNode::splitTextForMathMode(const QString &txt, QStringList &textpart, QList &fontForcedUpright) +void JKQTMathTextTextNode::splitTextForLayout(QPainter &painter, JKQTMathTextEnvironment currentEv, const QString &txt, QStringList &textpart, QList &fontMode) const { auto isForcedUprightChar=[](const QChar& c) { return c.isDigit() @@ -174,37 +196,82 @@ void JKQTMathTextTextNode::splitTextForMathMode(const QString &txt, QStringList || c==QChar(0x2329) || c==QChar(0x232A) || c==QChar(0x2308) || c==QChar(0x2309) || c==QChar(0x230A) || c==QChar(0x230B); }; + //const QFont f=currentEv.getFont(parentMathText); + //const QFont fUpright=JKQTMathTextGetNonItalic(f); + const QFont fFallbackSym=currentEv.exchangedFontFor(MTEFallbackSymbols).getFont(parentMathText); + const QFont fRoman=currentEv.exchangedFontForRoman().getFont(parentMathText); + //const QFontMetricsF fm(f, painter.device()); + //const QFontMetricsF fmUpright(fUpright, painter.device()); + const QFontMetricsF fmFallbackSym(fFallbackSym, painter.device()); + const QFontMetricsF fmRoman(fRoman, painter.device()); + const JKQTMathTextBlackboradDrawingMode bbMode=parentMathText->getFontBlackboradMode(); + textpart.clear(); - fontForcedUpright.clear(); + fontMode.clear(); QString currentSection=""; - bool currentSectionForcedUpright=false; + FontMode currentSectionFontMode=FMasDefined; int i=0; while (i0) { textpart.append(currentSection); - fontForcedUpright.append(currentSectionForcedUpright); + fontMode.append(currentSectionFontMode); } } @@ -215,25 +282,49 @@ double JKQTMathTextTextNode::draw(QPainter& painter, double x, double y, JKQTMat double overallHeight=0; double sp=0; QStringList textpart; - QList fontForcedUpright; QList textpartXPos; - getSizeInternalAndData(painter, currentEv, width, baselineHeight, overallHeight, sp, textpart, fontForcedUpright, textpartXPos); + QList fontMode; + getSizeInternalAndData(painter, currentEv, width, baselineHeight, overallHeight, sp, textpart, fontMode, textpartXPos); const QFont f=currentEv.getFont(parentMathText); - const QFont fnonItalic=JKQTMathTextGetNonItalic(f); + const QFont fUpright=JKQTMathTextGetNonItalic(f); + const QFont fFallbackSym=currentEv.exchangedFontFor(MTEFallbackSymbols).getFont(parentMathText); + const QFont fRoman=currentEv.exchangedFontForRoman().getFont(parentMathText); const QFontMetricsF fm(f, painter.device()); - const QFontMetricsF fmNonItalic(fnonItalic, painter.device()); + const QFontMetricsF fmUpright(fUpright, painter.device()); + const QFontMetricsF fmFallbackSym(fFallbackSym, painter.device()); + const QFontMetricsF fmRoman(fRoman, painter.device()); painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();}); painter.setFont(f); + painter.setPen(currentEv.color); //qDebug()<<"JKQTMathTextTextNode: text="<& fontForcedUpright); - /** \brief transforms the \a text before sizing/drawing (may e.g. exchange special letters for other unicode symbols etc.) */ + void getSizeInternalAndData(QPainter& painter, JKQTMathTextEnvironment currentEv, double& width, double& baselineHeight, double& overallHeight, double& strikeoutPos, QStringList& textpart, QList& fontMode, QList& textpartXPos) ; + /** \brief split text for Math-Modelayout into sections, where each section has a defined way of output + * + * \param painter the QPainter to use for sizing/drawing + * \param currentEv the environment that defines the formatting of the text + * \param txt the text to split up + * \param[out] textpart the input \A txt split up into sections + * \param[out] fontMode formating of each section in \a textpart + */ + void splitTextForLayout(QPainter &painter, JKQTMathTextEnvironment currentEv, const QString& txt, QStringList& textpart, QList& fontMode) const; + /** \brief translation table for blackboard-font characters from "normal" Latin-1 encoding to unicode-encoding of blackboards */ + static QHash blackboardUnicodeTable; + /** \brief fill static data */ + static void fillStaticTables(); + /** \copydoc JKQTMathTextTextBaseNode::textTransform() */ virtual QString textTransform(const QString& text, const JKQTMathTextEnvironment& currentEv) const override; }; diff --git a/tools/jkqtmathtext_render/README.md b/tools/jkqtmathtext_render/README.md index 3bd8c4c537..70f174562a 100644 --- a/tools/jkqtmathtext_render/README.md +++ b/tools/jkqtmathtext_render/README.md @@ -68,7 +68,7 @@ The tool supports these command-line options: - `--fontmathroman=FONT`: set the math-mode roman font - `--fontmathsans=FONT`: set the math-mode sans font - `--fontblackboard=FONT`: use the given font as blackboard-font and de-activate the simulate-feature - - `--fontblackboardsimulated=FONT`: use the given font as blackboard-font and activate the simulate-feature + - `--fontblackboardmode=default|font_directly|simulate|unicode_or_font_directly|unicode_or_simulate`: use the given drawing mode for blackboard fonts - `--fonttypewriter=FONT`: set the typewriter font - `--fontscript=FONT`: set the script font - `--fontcaligraphic=FONT`: set the caligraphic font diff --git a/tools/jkqtmathtext_render/jkqtmathtext_render.cpp b/tools/jkqtmathtext_render/jkqtmathtext_render.cpp index a8cff0df2a..fab81afd9d 100644 --- a/tools/jkqtmathtext_render/jkqtmathtext_render.cpp +++ b/tools/jkqtmathtext_render/jkqtmathtext_render.cpp @@ -69,7 +69,7 @@ int main(int argc, char* argv[]) parser.addOption(outputDirectoryOption); QCommandLineOption listsymbolsOption("listsymbols", "list all symbols in the given output file and generate images.", "listsymbols", ""); parser.addOption(listsymbolsOption); - QCommandLineOption drawBoxesOption("drawboxes", "draw boxes."); + QCommandLineOption drawBoxesOption(QStringList()<<"drawboxes"<<"showboxes", "draw boxes."); parser.addOption(drawBoxesOption); QCommandLineOption verboseOption("verbose", "verbose output."); parser.addOption(verboseOption); @@ -77,8 +77,6 @@ int main(int argc, char* argv[]) parser.addOption(fontOption); QCommandLineOption fontsizeOption("fontsize", "font size.", "fontsize", "12"); parser.addOption(fontsizeOption); - QCommandLineOption fontBlackboardSimOption("fontblackboardsimulated", "set the blackboard font and activate simulated-mode.", "fontblackboardsimulated", ""); - parser.addOption(fontBlackboardSimOption); QCommandLineOption fontRomanOption("fontroman", "set the text-mode roman font to use.", "fontroman", ""); parser.addOption(fontRomanOption); QCommandLineOption fontSansOption("fontsans", "set the text-mode sans font to use.", "fontsans", ""); @@ -101,6 +99,8 @@ int main(int argc, char* argv[]) parser.addOption(fontcaligraphicOption); QCommandLineOption fontblackboardOption("fontblackboard", "set the blackboard font to use.", "fontblackboard", ""); parser.addOption(fontblackboardOption); + QCommandLineOption fontblackboardmodeOption("fontblackboardmode", "set the usage mode for the blackboard font.", "fontblackboardmode", "default"); + parser.addOption(fontblackboardmodeOption); QCommandLineOption textcolorOption("textcolor", "set the color of the text.", "textcolor", "black"); parser.addOption(textcolorOption); QCommandLineOption sizeincreaseOption("sizeincrease", "additional pixels around output.", "sizeincrease", "2"); @@ -260,7 +260,6 @@ int main(int argc, char* argv[]) int resolution_dpi = parser.value(resolutionOption).toInt(); QColor backgroundColor = jkqtp_String2QColor(parser.value(backgroundOption)); QColor textColor = jkqtp_String2QColor(parser.value(textcolorOption)); - QString fontBlackboardSim = parser.value(fontBlackboardSimOption); QString fontBlackboard=parser.value(fontblackboardOption); QString fontRoman=parser.value(fontRomanOption); QString fontSans=parser.value(fontSansOption); @@ -272,15 +271,15 @@ int main(int argc, char* argv[]) QString fontScript=parser.value(fontScriptOption); QString fontFraktur=parser.value(fontFrakturOption); QString fontCaligraphic=parser.value(fontcaligraphicOption); + JKQTMathTextBlackboradDrawingMode fontBlackboardMode=String2JKQTMathTextBlackboradDrawingMode(parser.value(fontblackboardmodeOption)); if (cmdoptions[i].size()>0) { for (const QString& key: cmdoptions[i].keys()) { - if (key=="drawboxes") drawBoxes=true; + if (key=="drawboxes" || key=="showboxes") drawBoxes=true; else if (key=="fontsize") fontsize=cmdoptions[i].value(key).toDouble(); else if (key=="sizeincrease") sizeincrease=cmdoptions[i].value(key).toInt(); else if (key=="background") backgroundColor=jkqtp_String2QColor(cmdoptions[i].value(key)); else if (key=="textcolor") textColor=jkqtp_String2QColor(cmdoptions[i].value(key)); - else if (key=="fontblackboardsimulated") fontBlackboardSim=cmdoptions[i].value(key); else if (key=="fontblackboard") fontBlackboard=cmdoptions[i].value(key); else if (key=="font") processFont(cmdoptions[i].value(key), fonts, mathFont); else if (key=="fontroman") fontRoman=cmdoptions[i].value(key); @@ -293,6 +292,10 @@ int main(int argc, char* argv[]) else if (key=="fontscript") fontScript=cmdoptions[i].value(key); else if (key=="fontcaligraphic") fontCaligraphic=cmdoptions[i].value(key); else if (key=="fontfraktur") fontFraktur=cmdoptions[i].value(key); + else if (key=="fontblackboardmode") fontBlackboardMode=String2JKQTMathTextBlackboradDrawingMode(cmdoptions[i].value(key)); + else { + std::cerr<<"unknown command-line option --"<0) mathText.setFallbackFontSymbols(fontFallbackSymbol, MTFEUnicode); if (fontFallbackSymbol_symbolencoding.size()>0) mathText.setFallbackFontSymbols(fontFallbackSymbol_symbolencoding, MTFEWinSymbol); - if (fontBlackboardSim.size()>0) { - mathText.setFontBlackboard(fontBlackboardSim, MTFEUnicode); - mathText.setFontBlackboardSimulated(true); - } if (fontBlackboard.size()>0) { mathText.setFontBlackboard(fontBlackboard, MTFEUnicode); - mathText.setFontBlackboardSimulated(false); } + mathText.setFontBlackboradMode(fontBlackboardMode); mathText.setFontSize(fontsize); mathText.setFontColor(textColor);