test_latex.py 135 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164
  1. from sympy import MatAdd, MatMul, Array
  2. from sympy.algebras.quaternion import Quaternion
  3. from sympy.calculus.accumulationbounds import AccumBounds
  4. from sympy.combinatorics.permutations import Cycle, Permutation, AppliedPermutation
  5. from sympy.concrete.products import Product
  6. from sympy.concrete.summations import Sum
  7. from sympy.core.containers import Tuple, Dict
  8. from sympy.core.expr import UnevaluatedExpr
  9. from sympy.core.function import (Derivative, Function, Lambda, Subs, diff)
  10. from sympy.core.mod import Mod
  11. from sympy.core.mul import Mul
  12. from sympy.core.numbers import (AlgebraicNumber, Float, I, Integer, Rational, oo, pi)
  13. from sympy.core.parameters import evaluate
  14. from sympy.core.power import Pow
  15. from sympy.core.relational import Eq, Ne
  16. from sympy.core.singleton import S
  17. from sympy.core.symbol import (Symbol, Wild, symbols)
  18. from sympy.functions.combinatorial.factorials import (FallingFactorial, RisingFactorial, binomial, factorial, factorial2, subfactorial)
  19. from sympy.functions.combinatorial.numbers import (bernoulli, bell, catalan, euler, genocchi,
  20. lucas, fibonacci, tribonacci, divisor_sigma, udivisor_sigma,
  21. mobius, primenu, primeomega,
  22. totient, reduced_totient)
  23. from sympy.functions.elementary.complexes import (Abs, arg, conjugate, im, polar_lift, re)
  24. from sympy.functions.elementary.exponential import (LambertW, exp, log)
  25. from sympy.functions.elementary.hyperbolic import (asinh, coth)
  26. from sympy.functions.elementary.integers import (ceiling, floor, frac)
  27. from sympy.functions.elementary.miscellaneous import (Max, Min, root, sqrt)
  28. from sympy.functions.elementary.piecewise import Piecewise
  29. from sympy.functions.elementary.trigonometric import (acsc, asin, cos, cot, sin, tan)
  30. from sympy.functions.special.beta_functions import beta
  31. from sympy.functions.special.delta_functions import (DiracDelta, Heaviside)
  32. from sympy.functions.special.elliptic_integrals import (elliptic_e, elliptic_f, elliptic_k, elliptic_pi)
  33. from sympy.functions.special.error_functions import (Chi, Ci, Ei, Shi, Si, expint)
  34. from sympy.functions.special.gamma_functions import (gamma, uppergamma)
  35. from sympy.functions.special.hyper import (hyper, meijerg)
  36. from sympy.functions.special.mathieu_functions import (mathieuc, mathieucprime, mathieus, mathieusprime)
  37. from sympy.functions.special.polynomials import (assoc_laguerre, assoc_legendre, chebyshevt, chebyshevu, gegenbauer, hermite, jacobi, laguerre, legendre)
  38. from sympy.functions.special.singularity_functions import SingularityFunction
  39. from sympy.functions.special.spherical_harmonics import (Ynm, Znm)
  40. from sympy.functions.special.tensor_functions import (KroneckerDelta, LeviCivita)
  41. from sympy.functions.special.zeta_functions import (dirichlet_eta, lerchphi, polylog, stieltjes, zeta)
  42. from sympy.integrals.integrals import Integral
  43. from sympy.integrals.transforms import (CosineTransform, FourierTransform, InverseCosineTransform, InverseFourierTransform, InverseLaplaceTransform, InverseMellinTransform, InverseSineTransform, LaplaceTransform, MellinTransform, SineTransform)
  44. from sympy.logic import Implies
  45. from sympy.logic.boolalg import (And, Or, Xor, Equivalent, false, Not, true)
  46. from sympy.matrices.dense import Matrix
  47. from sympy.matrices.expressions.kronecker import KroneckerProduct
  48. from sympy.matrices.expressions.matexpr import MatrixSymbol
  49. from sympy.matrices.expressions.permutation import PermutationMatrix
  50. from sympy.matrices.expressions.slice import MatrixSlice
  51. from sympy.matrices.expressions.dotproduct import DotProduct
  52. from sympy.physics.control.lti import TransferFunction, Series, Parallel, Feedback, TransferFunctionMatrix, MIMOSeries, MIMOParallel, MIMOFeedback
  53. from sympy.physics.quantum import Commutator, Operator
  54. from sympy.physics.quantum.trace import Tr
  55. from sympy.physics.units import meter, gibibyte, gram, microgram, second, milli, micro
  56. from sympy.polys.domains.integerring import ZZ
  57. from sympy.polys.fields import field
  58. from sympy.polys.polytools import Poly
  59. from sympy.polys.rings import ring
  60. from sympy.polys.rootoftools import (RootSum, rootof)
  61. from sympy.series.formal import fps
  62. from sympy.series.fourier import fourier_series
  63. from sympy.series.limits import Limit
  64. from sympy.series.order import Order
  65. from sympy.series.sequences import (SeqAdd, SeqFormula, SeqMul, SeqPer)
  66. from sympy.sets.conditionset import ConditionSet
  67. from sympy.sets.contains import Contains
  68. from sympy.sets.fancysets import (ComplexRegion, ImageSet, Range)
  69. from sympy.sets.ordinals import Ordinal, OrdinalOmega, OmegaPower
  70. from sympy.sets.powerset import PowerSet
  71. from sympy.sets.sets import (FiniteSet, Interval, Union, Intersection, Complement, SymmetricDifference, ProductSet)
  72. from sympy.sets.setexpr import SetExpr
  73. from sympy.stats.crv_types import Normal
  74. from sympy.stats.symbolic_probability import (Covariance, Expectation,
  75. Probability, Variance)
  76. from sympy.tensor.array import (ImmutableDenseNDimArray,
  77. ImmutableSparseNDimArray,
  78. MutableSparseNDimArray,
  79. MutableDenseNDimArray,
  80. tensorproduct)
  81. from sympy.tensor.array.expressions.array_expressions import ArraySymbol, ArrayElement
  82. from sympy.tensor.indexed import (Idx, Indexed, IndexedBase)
  83. from sympy.tensor.toperators import PartialDerivative
  84. from sympy.vector import CoordSys3D, Cross, Curl, Dot, Divergence, Gradient, Laplacian
  85. from sympy.testing.pytest import (XFAIL, raises, _both_exp_pow,
  86. warns_deprecated_sympy)
  87. from sympy.printing.latex import (latex, translate, greek_letters_set,
  88. tex_greek_dictionary, multiline_latex,
  89. latex_escape, LatexPrinter)
  90. import sympy as sym
  91. from sympy.abc import mu, tau
  92. class lowergamma(sym.lowergamma):
  93. pass # testing notation inheritance by a subclass with same name
  94. x, y, z, t, w, a, b, c, s, p = symbols('x y z t w a b c s p')
  95. k, m, n = symbols('k m n', integer=True)
  96. def test_printmethod():
  97. class R(Abs):
  98. def _latex(self, printer):
  99. return "foo(%s)" % printer._print(self.args[0])
  100. assert latex(R(x)) == r"foo(x)"
  101. class R(Abs):
  102. def _latex(self, printer):
  103. return "foo"
  104. assert latex(R(x)) == r"foo"
  105. def test_latex_basic():
  106. assert latex(1 + x) == r"x + 1"
  107. assert latex(x**2) == r"x^{2}"
  108. assert latex(x**(1 + x)) == r"x^{x + 1}"
  109. assert latex(x**3 + x + 1 + x**2) == r"x^{3} + x^{2} + x + 1"
  110. assert latex(2*x*y) == r"2 x y"
  111. assert latex(2*x*y, mul_symbol='dot') == r"2 \cdot x \cdot y"
  112. assert latex(3*x**2*y, mul_symbol='\\,') == r"3\,x^{2}\,y"
  113. assert latex(1.5*3**x, mul_symbol='\\,') == r"1.5 \cdot 3^{x}"
  114. assert latex(x**S.Half**5) == r"\sqrt[32]{x}"
  115. assert latex(Mul(S.Half, x**2, -5, evaluate=False)) == r"\frac{1}{2} x^{2} \left(-5\right)"
  116. assert latex(Mul(S.Half, x**2, 5, evaluate=False)) == r"\frac{1}{2} x^{2} \cdot 5"
  117. assert latex(Mul(-5, -5, evaluate=False)) == r"\left(-5\right) \left(-5\right)"
  118. assert latex(Mul(5, -5, evaluate=False)) == r"5 \left(-5\right)"
  119. assert latex(Mul(S.Half, -5, S.Half, evaluate=False)) == r"\frac{1}{2} \left(-5\right) \frac{1}{2}"
  120. assert latex(Mul(5, I, 5, evaluate=False)) == r"5 i 5"
  121. assert latex(Mul(5, I, -5, evaluate=False)) == r"5 i \left(-5\right)"
  122. assert latex(Mul(Pow(x, 2), S.Half*x + 1)) == r"x^{2} \left(\frac{x}{2} + 1\right)"
  123. assert latex(Mul(Pow(x, 3), Rational(2, 3)*x + 1)) == r"x^{3} \left(\frac{2 x}{3} + 1\right)"
  124. assert latex(Mul(Pow(x, 11), 2*x + 1)) == r"x^{11} \left(2 x + 1\right)"
  125. assert latex(Mul(0, 1, evaluate=False)) == r'0 \cdot 1'
  126. assert latex(Mul(1, 0, evaluate=False)) == r'1 \cdot 0'
  127. assert latex(Mul(1, 1, evaluate=False)) == r'1 \cdot 1'
  128. assert latex(Mul(-1, 1, evaluate=False)) == r'\left(-1\right) 1'
  129. assert latex(Mul(1, 1, 1, evaluate=False)) == r'1 \cdot 1 \cdot 1'
  130. assert latex(Mul(1, 2, evaluate=False)) == r'1 \cdot 2'
  131. assert latex(Mul(1, S.Half, evaluate=False)) == r'1 \cdot \frac{1}{2}'
  132. assert latex(Mul(1, 1, S.Half, evaluate=False)) == \
  133. r'1 \cdot 1 \cdot \frac{1}{2}'
  134. assert latex(Mul(1, 1, 2, 3, x, evaluate=False)) == \
  135. r'1 \cdot 1 \cdot 2 \cdot 3 x'
  136. assert latex(Mul(1, -1, evaluate=False)) == r'1 \left(-1\right)'
  137. assert latex(Mul(4, 3, 2, 1, 0, y, x, evaluate=False)) == \
  138. r'4 \cdot 3 \cdot 2 \cdot 1 \cdot 0 y x'
  139. assert latex(Mul(4, 3, 2, 1+z, 0, y, x, evaluate=False)) == \
  140. r'4 \cdot 3 \cdot 2 \left(z + 1\right) 0 y x'
  141. assert latex(Mul(Rational(2, 3), Rational(5, 7), evaluate=False)) == \
  142. r'\frac{2}{3} \cdot \frac{5}{7}'
  143. assert latex(1/x) == r"\frac{1}{x}"
  144. assert latex(1/x, fold_short_frac=True) == r"1 / x"
  145. assert latex(-S(3)/2) == r"- \frac{3}{2}"
  146. assert latex(-S(3)/2, fold_short_frac=True) == r"- 3 / 2"
  147. assert latex(1/x**2) == r"\frac{1}{x^{2}}"
  148. assert latex(1/(x + y)/2) == r"\frac{1}{2 \left(x + y\right)}"
  149. assert latex(x/2) == r"\frac{x}{2}"
  150. assert latex(x/2, fold_short_frac=True) == r"x / 2"
  151. assert latex((x + y)/(2*x)) == r"\frac{x + y}{2 x}"
  152. assert latex((x + y)/(2*x), fold_short_frac=True) == \
  153. r"\left(x + y\right) / 2 x"
  154. assert latex((x + y)/(2*x), long_frac_ratio=0) == \
  155. r"\frac{1}{2 x} \left(x + y\right)"
  156. assert latex((x + y)/x) == r"\frac{x + y}{x}"
  157. assert latex((x + y)/x, long_frac_ratio=3) == r"\frac{x + y}{x}"
  158. assert latex((2*sqrt(2)*x)/3) == r"\frac{2 \sqrt{2} x}{3}"
  159. assert latex((2*sqrt(2)*x)/3, long_frac_ratio=2) == \
  160. r"\frac{2 x}{3} \sqrt{2}"
  161. assert latex(binomial(x, y)) == r"{\binom{x}{y}}"
  162. x_star = Symbol('x^*')
  163. f = Function('f')
  164. assert latex(x_star**2) == r"\left(x^{*}\right)^{2}"
  165. assert latex(x_star**2, parenthesize_super=False) == r"{x^{*}}^{2}"
  166. assert latex(Derivative(f(x_star), x_star,2)) == r"\frac{d^{2}}{d \left(x^{*}\right)^{2}} f{\left(x^{*} \right)}"
  167. assert latex(Derivative(f(x_star), x_star,2), parenthesize_super=False) == r"\frac{d^{2}}{d {x^{*}}^{2}} f{\left(x^{*} \right)}"
  168. assert latex(2*Integral(x, x)/3) == r"\frac{2 \int x\, dx}{3}"
  169. assert latex(2*Integral(x, x)/3, fold_short_frac=True) == \
  170. r"\left(2 \int x\, dx\right) / 3"
  171. assert latex(sqrt(x)) == r"\sqrt{x}"
  172. assert latex(x**Rational(1, 3)) == r"\sqrt[3]{x}"
  173. assert latex(x**Rational(1, 3), root_notation=False) == r"x^{\frac{1}{3}}"
  174. assert latex(sqrt(x)**3) == r"x^{\frac{3}{2}}"
  175. assert latex(sqrt(x), itex=True) == r"\sqrt{x}"
  176. assert latex(x**Rational(1, 3), itex=True) == r"\root{3}{x}"
  177. assert latex(sqrt(x)**3, itex=True) == r"x^{\frac{3}{2}}"
  178. assert latex(x**Rational(3, 4)) == r"x^{\frac{3}{4}}"
  179. assert latex(x**Rational(3, 4), fold_frac_powers=True) == r"x^{3/4}"
  180. assert latex((x + 1)**Rational(3, 4)) == \
  181. r"\left(x + 1\right)^{\frac{3}{4}}"
  182. assert latex((x + 1)**Rational(3, 4), fold_frac_powers=True) == \
  183. r"\left(x + 1\right)^{3/4}"
  184. assert latex(AlgebraicNumber(sqrt(2))) == r"\sqrt{2}"
  185. assert latex(AlgebraicNumber(sqrt(2), [3, -7])) == r"-7 + 3 \sqrt{2}"
  186. assert latex(AlgebraicNumber(sqrt(2), alias='alpha')) == r"\alpha"
  187. assert latex(AlgebraicNumber(sqrt(2), [3, -7], alias='alpha')) == \
  188. r"3 \alpha - 7"
  189. assert latex(AlgebraicNumber(2**(S(1)/3), [1, 3, -7], alias='beta')) == \
  190. r"\beta^{2} + 3 \beta - 7"
  191. k = ZZ.cyclotomic_field(5)
  192. assert latex(k.ext.field_element([1, 2, 3, 4])) == \
  193. r"\zeta^{3} + 2 \zeta^{2} + 3 \zeta + 4"
  194. assert latex(k.ext.field_element([1, 2, 3, 4]), order='old') == \
  195. r"4 + 3 \zeta + 2 \zeta^{2} + \zeta^{3}"
  196. assert latex(k.primes_above(19)[0]) == \
  197. r"\left(19, \zeta^{2} + 5 \zeta + 1\right)"
  198. assert latex(k.primes_above(19)[0], order='old') == \
  199. r"\left(19, 1 + 5 \zeta + \zeta^{2}\right)"
  200. assert latex(k.primes_above(7)[0]) == r"\left(7\right)"
  201. assert latex(1.5e20*x) == r"1.5 \cdot 10^{20} x"
  202. assert latex(1.5e20*x, mul_symbol='dot') == r"1.5 \cdot 10^{20} \cdot x"
  203. assert latex(1.5e20*x, mul_symbol='times') == \
  204. r"1.5 \times 10^{20} \times x"
  205. assert latex(1/sin(x)) == r"\frac{1}{\sin{\left(x \right)}}"
  206. assert latex(sin(x)**-1) == r"\frac{1}{\sin{\left(x \right)}}"
  207. assert latex(sin(x)**Rational(3, 2)) == \
  208. r"\sin^{\frac{3}{2}}{\left(x \right)}"
  209. assert latex(sin(x)**Rational(3, 2), fold_frac_powers=True) == \
  210. r"\sin^{3/2}{\left(x \right)}"
  211. assert latex(~x) == r"\neg x"
  212. assert latex(x & y) == r"x \wedge y"
  213. assert latex(x & y & z) == r"x \wedge y \wedge z"
  214. assert latex(x | y) == r"x \vee y"
  215. assert latex(x | y | z) == r"x \vee y \vee z"
  216. assert latex((x & y) | z) == r"z \vee \left(x \wedge y\right)"
  217. assert latex(Implies(x, y)) == r"x \Rightarrow y"
  218. assert latex(~(x >> ~y)) == r"x \not\Rightarrow \neg y"
  219. assert latex(Implies(Or(x,y), z)) == r"\left(x \vee y\right) \Rightarrow z"
  220. assert latex(Implies(z, Or(x,y))) == r"z \Rightarrow \left(x \vee y\right)"
  221. assert latex(~(x & y)) == r"\neg \left(x \wedge y\right)"
  222. assert latex(~x, symbol_names={x: "x_i"}) == r"\neg x_i"
  223. assert latex(x & y, symbol_names={x: "x_i", y: "y_i"}) == \
  224. r"x_i \wedge y_i"
  225. assert latex(x & y & z, symbol_names={x: "x_i", y: "y_i", z: "z_i"}) == \
  226. r"x_i \wedge y_i \wedge z_i"
  227. assert latex(x | y, symbol_names={x: "x_i", y: "y_i"}) == r"x_i \vee y_i"
  228. assert latex(x | y | z, symbol_names={x: "x_i", y: "y_i", z: "z_i"}) == \
  229. r"x_i \vee y_i \vee z_i"
  230. assert latex((x & y) | z, symbol_names={x: "x_i", y: "y_i", z: "z_i"}) == \
  231. r"z_i \vee \left(x_i \wedge y_i\right)"
  232. assert latex(Implies(x, y), symbol_names={x: "x_i", y: "y_i"}) == \
  233. r"x_i \Rightarrow y_i"
  234. assert latex(Pow(Rational(1, 3), -1, evaluate=False)) == r"\frac{1}{\frac{1}{3}}"
  235. assert latex(Pow(Rational(1, 3), -2, evaluate=False)) == r"\frac{1}{(\frac{1}{3})^{2}}"
  236. assert latex(Pow(Integer(1)/100, -1, evaluate=False)) == r"\frac{1}{\frac{1}{100}}"
  237. p = Symbol('p', positive=True)
  238. assert latex(exp(-p)*log(p)) == r"e^{- p} \log{\left(p \right)}"
  239. assert latex(Pow(Rational(2, 3), -1, evaluate=False)) == r'\frac{1}{\frac{2}{3}}'
  240. assert latex(Pow(Rational(4, 3), -1, evaluate=False)) == r'\frac{1}{\frac{4}{3}}'
  241. assert latex(Pow(Rational(-3, 4), -1, evaluate=False)) == r'\frac{1}{- \frac{3}{4}}'
  242. assert latex(Pow(Rational(-4, 4), -1, evaluate=False)) == r'\frac{1}{-1}'
  243. assert latex(Pow(Rational(1, 3), -1, evaluate=False)) == r'\frac{1}{\frac{1}{3}}'
  244. assert latex(Pow(Rational(-1, 3), -1, evaluate=False)) == r'\frac{1}{- \frac{1}{3}}'
  245. def test_latex_builtins():
  246. assert latex(True) == r"\text{True}"
  247. assert latex(False) == r"\text{False}"
  248. assert latex(None) == r"\text{None}"
  249. assert latex(true) == r"\text{True}"
  250. assert latex(false) == r'\text{False}'
  251. def test_latex_SingularityFunction():
  252. assert latex(SingularityFunction(x, 4, 5)) == \
  253. r"{\left\langle x - 4 \right\rangle}^{5}"
  254. assert latex(SingularityFunction(x, -3, 4)) == \
  255. r"{\left\langle x + 3 \right\rangle}^{4}"
  256. assert latex(SingularityFunction(x, 0, 4)) == \
  257. r"{\left\langle x \right\rangle}^{4}"
  258. assert latex(SingularityFunction(x, a, n)) == \
  259. r"{\left\langle - a + x \right\rangle}^{n}"
  260. assert latex(SingularityFunction(x, 4, -2)) == \
  261. r"{\left\langle x - 4 \right\rangle}^{-2}"
  262. assert latex(SingularityFunction(x, 4, -1)) == \
  263. r"{\left\langle x - 4 \right\rangle}^{-1}"
  264. assert latex(SingularityFunction(x, 4, 5)**3) == \
  265. r"{\left({\langle x - 4 \rangle}^{5}\right)}^{3}"
  266. assert latex(SingularityFunction(x, -3, 4)**3) == \
  267. r"{\left({\langle x + 3 \rangle}^{4}\right)}^{3}"
  268. assert latex(SingularityFunction(x, 0, 4)**3) == \
  269. r"{\left({\langle x \rangle}^{4}\right)}^{3}"
  270. assert latex(SingularityFunction(x, a, n)**3) == \
  271. r"{\left({\langle - a + x \rangle}^{n}\right)}^{3}"
  272. assert latex(SingularityFunction(x, 4, -2)**3) == \
  273. r"{\left({\langle x - 4 \rangle}^{-2}\right)}^{3}"
  274. assert latex((SingularityFunction(x, 4, -1)**3)**3) == \
  275. r"{\left({\langle x - 4 \rangle}^{-1}\right)}^{9}"
  276. def test_latex_cycle():
  277. assert latex(Cycle(1, 2, 4)) == r"\left( 1\; 2\; 4\right)"
  278. assert latex(Cycle(1, 2)(4, 5, 6)) == \
  279. r"\left( 1\; 2\right)\left( 4\; 5\; 6\right)"
  280. assert latex(Cycle()) == r"\left( \right)"
  281. def test_latex_permutation():
  282. assert latex(Permutation(1, 2, 4)) == r"\left( 1\; 2\; 4\right)"
  283. assert latex(Permutation(1, 2)(4, 5, 6)) == \
  284. r"\left( 1\; 2\right)\left( 4\; 5\; 6\right)"
  285. assert latex(Permutation()) == r"\left( \right)"
  286. assert latex(Permutation(2, 4)*Permutation(5)) == \
  287. r"\left( 2\; 4\right)\left( 5\right)"
  288. assert latex(Permutation(5)) == r"\left( 5\right)"
  289. assert latex(Permutation(0, 1), perm_cyclic=False) == \
  290. r"\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}"
  291. assert latex(Permutation(0, 1)(2, 3), perm_cyclic=False) == \
  292. r"\begin{pmatrix} 0 & 1 & 2 & 3 \\ 1 & 0 & 3 & 2 \end{pmatrix}"
  293. assert latex(Permutation(), perm_cyclic=False) == \
  294. r"\left( \right)"
  295. with warns_deprecated_sympy():
  296. old_print_cyclic = Permutation.print_cyclic
  297. Permutation.print_cyclic = False
  298. assert latex(Permutation(0, 1)(2, 3)) == \
  299. r"\begin{pmatrix} 0 & 1 & 2 & 3 \\ 1 & 0 & 3 & 2 \end{pmatrix}"
  300. Permutation.print_cyclic = old_print_cyclic
  301. def test_latex_Float():
  302. assert latex(Float(1.0e100)) == r"1.0 \cdot 10^{100}"
  303. assert latex(Float(1.0e-100)) == r"1.0 \cdot 10^{-100}"
  304. assert latex(Float(1.0e-100), mul_symbol="times") == \
  305. r"1.0 \times 10^{-100}"
  306. assert latex(Float('10000.0'), full_prec=False, min=-2, max=2) == \
  307. r"1.0 \cdot 10^{4}"
  308. assert latex(Float('10000.0'), full_prec=False, min=-2, max=4) == \
  309. r"1.0 \cdot 10^{4}"
  310. assert latex(Float('10000.0'), full_prec=False, min=-2, max=5) == \
  311. r"10000.0"
  312. assert latex(Float('0.099999'), full_prec=True, min=-2, max=5) == \
  313. r"9.99990000000000 \cdot 10^{-2}"
  314. def test_latex_vector_expressions():
  315. A = CoordSys3D('A')
  316. assert latex(Cross(A.i, A.j*A.x*3+A.k)) == \
  317. r"\mathbf{\hat{i}_{A}} \times \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}} + \mathbf{\hat{k}_{A}}\right)"
  318. assert latex(Cross(A.i, A.j)) == \
  319. r"\mathbf{\hat{i}_{A}} \times \mathbf{\hat{j}_{A}}"
  320. assert latex(x*Cross(A.i, A.j)) == \
  321. r"x \left(\mathbf{\hat{i}_{A}} \times \mathbf{\hat{j}_{A}}\right)"
  322. assert latex(Cross(x*A.i, A.j)) == \
  323. r'- \mathbf{\hat{j}_{A}} \times \left(\left(x\right)\mathbf{\hat{i}_{A}}\right)'
  324. assert latex(Curl(3*A.x*A.j)) == \
  325. r"\nabla\times \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)"
  326. assert latex(Curl(3*A.x*A.j+A.i)) == \
  327. r"\nabla\times \left(\mathbf{\hat{i}_{A}} + \left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)"
  328. assert latex(Curl(3*x*A.x*A.j)) == \
  329. r"\nabla\times \left(\left(3 \mathbf{{x}_{A}} x\right)\mathbf{\hat{j}_{A}}\right)"
  330. assert latex(x*Curl(3*A.x*A.j)) == \
  331. r"x \left(\nabla\times \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)\right)"
  332. assert latex(Divergence(3*A.x*A.j+A.i)) == \
  333. r"\nabla\cdot \left(\mathbf{\hat{i}_{A}} + \left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)"
  334. assert latex(Divergence(3*A.x*A.j)) == \
  335. r"\nabla\cdot \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)"
  336. assert latex(x*Divergence(3*A.x*A.j)) == \
  337. r"x \left(\nabla\cdot \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}}\right)\right)"
  338. assert latex(Dot(A.i, A.j*A.x*3+A.k)) == \
  339. r"\mathbf{\hat{i}_{A}} \cdot \left(\left(3 \mathbf{{x}_{A}}\right)\mathbf{\hat{j}_{A}} + \mathbf{\hat{k}_{A}}\right)"
  340. assert latex(Dot(A.i, A.j)) == \
  341. r"\mathbf{\hat{i}_{A}} \cdot \mathbf{\hat{j}_{A}}"
  342. assert latex(Dot(x*A.i, A.j)) == \
  343. r"\mathbf{\hat{j}_{A}} \cdot \left(\left(x\right)\mathbf{\hat{i}_{A}}\right)"
  344. assert latex(x*Dot(A.i, A.j)) == \
  345. r"x \left(\mathbf{\hat{i}_{A}} \cdot \mathbf{\hat{j}_{A}}\right)"
  346. assert latex(Gradient(A.x)) == r"\nabla \mathbf{{x}_{A}}"
  347. assert latex(Gradient(A.x + 3*A.y)) == \
  348. r"\nabla \left(\mathbf{{x}_{A}} + 3 \mathbf{{y}_{A}}\right)"
  349. assert latex(x*Gradient(A.x)) == r"x \left(\nabla \mathbf{{x}_{A}}\right)"
  350. assert latex(Gradient(x*A.x)) == r"\nabla \left(\mathbf{{x}_{A}} x\right)"
  351. assert latex(Laplacian(A.x)) == r"\Delta \mathbf{{x}_{A}}"
  352. assert latex(Laplacian(A.x + 3*A.y)) == \
  353. r"\Delta \left(\mathbf{{x}_{A}} + 3 \mathbf{{y}_{A}}\right)"
  354. assert latex(x*Laplacian(A.x)) == r"x \left(\Delta \mathbf{{x}_{A}}\right)"
  355. assert latex(Laplacian(x*A.x)) == r"\Delta \left(\mathbf{{x}_{A}} x\right)"
  356. def test_latex_symbols():
  357. Gamma, lmbda, rho = symbols('Gamma, lambda, rho')
  358. tau, Tau, TAU, taU = symbols('tau, Tau, TAU, taU')
  359. assert latex(tau) == r"\tau"
  360. assert latex(Tau) == r"\mathrm{T}"
  361. assert latex(TAU) == r"\tau"
  362. assert latex(taU) == r"\tau"
  363. # Check that all capitalized greek letters are handled explicitly
  364. capitalized_letters = {l.capitalize() for l in greek_letters_set}
  365. assert len(capitalized_letters - set(tex_greek_dictionary.keys())) == 0
  366. assert latex(Gamma + lmbda) == r"\Gamma + \lambda"
  367. assert latex(Gamma * lmbda) == r"\Gamma \lambda"
  368. assert latex(Symbol('q1')) == r"q_{1}"
  369. assert latex(Symbol('q21')) == r"q_{21}"
  370. assert latex(Symbol('epsilon0')) == r"\epsilon_{0}"
  371. assert latex(Symbol('omega1')) == r"\omega_{1}"
  372. assert latex(Symbol('91')) == r"91"
  373. assert latex(Symbol('alpha_new')) == r"\alpha_{new}"
  374. assert latex(Symbol('C^orig')) == r"C^{orig}"
  375. assert latex(Symbol('x^alpha')) == r"x^{\alpha}"
  376. assert latex(Symbol('beta^alpha')) == r"\beta^{\alpha}"
  377. assert latex(Symbol('e^Alpha')) == r"e^{\mathrm{A}}"
  378. assert latex(Symbol('omega_alpha^beta')) == r"\omega^{\beta}_{\alpha}"
  379. assert latex(Symbol('omega') ** Symbol('beta')) == r"\omega^{\beta}"
  380. @XFAIL
  381. def test_latex_symbols_failing():
  382. rho, mass, volume = symbols('rho, mass, volume')
  383. assert latex(
  384. volume * rho == mass) == r"\rho \mathrm{volume} = \mathrm{mass}"
  385. assert latex(volume / mass * rho == 1) == \
  386. r"\rho \mathrm{volume} {\mathrm{mass}}^{(-1)} = 1"
  387. assert latex(mass**3 * volume**3) == \
  388. r"{\mathrm{mass}}^{3} \cdot {\mathrm{volume}}^{3}"
  389. @_both_exp_pow
  390. def test_latex_functions():
  391. assert latex(exp(x)) == r"e^{x}"
  392. assert latex(exp(1) + exp(2)) == r"e + e^{2}"
  393. f = Function('f')
  394. assert latex(f(x)) == r'f{\left(x \right)}'
  395. assert latex(f) == r'f'
  396. g = Function('g')
  397. assert latex(g(x, y)) == r'g{\left(x,y \right)}'
  398. assert latex(g) == r'g'
  399. h = Function('h')
  400. assert latex(h(x, y, z)) == r'h{\left(x,y,z \right)}'
  401. assert latex(h) == r'h'
  402. Li = Function('Li')
  403. assert latex(Li) == r'\operatorname{Li}'
  404. assert latex(Li(x)) == r'\operatorname{Li}{\left(x \right)}'
  405. mybeta = Function('beta')
  406. # not to be confused with the beta function
  407. assert latex(mybeta(x, y, z)) == r"\beta{\left(x,y,z \right)}"
  408. assert latex(beta(x, y)) == r'\operatorname{B}\left(x, y\right)'
  409. assert latex(beta(x, evaluate=False)) == r'\operatorname{B}\left(x, x\right)'
  410. assert latex(beta(x, y)**2) == r'\operatorname{B}^{2}\left(x, y\right)'
  411. assert latex(mybeta(x)) == r"\beta{\left(x \right)}"
  412. assert latex(mybeta) == r"\beta"
  413. g = Function('gamma')
  414. # not to be confused with the gamma function
  415. assert latex(g(x, y, z)) == r"\gamma{\left(x,y,z \right)}"
  416. assert latex(g(x)) == r"\gamma{\left(x \right)}"
  417. assert latex(g) == r"\gamma"
  418. a_1 = Function('a_1')
  419. assert latex(a_1) == r"a_{1}"
  420. assert latex(a_1(x)) == r"a_{1}{\left(x \right)}"
  421. assert latex(Function('a_1')) == r"a_{1}"
  422. # Issue #16925
  423. # multi letter function names
  424. # > simple
  425. assert latex(Function('ab')) == r"\operatorname{ab}"
  426. assert latex(Function('ab1')) == r"\operatorname{ab}_{1}"
  427. assert latex(Function('ab12')) == r"\operatorname{ab}_{12}"
  428. assert latex(Function('ab_1')) == r"\operatorname{ab}_{1}"
  429. assert latex(Function('ab_12')) == r"\operatorname{ab}_{12}"
  430. assert latex(Function('ab_c')) == r"\operatorname{ab}_{c}"
  431. assert latex(Function('ab_cd')) == r"\operatorname{ab}_{cd}"
  432. # > with argument
  433. assert latex(Function('ab')(Symbol('x'))) == r"\operatorname{ab}{\left(x \right)}"
  434. assert latex(Function('ab1')(Symbol('x'))) == r"\operatorname{ab}_{1}{\left(x \right)}"
  435. assert latex(Function('ab12')(Symbol('x'))) == r"\operatorname{ab}_{12}{\left(x \right)}"
  436. assert latex(Function('ab_1')(Symbol('x'))) == r"\operatorname{ab}_{1}{\left(x \right)}"
  437. assert latex(Function('ab_c')(Symbol('x'))) == r"\operatorname{ab}_{c}{\left(x \right)}"
  438. assert latex(Function('ab_cd')(Symbol('x'))) == r"\operatorname{ab}_{cd}{\left(x \right)}"
  439. # > with power
  440. # does not work on functions without brackets
  441. # > with argument and power combined
  442. assert latex(Function('ab')()**2) == r"\operatorname{ab}^{2}{\left( \right)}"
  443. assert latex(Function('ab1')()**2) == r"\operatorname{ab}_{1}^{2}{\left( \right)}"
  444. assert latex(Function('ab12')()**2) == r"\operatorname{ab}_{12}^{2}{\left( \right)}"
  445. assert latex(Function('ab_1')()**2) == r"\operatorname{ab}_{1}^{2}{\left( \right)}"
  446. assert latex(Function('ab_12')()**2) == r"\operatorname{ab}_{12}^{2}{\left( \right)}"
  447. assert latex(Function('ab')(Symbol('x'))**2) == r"\operatorname{ab}^{2}{\left(x \right)}"
  448. assert latex(Function('ab1')(Symbol('x'))**2) == r"\operatorname{ab}_{1}^{2}{\left(x \right)}"
  449. assert latex(Function('ab12')(Symbol('x'))**2) == r"\operatorname{ab}_{12}^{2}{\left(x \right)}"
  450. assert latex(Function('ab_1')(Symbol('x'))**2) == r"\operatorname{ab}_{1}^{2}{\left(x \right)}"
  451. assert latex(Function('ab_12')(Symbol('x'))**2) == \
  452. r"\operatorname{ab}_{12}^{2}{\left(x \right)}"
  453. # single letter function names
  454. # > simple
  455. assert latex(Function('a')) == r"a"
  456. assert latex(Function('a1')) == r"a_{1}"
  457. assert latex(Function('a12')) == r"a_{12}"
  458. assert latex(Function('a_1')) == r"a_{1}"
  459. assert latex(Function('a_12')) == r"a_{12}"
  460. # > with argument
  461. assert latex(Function('a')()) == r"a{\left( \right)}"
  462. assert latex(Function('a1')()) == r"a_{1}{\left( \right)}"
  463. assert latex(Function('a12')()) == r"a_{12}{\left( \right)}"
  464. assert latex(Function('a_1')()) == r"a_{1}{\left( \right)}"
  465. assert latex(Function('a_12')()) == r"a_{12}{\left( \right)}"
  466. # > with power
  467. # does not work on functions without brackets
  468. # > with argument and power combined
  469. assert latex(Function('a')()**2) == r"a^{2}{\left( \right)}"
  470. assert latex(Function('a1')()**2) == r"a_{1}^{2}{\left( \right)}"
  471. assert latex(Function('a12')()**2) == r"a_{12}^{2}{\left( \right)}"
  472. assert latex(Function('a_1')()**2) == r"a_{1}^{2}{\left( \right)}"
  473. assert latex(Function('a_12')()**2) == r"a_{12}^{2}{\left( \right)}"
  474. assert latex(Function('a')(Symbol('x'))**2) == r"a^{2}{\left(x \right)}"
  475. assert latex(Function('a1')(Symbol('x'))**2) == r"a_{1}^{2}{\left(x \right)}"
  476. assert latex(Function('a12')(Symbol('x'))**2) == r"a_{12}^{2}{\left(x \right)}"
  477. assert latex(Function('a_1')(Symbol('x'))**2) == r"a_{1}^{2}{\left(x \right)}"
  478. assert latex(Function('a_12')(Symbol('x'))**2) == r"a_{12}^{2}{\left(x \right)}"
  479. assert latex(Function('a')()**32) == r"a^{32}{\left( \right)}"
  480. assert latex(Function('a1')()**32) == r"a_{1}^{32}{\left( \right)}"
  481. assert latex(Function('a12')()**32) == r"a_{12}^{32}{\left( \right)}"
  482. assert latex(Function('a_1')()**32) == r"a_{1}^{32}{\left( \right)}"
  483. assert latex(Function('a_12')()**32) == r"a_{12}^{32}{\left( \right)}"
  484. assert latex(Function('a')(Symbol('x'))**32) == r"a^{32}{\left(x \right)}"
  485. assert latex(Function('a1')(Symbol('x'))**32) == r"a_{1}^{32}{\left(x \right)}"
  486. assert latex(Function('a12')(Symbol('x'))**32) == r"a_{12}^{32}{\left(x \right)}"
  487. assert latex(Function('a_1')(Symbol('x'))**32) == r"a_{1}^{32}{\left(x \right)}"
  488. assert latex(Function('a_12')(Symbol('x'))**32) == r"a_{12}^{32}{\left(x \right)}"
  489. assert latex(Function('a')()**a) == r"a^{a}{\left( \right)}"
  490. assert latex(Function('a1')()**a) == r"a_{1}^{a}{\left( \right)}"
  491. assert latex(Function('a12')()**a) == r"a_{12}^{a}{\left( \right)}"
  492. assert latex(Function('a_1')()**a) == r"a_{1}^{a}{\left( \right)}"
  493. assert latex(Function('a_12')()**a) == r"a_{12}^{a}{\left( \right)}"
  494. assert latex(Function('a')(Symbol('x'))**a) == r"a^{a}{\left(x \right)}"
  495. assert latex(Function('a1')(Symbol('x'))**a) == r"a_{1}^{a}{\left(x \right)}"
  496. assert latex(Function('a12')(Symbol('x'))**a) == r"a_{12}^{a}{\left(x \right)}"
  497. assert latex(Function('a_1')(Symbol('x'))**a) == r"a_{1}^{a}{\left(x \right)}"
  498. assert latex(Function('a_12')(Symbol('x'))**a) == r"a_{12}^{a}{\left(x \right)}"
  499. ab = Symbol('ab')
  500. assert latex(Function('a')()**ab) == r"a^{ab}{\left( \right)}"
  501. assert latex(Function('a1')()**ab) == r"a_{1}^{ab}{\left( \right)}"
  502. assert latex(Function('a12')()**ab) == r"a_{12}^{ab}{\left( \right)}"
  503. assert latex(Function('a_1')()**ab) == r"a_{1}^{ab}{\left( \right)}"
  504. assert latex(Function('a_12')()**ab) == r"a_{12}^{ab}{\left( \right)}"
  505. assert latex(Function('a')(Symbol('x'))**ab) == r"a^{ab}{\left(x \right)}"
  506. assert latex(Function('a1')(Symbol('x'))**ab) == r"a_{1}^{ab}{\left(x \right)}"
  507. assert latex(Function('a12')(Symbol('x'))**ab) == r"a_{12}^{ab}{\left(x \right)}"
  508. assert latex(Function('a_1')(Symbol('x'))**ab) == r"a_{1}^{ab}{\left(x \right)}"
  509. assert latex(Function('a_12')(Symbol('x'))**ab) == r"a_{12}^{ab}{\left(x \right)}"
  510. assert latex(Function('a^12')(x)) == R"a^{12}{\left(x \right)}"
  511. assert latex(Function('a^12')(x) ** ab) == R"\left(a^{12}\right)^{ab}{\left(x \right)}"
  512. assert latex(Function('a__12')(x)) == R"a^{12}{\left(x \right)}"
  513. assert latex(Function('a__12')(x) ** ab) == R"\left(a^{12}\right)^{ab}{\left(x \right)}"
  514. assert latex(Function('a_1__1_2')(x)) == R"a^{1}_{1 2}{\left(x \right)}"
  515. # issue 5868
  516. omega1 = Function('omega1')
  517. assert latex(omega1) == r"\omega_{1}"
  518. assert latex(omega1(x)) == r"\omega_{1}{\left(x \right)}"
  519. assert latex(sin(x)) == r"\sin{\left(x \right)}"
  520. assert latex(sin(x), fold_func_brackets=True) == r"\sin {x}"
  521. assert latex(sin(2*x**2), fold_func_brackets=True) == \
  522. r"\sin {2 x^{2}}"
  523. assert latex(sin(x**2), fold_func_brackets=True) == \
  524. r"\sin {x^{2}}"
  525. assert latex(asin(x)**2) == r"\operatorname{asin}^{2}{\left(x \right)}"
  526. assert latex(asin(x)**2, inv_trig_style="full") == \
  527. r"\arcsin^{2}{\left(x \right)}"
  528. assert latex(asin(x)**2, inv_trig_style="power") == \
  529. r"\sin^{-1}{\left(x \right)}^{2}"
  530. assert latex(asin(x**2), inv_trig_style="power",
  531. fold_func_brackets=True) == \
  532. r"\sin^{-1} {x^{2}}"
  533. assert latex(acsc(x), inv_trig_style="full") == \
  534. r"\operatorname{arccsc}{\left(x \right)}"
  535. assert latex(asinh(x), inv_trig_style="full") == \
  536. r"\operatorname{arsinh}{\left(x \right)}"
  537. assert latex(factorial(k)) == r"k!"
  538. assert latex(factorial(-k)) == r"\left(- k\right)!"
  539. assert latex(factorial(k)**2) == r"k!^{2}"
  540. assert latex(subfactorial(k)) == r"!k"
  541. assert latex(subfactorial(-k)) == r"!\left(- k\right)"
  542. assert latex(subfactorial(k)**2) == r"\left(!k\right)^{2}"
  543. assert latex(factorial2(k)) == r"k!!"
  544. assert latex(factorial2(-k)) == r"\left(- k\right)!!"
  545. assert latex(factorial2(k)**2) == r"k!!^{2}"
  546. assert latex(binomial(2, k)) == r"{\binom{2}{k}}"
  547. assert latex(binomial(2, k)**2) == r"{\binom{2}{k}}^{2}"
  548. assert latex(FallingFactorial(3, k)) == r"{\left(3\right)}_{k}"
  549. assert latex(RisingFactorial(3, k)) == r"{3}^{\left(k\right)}"
  550. assert latex(floor(x)) == r"\left\lfloor{x}\right\rfloor"
  551. assert latex(ceiling(x)) == r"\left\lceil{x}\right\rceil"
  552. assert latex(frac(x)) == r"\operatorname{frac}{\left(x\right)}"
  553. assert latex(floor(x)**2) == r"\left\lfloor{x}\right\rfloor^{2}"
  554. assert latex(ceiling(x)**2) == r"\left\lceil{x}\right\rceil^{2}"
  555. assert latex(frac(x)**2) == r"\operatorname{frac}{\left(x\right)}^{2}"
  556. assert latex(Min(x, 2, x**3)) == r"\min\left(2, x, x^{3}\right)"
  557. assert latex(Min(x, y)**2) == r"\min\left(x, y\right)^{2}"
  558. assert latex(Max(x, 2, x**3)) == r"\max\left(2, x, x^{3}\right)"
  559. assert latex(Max(x, y)**2) == r"\max\left(x, y\right)^{2}"
  560. assert latex(Abs(x)) == r"\left|{x}\right|"
  561. assert latex(Abs(x)**2) == r"\left|{x}\right|^{2}"
  562. assert latex(re(x)) == r"\operatorname{re}{\left(x\right)}"
  563. assert latex(re(x + y)) == \
  564. r"\operatorname{re}{\left(x\right)} + \operatorname{re}{\left(y\right)}"
  565. assert latex(im(x)) == r"\operatorname{im}{\left(x\right)}"
  566. assert latex(conjugate(x)) == r"\overline{x}"
  567. assert latex(conjugate(x)**2) == r"\overline{x}^{2}"
  568. assert latex(conjugate(x**2)) == r"\overline{x}^{2}"
  569. assert latex(gamma(x)) == r"\Gamma\left(x\right)"
  570. w = Wild('w')
  571. assert latex(gamma(w)) == r"\Gamma\left(w\right)"
  572. assert latex(Order(x)) == r"O\left(x\right)"
  573. assert latex(Order(x, x)) == r"O\left(x\right)"
  574. assert latex(Order(x, (x, 0))) == r"O\left(x\right)"
  575. assert latex(Order(x, (x, oo))) == r"O\left(x; x\rightarrow \infty\right)"
  576. assert latex(Order(x - y, (x, y))) == \
  577. r"O\left(x - y; x\rightarrow y\right)"
  578. assert latex(Order(x, x, y)) == \
  579. r"O\left(x; \left( x, \ y\right)\rightarrow \left( 0, \ 0\right)\right)"
  580. assert latex(Order(x, x, y)) == \
  581. r"O\left(x; \left( x, \ y\right)\rightarrow \left( 0, \ 0\right)\right)"
  582. assert latex(Order(x, (x, oo), (y, oo))) == \
  583. r"O\left(x; \left( x, \ y\right)\rightarrow \left( \infty, \ \infty\right)\right)"
  584. assert latex(lowergamma(x, y)) == r'\gamma\left(x, y\right)'
  585. assert latex(lowergamma(x, y)**2) == r'\gamma^{2}\left(x, y\right)'
  586. assert latex(uppergamma(x, y)) == r'\Gamma\left(x, y\right)'
  587. assert latex(uppergamma(x, y)**2) == r'\Gamma^{2}\left(x, y\right)'
  588. assert latex(cot(x)) == r'\cot{\left(x \right)}'
  589. assert latex(coth(x)) == r'\coth{\left(x \right)}'
  590. assert latex(re(x)) == r'\operatorname{re}{\left(x\right)}'
  591. assert latex(im(x)) == r'\operatorname{im}{\left(x\right)}'
  592. assert latex(root(x, y)) == r'x^{\frac{1}{y}}'
  593. assert latex(arg(x)) == r'\arg{\left(x \right)}'
  594. assert latex(zeta(x)) == r"\zeta\left(x\right)"
  595. assert latex(zeta(x)**2) == r"\zeta^{2}\left(x\right)"
  596. assert latex(zeta(x, y)) == r"\zeta\left(x, y\right)"
  597. assert latex(zeta(x, y)**2) == r"\zeta^{2}\left(x, y\right)"
  598. assert latex(dirichlet_eta(x)) == r"\eta\left(x\right)"
  599. assert latex(dirichlet_eta(x)**2) == r"\eta^{2}\left(x\right)"
  600. assert latex(polylog(x, y)) == r"\operatorname{Li}_{x}\left(y\right)"
  601. assert latex(
  602. polylog(x, y)**2) == r"\operatorname{Li}_{x}^{2}\left(y\right)"
  603. assert latex(lerchphi(x, y, n)) == r"\Phi\left(x, y, n\right)"
  604. assert latex(lerchphi(x, y, n)**2) == r"\Phi^{2}\left(x, y, n\right)"
  605. assert latex(stieltjes(x)) == r"\gamma_{x}"
  606. assert latex(stieltjes(x)**2) == r"\gamma_{x}^{2}"
  607. assert latex(stieltjes(x, y)) == r"\gamma_{x}\left(y\right)"
  608. assert latex(stieltjes(x, y)**2) == r"\gamma_{x}\left(y\right)^{2}"
  609. assert latex(elliptic_k(z)) == r"K\left(z\right)"
  610. assert latex(elliptic_k(z)**2) == r"K^{2}\left(z\right)"
  611. assert latex(elliptic_f(x, y)) == r"F\left(x\middle| y\right)"
  612. assert latex(elliptic_f(x, y)**2) == r"F^{2}\left(x\middle| y\right)"
  613. assert latex(elliptic_e(x, y)) == r"E\left(x\middle| y\right)"
  614. assert latex(elliptic_e(x, y)**2) == r"E^{2}\left(x\middle| y\right)"
  615. assert latex(elliptic_e(z)) == r"E\left(z\right)"
  616. assert latex(elliptic_e(z)**2) == r"E^{2}\left(z\right)"
  617. assert latex(elliptic_pi(x, y, z)) == r"\Pi\left(x; y\middle| z\right)"
  618. assert latex(elliptic_pi(x, y, z)**2) == \
  619. r"\Pi^{2}\left(x; y\middle| z\right)"
  620. assert latex(elliptic_pi(x, y)) == r"\Pi\left(x\middle| y\right)"
  621. assert latex(elliptic_pi(x, y)**2) == r"\Pi^{2}\left(x\middle| y\right)"
  622. assert latex(Ei(x)) == r'\operatorname{Ei}{\left(x \right)}'
  623. assert latex(Ei(x)**2) == r'\operatorname{Ei}^{2}{\left(x \right)}'
  624. assert latex(expint(x, y)) == r'\operatorname{E}_{x}\left(y\right)'
  625. assert latex(expint(x, y)**2) == r'\operatorname{E}_{x}^{2}\left(y\right)'
  626. assert latex(Shi(x)**2) == r'\operatorname{Shi}^{2}{\left(x \right)}'
  627. assert latex(Si(x)**2) == r'\operatorname{Si}^{2}{\left(x \right)}'
  628. assert latex(Ci(x)**2) == r'\operatorname{Ci}^{2}{\left(x \right)}'
  629. assert latex(Chi(x)**2) == r'\operatorname{Chi}^{2}\left(x\right)'
  630. assert latex(Chi(x)) == r'\operatorname{Chi}\left(x\right)'
  631. assert latex(jacobi(n, a, b, x)) == \
  632. r'P_{n}^{\left(a,b\right)}\left(x\right)'
  633. assert latex(jacobi(n, a, b, x)**2) == \
  634. r'\left(P_{n}^{\left(a,b\right)}\left(x\right)\right)^{2}'
  635. assert latex(gegenbauer(n, a, x)) == \
  636. r'C_{n}^{\left(a\right)}\left(x\right)'
  637. assert latex(gegenbauer(n, a, x)**2) == \
  638. r'\left(C_{n}^{\left(a\right)}\left(x\right)\right)^{2}'
  639. assert latex(chebyshevt(n, x)) == r'T_{n}\left(x\right)'
  640. assert latex(chebyshevt(n, x)**2) == \
  641. r'\left(T_{n}\left(x\right)\right)^{2}'
  642. assert latex(chebyshevu(n, x)) == r'U_{n}\left(x\right)'
  643. assert latex(chebyshevu(n, x)**2) == \
  644. r'\left(U_{n}\left(x\right)\right)^{2}'
  645. assert latex(legendre(n, x)) == r'P_{n}\left(x\right)'
  646. assert latex(legendre(n, x)**2) == r'\left(P_{n}\left(x\right)\right)^{2}'
  647. assert latex(assoc_legendre(n, a, x)) == \
  648. r'P_{n}^{\left(a\right)}\left(x\right)'
  649. assert latex(assoc_legendre(n, a, x)**2) == \
  650. r'\left(P_{n}^{\left(a\right)}\left(x\right)\right)^{2}'
  651. assert latex(laguerre(n, x)) == r'L_{n}\left(x\right)'
  652. assert latex(laguerre(n, x)**2) == r'\left(L_{n}\left(x\right)\right)^{2}'
  653. assert latex(assoc_laguerre(n, a, x)) == \
  654. r'L_{n}^{\left(a\right)}\left(x\right)'
  655. assert latex(assoc_laguerre(n, a, x)**2) == \
  656. r'\left(L_{n}^{\left(a\right)}\left(x\right)\right)^{2}'
  657. assert latex(hermite(n, x)) == r'H_{n}\left(x\right)'
  658. assert latex(hermite(n, x)**2) == r'\left(H_{n}\left(x\right)\right)^{2}'
  659. theta = Symbol("theta", real=True)
  660. phi = Symbol("phi", real=True)
  661. assert latex(Ynm(n, m, theta, phi)) == r'Y_{n}^{m}\left(\theta,\phi\right)'
  662. assert latex(Ynm(n, m, theta, phi)**3) == \
  663. r'\left(Y_{n}^{m}\left(\theta,\phi\right)\right)^{3}'
  664. assert latex(Znm(n, m, theta, phi)) == r'Z_{n}^{m}\left(\theta,\phi\right)'
  665. assert latex(Znm(n, m, theta, phi)**3) == \
  666. r'\left(Z_{n}^{m}\left(\theta,\phi\right)\right)^{3}'
  667. # Test latex printing of function names with "_"
  668. assert latex(polar_lift(0)) == \
  669. r"\operatorname{polar\_lift}{\left(0 \right)}"
  670. assert latex(polar_lift(0)**3) == \
  671. r"\operatorname{polar\_lift}^{3}{\left(0 \right)}"
  672. assert latex(totient(n)) == r'\phi\left(n\right)'
  673. assert latex(totient(n) ** 2) == r'\left(\phi\left(n\right)\right)^{2}'
  674. assert latex(reduced_totient(n)) == r'\lambda\left(n\right)'
  675. assert latex(reduced_totient(n) ** 2) == \
  676. r'\left(\lambda\left(n\right)\right)^{2}'
  677. assert latex(divisor_sigma(x)) == r"\sigma\left(x\right)"
  678. assert latex(divisor_sigma(x)**2) == r"\sigma^{2}\left(x\right)"
  679. assert latex(divisor_sigma(x, y)) == r"\sigma_y\left(x\right)"
  680. assert latex(divisor_sigma(x, y)**2) == r"\sigma^{2}_y\left(x\right)"
  681. assert latex(udivisor_sigma(x)) == r"\sigma^*\left(x\right)"
  682. assert latex(udivisor_sigma(x)**2) == r"\sigma^*^{2}\left(x\right)"
  683. assert latex(udivisor_sigma(x, y)) == r"\sigma^*_y\left(x\right)"
  684. assert latex(udivisor_sigma(x, y)**2) == r"\sigma^*^{2}_y\left(x\right)"
  685. assert latex(primenu(n)) == r'\nu\left(n\right)'
  686. assert latex(primenu(n) ** 2) == r'\left(\nu\left(n\right)\right)^{2}'
  687. assert latex(primeomega(n)) == r'\Omega\left(n\right)'
  688. assert latex(primeomega(n) ** 2) == \
  689. r'\left(\Omega\left(n\right)\right)^{2}'
  690. assert latex(LambertW(n)) == r'W\left(n\right)'
  691. assert latex(LambertW(n, -1)) == r'W_{-1}\left(n\right)'
  692. assert latex(LambertW(n, k)) == r'W_{k}\left(n\right)'
  693. assert latex(LambertW(n) * LambertW(n)) == r"W^{2}\left(n\right)"
  694. assert latex(Pow(LambertW(n), 2)) == r"W^{2}\left(n\right)"
  695. assert latex(LambertW(n)**k) == r"W^{k}\left(n\right)"
  696. assert latex(LambertW(n, k)**p) == r"W^{p}_{k}\left(n\right)"
  697. assert latex(Mod(x, 7)) == r'x \bmod 7'
  698. assert latex(Mod(x + 1, 7)) == r'\left(x + 1\right) \bmod 7'
  699. assert latex(Mod(7, x + 1)) == r'7 \bmod \left(x + 1\right)'
  700. assert latex(Mod(2 * x, 7)) == r'2 x \bmod 7'
  701. assert latex(Mod(7, 2 * x)) == r'7 \bmod 2 x'
  702. assert latex(Mod(x, 7) + 1) == r'\left(x \bmod 7\right) + 1'
  703. assert latex(2 * Mod(x, 7)) == r'2 \left(x \bmod 7\right)'
  704. assert latex(Mod(7, 2 * x)**n) == r'\left(7 \bmod 2 x\right)^{n}'
  705. # some unknown function name should get rendered with \operatorname
  706. fjlkd = Function('fjlkd')
  707. assert latex(fjlkd(x)) == r'\operatorname{fjlkd}{\left(x \right)}'
  708. # even when it is referred to without an argument
  709. assert latex(fjlkd) == r'\operatorname{fjlkd}'
  710. # test that notation passes to subclasses of the same name only
  711. def test_function_subclass_different_name():
  712. class mygamma(gamma):
  713. pass
  714. assert latex(mygamma) == r"\operatorname{mygamma}"
  715. assert latex(mygamma(x)) == r"\operatorname{mygamma}{\left(x \right)}"
  716. def test_hyper_printing():
  717. from sympy.abc import x, z
  718. assert latex(meijerg(Tuple(pi, pi, x), Tuple(1),
  719. (0, 1), Tuple(1, 2, 3/pi), z)) == \
  720. r'{G_{4, 5}^{2, 3}\left(\begin{matrix} \pi, \pi, x & 1 \\0, 1 & 1, 2, '\
  721. r'\frac{3}{\pi} \end{matrix} \middle| {z} \right)}'
  722. assert latex(meijerg(Tuple(), Tuple(1), (0,), Tuple(), z)) == \
  723. r'{G_{1, 1}^{1, 0}\left(\begin{matrix} & 1 \\0 & \end{matrix} \middle| {z} \right)}'
  724. assert latex(hyper((x, 2), (3,), z)) == \
  725. r'{{}_{2}F_{1}\left(\begin{matrix} 2, x ' \
  726. r'\\ 3 \end{matrix}\middle| {z} \right)}'
  727. assert latex(hyper(Tuple(), Tuple(1), z)) == \
  728. r'{{}_{0}F_{1}\left(\begin{matrix} ' \
  729. r'\\ 1 \end{matrix}\middle| {z} \right)}'
  730. def test_latex_bessel():
  731. from sympy.functions.special.bessel import (besselj, bessely, besseli,
  732. besselk, hankel1, hankel2,
  733. jn, yn, hn1, hn2)
  734. from sympy.abc import z
  735. assert latex(besselj(n, z**2)**k) == r'J^{k}_{n}\left(z^{2}\right)'
  736. assert latex(bessely(n, z)) == r'Y_{n}\left(z\right)'
  737. assert latex(besseli(n, z)) == r'I_{n}\left(z\right)'
  738. assert latex(besselk(n, z)) == r'K_{n}\left(z\right)'
  739. assert latex(hankel1(n, z**2)**2) == \
  740. r'\left(H^{(1)}_{n}\left(z^{2}\right)\right)^{2}'
  741. assert latex(hankel2(n, z)) == r'H^{(2)}_{n}\left(z\right)'
  742. assert latex(jn(n, z)) == r'j_{n}\left(z\right)'
  743. assert latex(yn(n, z)) == r'y_{n}\left(z\right)'
  744. assert latex(hn1(n, z)) == r'h^{(1)}_{n}\left(z\right)'
  745. assert latex(hn2(n, z)) == r'h^{(2)}_{n}\left(z\right)'
  746. def test_latex_fresnel():
  747. from sympy.functions.special.error_functions import (fresnels, fresnelc)
  748. from sympy.abc import z
  749. assert latex(fresnels(z)) == r'S\left(z\right)'
  750. assert latex(fresnelc(z)) == r'C\left(z\right)'
  751. assert latex(fresnels(z)**2) == r'S^{2}\left(z\right)'
  752. assert latex(fresnelc(z)**2) == r'C^{2}\left(z\right)'
  753. def test_latex_brackets():
  754. assert latex((-1)**x) == r"\left(-1\right)^{x}"
  755. def test_latex_indexed():
  756. Psi_symbol = Symbol('Psi_0', complex=True, real=False)
  757. Psi_indexed = IndexedBase(Symbol('Psi', complex=True, real=False))
  758. symbol_latex = latex(Psi_symbol * conjugate(Psi_symbol))
  759. indexed_latex = latex(Psi_indexed[0] * conjugate(Psi_indexed[0]))
  760. # \\overline{{\\Psi}_{0}} {\\Psi}_{0} vs. \\Psi_{0} \\overline{\\Psi_{0}}
  761. assert symbol_latex == r'\Psi_{0} \overline{\Psi_{0}}'
  762. assert indexed_latex == r'\overline{{\Psi}_{0}} {\Psi}_{0}'
  763. # Symbol('gamma') gives r'\gamma'
  764. interval = '\\mathrel{..}\\nobreak '
  765. assert latex(Indexed('x1', Symbol('i'))) == r'{x_{1}}_{i}'
  766. assert latex(Indexed('x2', Idx('i'))) == r'{x_{2}}_{i}'
  767. assert latex(Indexed('x3', Idx('i', Symbol('N')))) == r'{x_{3}}_{{i}_{0'+interval+'N - 1}}'
  768. assert latex(Indexed('x3', Idx('i', Symbol('N')+1))) == r'{x_{3}}_{{i}_{0'+interval+'N}}'
  769. assert latex(Indexed('x4', Idx('i', (Symbol('a'),Symbol('b'))))) == r'{x_{4}}_{{i}_{a'+interval+'b}}'
  770. assert latex(IndexedBase('gamma')) == r'\gamma'
  771. assert latex(IndexedBase('a b')) == r'a b'
  772. assert latex(IndexedBase('a_b')) == r'a_{b}'
  773. def test_latex_derivatives():
  774. # regular "d" for ordinary derivatives
  775. assert latex(diff(x**3, x, evaluate=False)) == \
  776. r"\frac{d}{d x} x^{3}"
  777. assert latex(diff(sin(x) + x**2, x, evaluate=False)) == \
  778. r"\frac{d}{d x} \left(x^{2} + \sin{\left(x \right)}\right)"
  779. assert latex(diff(diff(sin(x) + x**2, x, evaluate=False), evaluate=False))\
  780. == \
  781. r"\frac{d^{2}}{d x^{2}} \left(x^{2} + \sin{\left(x \right)}\right)"
  782. assert latex(diff(diff(diff(sin(x) + x**2, x, evaluate=False), evaluate=False), evaluate=False)) == \
  783. r"\frac{d^{3}}{d x^{3}} \left(x^{2} + \sin{\left(x \right)}\right)"
  784. # \partial for partial derivatives
  785. assert latex(diff(sin(x * y), x, evaluate=False)) == \
  786. r"\frac{\partial}{\partial x} \sin{\left(x y \right)}"
  787. assert latex(diff(sin(x * y) + x**2, x, evaluate=False)) == \
  788. r"\frac{\partial}{\partial x} \left(x^{2} + \sin{\left(x y \right)}\right)"
  789. assert latex(diff(diff(sin(x*y) + x**2, x, evaluate=False), x, evaluate=False)) == \
  790. r"\frac{\partial^{2}}{\partial x^{2}} \left(x^{2} + \sin{\left(x y \right)}\right)"
  791. assert latex(diff(diff(diff(sin(x*y) + x**2, x, evaluate=False), x, evaluate=False), x, evaluate=False)) == \
  792. r"\frac{\partial^{3}}{\partial x^{3}} \left(x^{2} + \sin{\left(x y \right)}\right)"
  793. # mixed partial derivatives
  794. f = Function("f")
  795. assert latex(diff(diff(f(x, y), x, evaluate=False), y, evaluate=False)) == \
  796. r"\frac{\partial^{2}}{\partial y\partial x} " + latex(f(x, y))
  797. assert latex(diff(diff(diff(f(x, y), x, evaluate=False), x, evaluate=False), y, evaluate=False)) == \
  798. r"\frac{\partial^{3}}{\partial y\partial x^{2}} " + latex(f(x, y))
  799. # for negative nested Derivative
  800. assert latex(diff(-diff(y**2,x,evaluate=False),x,evaluate=False)) == r'\frac{d}{d x} \left(- \frac{d}{d x} y^{2}\right)'
  801. assert latex(diff(diff(-diff(diff(y,x,evaluate=False),x,evaluate=False),x,evaluate=False),x,evaluate=False)) == \
  802. r'\frac{d^{2}}{d x^{2}} \left(- \frac{d^{2}}{d x^{2}} y\right)'
  803. # use ordinary d when one of the variables has been integrated out
  804. assert latex(diff(Integral(exp(-x*y), (x, 0, oo)), y, evaluate=False)) == \
  805. r"\frac{d}{d y} \int\limits_{0}^{\infty} e^{- x y}\, dx"
  806. # Derivative wrapped in power:
  807. assert latex(diff(x, x, evaluate=False)**2) == \
  808. r"\left(\frac{d}{d x} x\right)^{2}"
  809. assert latex(diff(f(x), x)**2) == \
  810. r"\left(\frac{d}{d x} f{\left(x \right)}\right)^{2}"
  811. assert latex(diff(f(x), (x, n))) == \
  812. r"\frac{d^{n}}{d x^{n}} f{\left(x \right)}"
  813. x1 = Symbol('x1')
  814. x2 = Symbol('x2')
  815. assert latex(diff(f(x1, x2), x1)) == r'\frac{\partial}{\partial x_{1}} f{\left(x_{1},x_{2} \right)}'
  816. n1 = Symbol('n1')
  817. assert latex(diff(f(x), (x, n1))) == r'\frac{d^{n_{1}}}{d x^{n_{1}}} f{\left(x \right)}'
  818. n2 = Symbol('n2')
  819. assert latex(diff(f(x), (x, Max(n1, n2)))) == \
  820. r'\frac{d^{\max\left(n_{1}, n_{2}\right)}}{d x^{\max\left(n_{1}, n_{2}\right)}} f{\left(x \right)}'
  821. # set diff operator
  822. assert latex(diff(f(x), x), diff_operator="rd") == r'\frac{\mathrm{d}}{\mathrm{d} x} f{\left(x \right)}'
  823. def test_latex_subs():
  824. assert latex(Subs(x*y, (x, y), (1, 2))) == r'\left. x y \right|_{\substack{ x=1\\ y=2 }}'
  825. def test_latex_integrals():
  826. assert latex(Integral(log(x), x)) == r"\int \log{\left(x \right)}\, dx"
  827. assert latex(Integral(x**2, (x, 0, 1))) == \
  828. r"\int\limits_{0}^{1} x^{2}\, dx"
  829. assert latex(Integral(x**2, (x, 10, 20))) == \
  830. r"\int\limits_{10}^{20} x^{2}\, dx"
  831. assert latex(Integral(y*x**2, (x, 0, 1), y)) == \
  832. r"\int\int\limits_{0}^{1} x^{2} y\, dx\, dy"
  833. assert latex(Integral(y*x**2, (x, 0, 1), y), mode='equation*') == \
  834. r"\begin{equation*}\int\int\limits_{0}^{1} x^{2} y\, dx\, dy\end{equation*}"
  835. assert latex(Integral(y*x**2, (x, 0, 1), y), mode='equation*', itex=True) \
  836. == r"$$\int\int_{0}^{1} x^{2} y\, dx\, dy$$"
  837. assert latex(Integral(x, (x, 0))) == r"\int\limits^{0} x\, dx"
  838. assert latex(Integral(x*y, x, y)) == r"\iint x y\, dx\, dy"
  839. assert latex(Integral(x*y*z, x, y, z)) == r"\iiint x y z\, dx\, dy\, dz"
  840. assert latex(Integral(x*y*z*t, x, y, z, t)) == \
  841. r"\iiiint t x y z\, dx\, dy\, dz\, dt"
  842. assert latex(Integral(x, x, x, x, x, x, x)) == \
  843. r"\int\int\int\int\int\int x\, dx\, dx\, dx\, dx\, dx\, dx"
  844. assert latex(Integral(x, x, y, (z, 0, 1))) == \
  845. r"\int\limits_{0}^{1}\int\int x\, dx\, dy\, dz"
  846. # for negative nested Integral
  847. assert latex(Integral(-Integral(y**2,x),x)) == \
  848. r'\int \left(- \int y^{2}\, dx\right)\, dx'
  849. assert latex(Integral(-Integral(-Integral(y,x),x),x)) == \
  850. r'\int \left(- \int \left(- \int y\, dx\right)\, dx\right)\, dx'
  851. # fix issue #10806
  852. assert latex(Integral(z, z)**2) == r"\left(\int z\, dz\right)^{2}"
  853. assert latex(Integral(x + z, z)) == r"\int \left(x + z\right)\, dz"
  854. assert latex(Integral(x+z/2, z)) == \
  855. r"\int \left(x + \frac{z}{2}\right)\, dz"
  856. assert latex(Integral(x**y, z)) == r"\int x^{y}\, dz"
  857. # set diff operator
  858. assert latex(Integral(x, x), diff_operator="rd") == r'\int x\, \mathrm{d}x'
  859. assert latex(Integral(x, (x, 0, 1)), diff_operator="rd") == r'\int\limits_{0}^{1} x\, \mathrm{d}x'
  860. def test_latex_sets():
  861. for s in (frozenset, set):
  862. assert latex(s([x*y, x**2])) == r"\left\{x^{2}, x y\right\}"
  863. assert latex(s(range(1, 6))) == r"\left\{1, 2, 3, 4, 5\right\}"
  864. assert latex(s(range(1, 13))) == \
  865. r"\left\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12\right\}"
  866. s = FiniteSet
  867. assert latex(s(*[x*y, x**2])) == r"\left\{x^{2}, x y\right\}"
  868. assert latex(s(*range(1, 6))) == r"\left\{1, 2, 3, 4, 5\right\}"
  869. assert latex(s(*range(1, 13))) == \
  870. r"\left\{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12\right\}"
  871. def test_latex_SetExpr():
  872. iv = Interval(1, 3)
  873. se = SetExpr(iv)
  874. assert latex(se) == r"SetExpr\left(\left[1, 3\right]\right)"
  875. def test_latex_Range():
  876. assert latex(Range(1, 51)) == r'\left\{1, 2, \ldots, 50\right\}'
  877. assert latex(Range(1, 4)) == r'\left\{1, 2, 3\right\}'
  878. assert latex(Range(0, 3, 1)) == r'\left\{0, 1, 2\right\}'
  879. assert latex(Range(0, 30, 1)) == r'\left\{0, 1, \ldots, 29\right\}'
  880. assert latex(Range(30, 1, -1)) == r'\left\{30, 29, \ldots, 2\right\}'
  881. assert latex(Range(0, oo, 2)) == r'\left\{0, 2, \ldots\right\}'
  882. assert latex(Range(oo, -2, -2)) == r'\left\{\ldots, 2, 0\right\}'
  883. assert latex(Range(-2, -oo, -1)) == r'\left\{-2, -3, \ldots\right\}'
  884. assert latex(Range(-oo, oo)) == r'\left\{\ldots, -1, 0, 1, \ldots\right\}'
  885. assert latex(Range(oo, -oo, -1)) == r'\left\{\ldots, 1, 0, -1, \ldots\right\}'
  886. a, b, c = symbols('a:c')
  887. assert latex(Range(a, b, c)) == r'\text{Range}\left(a, b, c\right)'
  888. assert latex(Range(a, 10, 1)) == r'\text{Range}\left(a, 10\right)'
  889. assert latex(Range(0, b, 1)) == r'\text{Range}\left(b\right)'
  890. assert latex(Range(0, 10, c)) == r'\text{Range}\left(0, 10, c\right)'
  891. i = Symbol('i', integer=True)
  892. n = Symbol('n', negative=True, integer=True)
  893. p = Symbol('p', positive=True, integer=True)
  894. assert latex(Range(i, i + 3)) == r'\left\{i, i + 1, i + 2\right\}'
  895. assert latex(Range(-oo, n, 2)) == r'\left\{\ldots, n - 4, n - 2\right\}'
  896. assert latex(Range(p, oo)) == r'\left\{p, p + 1, \ldots\right\}'
  897. # The following will work if __iter__ is improved
  898. # assert latex(Range(-3, p + 7)) == r'\left\{-3, -2, \ldots, p + 6\right\}'
  899. # Must have integer assumptions
  900. assert latex(Range(a, a + 3)) == r'\text{Range}\left(a, a + 3\right)'
  901. def test_latex_sequences():
  902. s1 = SeqFormula(a**2, (0, oo))
  903. s2 = SeqPer((1, 2))
  904. latex_str = r'\left[0, 1, 4, 9, \ldots\right]'
  905. assert latex(s1) == latex_str
  906. latex_str = r'\left[1, 2, 1, 2, \ldots\right]'
  907. assert latex(s2) == latex_str
  908. s3 = SeqFormula(a**2, (0, 2))
  909. s4 = SeqPer((1, 2), (0, 2))
  910. latex_str = r'\left[0, 1, 4\right]'
  911. assert latex(s3) == latex_str
  912. latex_str = r'\left[1, 2, 1\right]'
  913. assert latex(s4) == latex_str
  914. s5 = SeqFormula(a**2, (-oo, 0))
  915. s6 = SeqPer((1, 2), (-oo, 0))
  916. latex_str = r'\left[\ldots, 9, 4, 1, 0\right]'
  917. assert latex(s5) == latex_str
  918. latex_str = r'\left[\ldots, 2, 1, 2, 1\right]'
  919. assert latex(s6) == latex_str
  920. latex_str = r'\left[1, 3, 5, 11, \ldots\right]'
  921. assert latex(SeqAdd(s1, s2)) == latex_str
  922. latex_str = r'\left[1, 3, 5\right]'
  923. assert latex(SeqAdd(s3, s4)) == latex_str
  924. latex_str = r'\left[\ldots, 11, 5, 3, 1\right]'
  925. assert latex(SeqAdd(s5, s6)) == latex_str
  926. latex_str = r'\left[0, 2, 4, 18, \ldots\right]'
  927. assert latex(SeqMul(s1, s2)) == latex_str
  928. latex_str = r'\left[0, 2, 4\right]'
  929. assert latex(SeqMul(s3, s4)) == latex_str
  930. latex_str = r'\left[\ldots, 18, 4, 2, 0\right]'
  931. assert latex(SeqMul(s5, s6)) == latex_str
  932. # Sequences with symbolic limits, issue 12629
  933. s7 = SeqFormula(a**2, (a, 0, x))
  934. latex_str = r'\left\{a^{2}\right\}_{a=0}^{x}'
  935. assert latex(s7) == latex_str
  936. b = Symbol('b')
  937. s8 = SeqFormula(b*a**2, (a, 0, 2))
  938. latex_str = r'\left[0, b, 4 b\right]'
  939. assert latex(s8) == latex_str
  940. def test_latex_FourierSeries():
  941. latex_str = \
  942. r'2 \sin{\left(x \right)} - \sin{\left(2 x \right)} + \frac{2 \sin{\left(3 x \right)}}{3} + \ldots'
  943. assert latex(fourier_series(x, (x, -pi, pi))) == latex_str
  944. def test_latex_FormalPowerSeries():
  945. latex_str = r'\sum_{k=1}^{\infty} - \frac{\left(-1\right)^{- k} x^{k}}{k}'
  946. assert latex(fps(log(1 + x))) == latex_str
  947. def test_latex_intervals():
  948. a = Symbol('a', real=True)
  949. assert latex(Interval(0, 0)) == r"\left\{0\right\}"
  950. assert latex(Interval(0, a)) == r"\left[0, a\right]"
  951. assert latex(Interval(0, a, False, False)) == r"\left[0, a\right]"
  952. assert latex(Interval(0, a, True, False)) == r"\left(0, a\right]"
  953. assert latex(Interval(0, a, False, True)) == r"\left[0, a\right)"
  954. assert latex(Interval(0, a, True, True)) == r"\left(0, a\right)"
  955. def test_latex_AccumuBounds():
  956. a = Symbol('a', real=True)
  957. assert latex(AccumBounds(0, 1)) == r"\left\langle 0, 1\right\rangle"
  958. assert latex(AccumBounds(0, a)) == r"\left\langle 0, a\right\rangle"
  959. assert latex(AccumBounds(a + 1, a + 2)) == \
  960. r"\left\langle a + 1, a + 2\right\rangle"
  961. def test_latex_emptyset():
  962. assert latex(S.EmptySet) == r"\emptyset"
  963. def test_latex_universalset():
  964. assert latex(S.UniversalSet) == r"\mathbb{U}"
  965. def test_latex_commutator():
  966. A = Operator('A')
  967. B = Operator('B')
  968. comm = Commutator(B, A)
  969. assert latex(comm.doit()) == r"- (A B - B A)"
  970. def test_latex_union():
  971. assert latex(Union(Interval(0, 1), Interval(2, 3))) == \
  972. r"\left[0, 1\right] \cup \left[2, 3\right]"
  973. assert latex(Union(Interval(1, 1), Interval(2, 2), Interval(3, 4))) == \
  974. r"\left\{1, 2\right\} \cup \left[3, 4\right]"
  975. def test_latex_intersection():
  976. assert latex(Intersection(Interval(0, 1), Interval(x, y))) == \
  977. r"\left[0, 1\right] \cap \left[x, y\right]"
  978. def test_latex_symmetric_difference():
  979. assert latex(SymmetricDifference(Interval(2, 5), Interval(4, 7),
  980. evaluate=False)) == \
  981. r'\left[2, 5\right] \triangle \left[4, 7\right]'
  982. def test_latex_Complement():
  983. assert latex(Complement(S.Reals, S.Naturals)) == \
  984. r"\mathbb{R} \setminus \mathbb{N}"
  985. def test_latex_productset():
  986. line = Interval(0, 1)
  987. bigline = Interval(0, 10)
  988. fset = FiniteSet(1, 2, 3)
  989. assert latex(line**2) == r"%s^{2}" % latex(line)
  990. assert latex(line**10) == r"%s^{10}" % latex(line)
  991. assert latex((line * bigline * fset).flatten()) == r"%s \times %s \times %s" % (
  992. latex(line), latex(bigline), latex(fset))
  993. def test_latex_powerset():
  994. fset = FiniteSet(1, 2, 3)
  995. assert latex(PowerSet(fset)) == r'\mathcal{P}\left(\left\{1, 2, 3\right\}\right)'
  996. def test_latex_ordinals():
  997. w = OrdinalOmega()
  998. assert latex(w) == r"\omega"
  999. wp = OmegaPower(2, 3)
  1000. assert latex(wp) == r'3 \omega^{2}'
  1001. assert latex(Ordinal(wp, OmegaPower(1, 1))) == r'3 \omega^{2} + \omega'
  1002. assert latex(Ordinal(OmegaPower(2, 1), OmegaPower(1, 2))) == r'\omega^{2} + 2 \omega'
  1003. def test_set_operators_parenthesis():
  1004. a, b, c, d = symbols('a:d')
  1005. A = FiniteSet(a)
  1006. B = FiniteSet(b)
  1007. C = FiniteSet(c)
  1008. D = FiniteSet(d)
  1009. U1 = Union(A, B, evaluate=False)
  1010. U2 = Union(C, D, evaluate=False)
  1011. I1 = Intersection(A, B, evaluate=False)
  1012. I2 = Intersection(C, D, evaluate=False)
  1013. C1 = Complement(A, B, evaluate=False)
  1014. C2 = Complement(C, D, evaluate=False)
  1015. D1 = SymmetricDifference(A, B, evaluate=False)
  1016. D2 = SymmetricDifference(C, D, evaluate=False)
  1017. # XXX ProductSet does not support evaluate keyword
  1018. P1 = ProductSet(A, B)
  1019. P2 = ProductSet(C, D)
  1020. assert latex(Intersection(A, U2, evaluate=False)) == \
  1021. r'\left\{a\right\} \cap ' \
  1022. r'\left(\left\{c\right\} \cup \left\{d\right\}\right)'
  1023. assert latex(Intersection(U1, U2, evaluate=False)) == \
  1024. r'\left(\left\{a\right\} \cup \left\{b\right\}\right) ' \
  1025. r'\cap \left(\left\{c\right\} \cup \left\{d\right\}\right)'
  1026. assert latex(Intersection(C1, C2, evaluate=False)) == \
  1027. r'\left(\left\{a\right\} \setminus ' \
  1028. r'\left\{b\right\}\right) \cap \left(\left\{c\right\} ' \
  1029. r'\setminus \left\{d\right\}\right)'
  1030. assert latex(Intersection(D1, D2, evaluate=False)) == \
  1031. r'\left(\left\{a\right\} \triangle ' \
  1032. r'\left\{b\right\}\right) \cap \left(\left\{c\right\} ' \
  1033. r'\triangle \left\{d\right\}\right)'
  1034. assert latex(Intersection(P1, P2, evaluate=False)) == \
  1035. r'\left(\left\{a\right\} \times \left\{b\right\}\right) ' \
  1036. r'\cap \left(\left\{c\right\} \times ' \
  1037. r'\left\{d\right\}\right)'
  1038. assert latex(Union(A, I2, evaluate=False)) == \
  1039. r'\left\{a\right\} \cup ' \
  1040. r'\left(\left\{c\right\} \cap \left\{d\right\}\right)'
  1041. assert latex(Union(I1, I2, evaluate=False)) == \
  1042. r'\left(\left\{a\right\} \cap \left\{b\right\}\right) ' \
  1043. r'\cup \left(\left\{c\right\} \cap \left\{d\right\}\right)'
  1044. assert latex(Union(C1, C2, evaluate=False)) == \
  1045. r'\left(\left\{a\right\} \setminus ' \
  1046. r'\left\{b\right\}\right) \cup \left(\left\{c\right\} ' \
  1047. r'\setminus \left\{d\right\}\right)'
  1048. assert latex(Union(D1, D2, evaluate=False)) == \
  1049. r'\left(\left\{a\right\} \triangle ' \
  1050. r'\left\{b\right\}\right) \cup \left(\left\{c\right\} ' \
  1051. r'\triangle \left\{d\right\}\right)'
  1052. assert latex(Union(P1, P2, evaluate=False)) == \
  1053. r'\left(\left\{a\right\} \times \left\{b\right\}\right) ' \
  1054. r'\cup \left(\left\{c\right\} \times ' \
  1055. r'\left\{d\right\}\right)'
  1056. assert latex(Complement(A, C2, evaluate=False)) == \
  1057. r'\left\{a\right\} \setminus \left(\left\{c\right\} ' \
  1058. r'\setminus \left\{d\right\}\right)'
  1059. assert latex(Complement(U1, U2, evaluate=False)) == \
  1060. r'\left(\left\{a\right\} \cup \left\{b\right\}\right) ' \
  1061. r'\setminus \left(\left\{c\right\} \cup ' \
  1062. r'\left\{d\right\}\right)'
  1063. assert latex(Complement(I1, I2, evaluate=False)) == \
  1064. r'\left(\left\{a\right\} \cap \left\{b\right\}\right) ' \
  1065. r'\setminus \left(\left\{c\right\} \cap ' \
  1066. r'\left\{d\right\}\right)'
  1067. assert latex(Complement(D1, D2, evaluate=False)) == \
  1068. r'\left(\left\{a\right\} \triangle ' \
  1069. r'\left\{b\right\}\right) \setminus ' \
  1070. r'\left(\left\{c\right\} \triangle \left\{d\right\}\right)'
  1071. assert latex(Complement(P1, P2, evaluate=False)) == \
  1072. r'\left(\left\{a\right\} \times \left\{b\right\}\right) '\
  1073. r'\setminus \left(\left\{c\right\} \times '\
  1074. r'\left\{d\right\}\right)'
  1075. assert latex(SymmetricDifference(A, D2, evaluate=False)) == \
  1076. r'\left\{a\right\} \triangle \left(\left\{c\right\} ' \
  1077. r'\triangle \left\{d\right\}\right)'
  1078. assert latex(SymmetricDifference(U1, U2, evaluate=False)) == \
  1079. r'\left(\left\{a\right\} \cup \left\{b\right\}\right) ' \
  1080. r'\triangle \left(\left\{c\right\} \cup ' \
  1081. r'\left\{d\right\}\right)'
  1082. assert latex(SymmetricDifference(I1, I2, evaluate=False)) == \
  1083. r'\left(\left\{a\right\} \cap \left\{b\right\}\right) ' \
  1084. r'\triangle \left(\left\{c\right\} \cap ' \
  1085. r'\left\{d\right\}\right)'
  1086. assert latex(SymmetricDifference(C1, C2, evaluate=False)) == \
  1087. r'\left(\left\{a\right\} \setminus ' \
  1088. r'\left\{b\right\}\right) \triangle ' \
  1089. r'\left(\left\{c\right\} \setminus \left\{d\right\}\right)'
  1090. assert latex(SymmetricDifference(P1, P2, evaluate=False)) == \
  1091. r'\left(\left\{a\right\} \times \left\{b\right\}\right) ' \
  1092. r'\triangle \left(\left\{c\right\} \times ' \
  1093. r'\left\{d\right\}\right)'
  1094. # XXX This can be incorrect since cartesian product is not associative
  1095. assert latex(ProductSet(A, P2).flatten()) == \
  1096. r'\left\{a\right\} \times \left\{c\right\} \times ' \
  1097. r'\left\{d\right\}'
  1098. assert latex(ProductSet(U1, U2)) == \
  1099. r'\left(\left\{a\right\} \cup \left\{b\right\}\right) ' \
  1100. r'\times \left(\left\{c\right\} \cup ' \
  1101. r'\left\{d\right\}\right)'
  1102. assert latex(ProductSet(I1, I2)) == \
  1103. r'\left(\left\{a\right\} \cap \left\{b\right\}\right) ' \
  1104. r'\times \left(\left\{c\right\} \cap ' \
  1105. r'\left\{d\right\}\right)'
  1106. assert latex(ProductSet(C1, C2)) == \
  1107. r'\left(\left\{a\right\} \setminus ' \
  1108. r'\left\{b\right\}\right) \times \left(\left\{c\right\} ' \
  1109. r'\setminus \left\{d\right\}\right)'
  1110. assert latex(ProductSet(D1, D2)) == \
  1111. r'\left(\left\{a\right\} \triangle ' \
  1112. r'\left\{b\right\}\right) \times \left(\left\{c\right\} ' \
  1113. r'\triangle \left\{d\right\}\right)'
  1114. def test_latex_Complexes():
  1115. assert latex(S.Complexes) == r"\mathbb{C}"
  1116. def test_latex_Naturals():
  1117. assert latex(S.Naturals) == r"\mathbb{N}"
  1118. def test_latex_Naturals0():
  1119. assert latex(S.Naturals0) == r"\mathbb{N}_0"
  1120. def test_latex_Integers():
  1121. assert latex(S.Integers) == r"\mathbb{Z}"
  1122. def test_latex_ImageSet():
  1123. x = Symbol('x')
  1124. assert latex(ImageSet(Lambda(x, x**2), S.Naturals)) == \
  1125. r"\left\{x^{2}\; \middle|\; x \in \mathbb{N}\right\}"
  1126. y = Symbol('y')
  1127. imgset = ImageSet(Lambda((x, y), x + y), {1, 2, 3}, {3, 4})
  1128. assert latex(imgset) == \
  1129. r"\left\{x + y\; \middle|\; x \in \left\{1, 2, 3\right\}, y \in \left\{3, 4\right\}\right\}"
  1130. imgset = ImageSet(Lambda(((x, y),), x + y), ProductSet({1, 2, 3}, {3, 4}))
  1131. assert latex(imgset) == \
  1132. r"\left\{x + y\; \middle|\; \left( x, \ y\right) \in \left\{1, 2, 3\right\} \times \left\{3, 4\right\}\right\}"
  1133. def test_latex_ConditionSet():
  1134. x = Symbol('x')
  1135. assert latex(ConditionSet(x, Eq(x**2, 1), S.Reals)) == \
  1136. r"\left\{x\; \middle|\; x \in \mathbb{R} \wedge x^{2} = 1 \right\}"
  1137. assert latex(ConditionSet(x, Eq(x**2, 1), S.UniversalSet)) == \
  1138. r"\left\{x\; \middle|\; x^{2} = 1 \right\}"
  1139. def test_latex_ComplexRegion():
  1140. assert latex(ComplexRegion(Interval(3, 5)*Interval(4, 6))) == \
  1141. r"\left\{x + y i\; \middle|\; x, y \in \left[3, 5\right] \times \left[4, 6\right] \right\}"
  1142. assert latex(ComplexRegion(Interval(0, 1)*Interval(0, 2*pi), polar=True)) == \
  1143. r"\left\{r \left(i \sin{\left(\theta \right)} + \cos{\left(\theta "\
  1144. r"\right)}\right)\; \middle|\; r, \theta \in \left[0, 1\right] \times \left[0, 2 \pi\right) \right\}"
  1145. def test_latex_Contains():
  1146. x = Symbol('x')
  1147. assert latex(Contains(x, S.Naturals)) == r"x \in \mathbb{N}"
  1148. def test_latex_sum():
  1149. assert latex(Sum(x*y**2, (x, -2, 2), (y, -5, 5))) == \
  1150. r"\sum_{\substack{-2 \leq x \leq 2\\-5 \leq y \leq 5}} x y^{2}"
  1151. assert latex(Sum(x**2, (x, -2, 2))) == \
  1152. r"\sum_{x=-2}^{2} x^{2}"
  1153. assert latex(Sum(x**2 + y, (x, -2, 2))) == \
  1154. r"\sum_{x=-2}^{2} \left(x^{2} + y\right)"
  1155. assert latex(Sum(x**2 + y, (x, -2, 2))**2) == \
  1156. r"\left(\sum_{x=-2}^{2} \left(x^{2} + y\right)\right)^{2}"
  1157. def test_latex_product():
  1158. assert latex(Product(x*y**2, (x, -2, 2), (y, -5, 5))) == \
  1159. r"\prod_{\substack{-2 \leq x \leq 2\\-5 \leq y \leq 5}} x y^{2}"
  1160. assert latex(Product(x**2, (x, -2, 2))) == \
  1161. r"\prod_{x=-2}^{2} x^{2}"
  1162. assert latex(Product(x**2 + y, (x, -2, 2))) == \
  1163. r"\prod_{x=-2}^{2} \left(x^{2} + y\right)"
  1164. assert latex(Product(x, (x, -2, 2))**2) == \
  1165. r"\left(\prod_{x=-2}^{2} x\right)^{2}"
  1166. def test_latex_limits():
  1167. assert latex(Limit(x, x, oo)) == r"\lim_{x \to \infty} x"
  1168. # issue 8175
  1169. f = Function('f')
  1170. assert latex(Limit(f(x), x, 0)) == r"\lim_{x \to 0^+} f{\left(x \right)}"
  1171. assert latex(Limit(f(x), x, 0, "-")) == \
  1172. r"\lim_{x \to 0^-} f{\left(x \right)}"
  1173. # issue #10806
  1174. assert latex(Limit(f(x), x, 0)**2) == \
  1175. r"\left(\lim_{x \to 0^+} f{\left(x \right)}\right)^{2}"
  1176. # bi-directional limit
  1177. assert latex(Limit(f(x), x, 0, dir='+-')) == \
  1178. r"\lim_{x \to 0} f{\left(x \right)}"
  1179. def test_latex_log():
  1180. assert latex(log(x)) == r"\log{\left(x \right)}"
  1181. assert latex(log(x), ln_notation=True) == r"\ln{\left(x \right)}"
  1182. assert latex(log(x) + log(y)) == \
  1183. r"\log{\left(x \right)} + \log{\left(y \right)}"
  1184. assert latex(log(x) + log(y), ln_notation=True) == \
  1185. r"\ln{\left(x \right)} + \ln{\left(y \right)}"
  1186. assert latex(pow(log(x), x)) == r"\log{\left(x \right)}^{x}"
  1187. assert latex(pow(log(x), x), ln_notation=True) == \
  1188. r"\ln{\left(x \right)}^{x}"
  1189. def test_issue_3568():
  1190. beta = Symbol(r'\beta')
  1191. y = beta + x
  1192. assert latex(y) in [r'\beta + x', r'x + \beta']
  1193. beta = Symbol(r'beta')
  1194. y = beta + x
  1195. assert latex(y) in [r'\beta + x', r'x + \beta']
  1196. def test_latex():
  1197. assert latex((2*tau)**Rational(7, 2)) == r"8 \sqrt{2} \tau^{\frac{7}{2}}"
  1198. assert latex((2*mu)**Rational(7, 2), mode='equation*') == \
  1199. r"\begin{equation*}8 \sqrt{2} \mu^{\frac{7}{2}}\end{equation*}"
  1200. assert latex((2*mu)**Rational(7, 2), mode='equation', itex=True) == \
  1201. r"$$8 \sqrt{2} \mu^{\frac{7}{2}}$$"
  1202. assert latex([2/x, y]) == r"\left[ \frac{2}{x}, \ y\right]"
  1203. def test_latex_dict():
  1204. d = {Rational(1): 1, x**2: 2, x: 3, x**3: 4}
  1205. assert latex(d) == \
  1206. r'\left\{ 1 : 1, \ x : 3, \ x^{2} : 2, \ x^{3} : 4\right\}'
  1207. D = Dict(d)
  1208. assert latex(D) == \
  1209. r'\left\{ 1 : 1, \ x : 3, \ x^{2} : 2, \ x^{3} : 4\right\}'
  1210. def test_latex_list():
  1211. ll = [Symbol('omega1'), Symbol('a'), Symbol('alpha')]
  1212. assert latex(ll) == r'\left[ \omega_{1}, \ a, \ \alpha\right]'
  1213. def test_latex_NumberSymbols():
  1214. assert latex(S.Catalan) == "G"
  1215. assert latex(S.EulerGamma) == r"\gamma"
  1216. assert latex(S.Exp1) == "e"
  1217. assert latex(S.GoldenRatio) == r"\phi"
  1218. assert latex(S.Pi) == r"\pi"
  1219. assert latex(S.TribonacciConstant) == r"\text{TribonacciConstant}"
  1220. def test_latex_rational():
  1221. # tests issue 3973
  1222. assert latex(-Rational(1, 2)) == r"- \frac{1}{2}"
  1223. assert latex(Rational(-1, 2)) == r"- \frac{1}{2}"
  1224. assert latex(Rational(1, -2)) == r"- \frac{1}{2}"
  1225. assert latex(-Rational(-1, 2)) == r"\frac{1}{2}"
  1226. assert latex(-Rational(1, 2)*x) == r"- \frac{x}{2}"
  1227. assert latex(-Rational(1, 2)*x + Rational(-2, 3)*y) == \
  1228. r"- \frac{x}{2} - \frac{2 y}{3}"
  1229. def test_latex_inverse():
  1230. # tests issue 4129
  1231. assert latex(1/x) == r"\frac{1}{x}"
  1232. assert latex(1/(x + y)) == r"\frac{1}{x + y}"
  1233. def test_latex_DiracDelta():
  1234. assert latex(DiracDelta(x)) == r"\delta\left(x\right)"
  1235. assert latex(DiracDelta(x)**2) == r"\left(\delta\left(x\right)\right)^{2}"
  1236. assert latex(DiracDelta(x, 0)) == r"\delta\left(x\right)"
  1237. assert latex(DiracDelta(x, 5)) == \
  1238. r"\delta^{\left( 5 \right)}\left( x \right)"
  1239. assert latex(DiracDelta(x, 5)**2) == \
  1240. r"\left(\delta^{\left( 5 \right)}\left( x \right)\right)^{2}"
  1241. def test_latex_Heaviside():
  1242. assert latex(Heaviside(x)) == r"\theta\left(x\right)"
  1243. assert latex(Heaviside(x)**2) == r"\left(\theta\left(x\right)\right)^{2}"
  1244. def test_latex_KroneckerDelta():
  1245. assert latex(KroneckerDelta(x, y)) == r"\delta_{x y}"
  1246. assert latex(KroneckerDelta(x, y + 1)) == r"\delta_{x, y + 1}"
  1247. # issue 6578
  1248. assert latex(KroneckerDelta(x + 1, y)) == r"\delta_{y, x + 1}"
  1249. assert latex(Pow(KroneckerDelta(x, y), 2, evaluate=False)) == \
  1250. r"\left(\delta_{x y}\right)^{2}"
  1251. def test_latex_LeviCivita():
  1252. assert latex(LeviCivita(x, y, z)) == r"\varepsilon_{x y z}"
  1253. assert latex(LeviCivita(x, y, z)**2) == \
  1254. r"\left(\varepsilon_{x y z}\right)^{2}"
  1255. assert latex(LeviCivita(x, y, z + 1)) == r"\varepsilon_{x, y, z + 1}"
  1256. assert latex(LeviCivita(x, y + 1, z)) == r"\varepsilon_{x, y + 1, z}"
  1257. assert latex(LeviCivita(x + 1, y, z)) == r"\varepsilon_{x + 1, y, z}"
  1258. def test_mode():
  1259. expr = x + y
  1260. assert latex(expr) == r'x + y'
  1261. assert latex(expr, mode='plain') == r'x + y'
  1262. assert latex(expr, mode='inline') == r'$x + y$'
  1263. assert latex(
  1264. expr, mode='equation*') == r'\begin{equation*}x + y\end{equation*}'
  1265. assert latex(
  1266. expr, mode='equation') == r'\begin{equation}x + y\end{equation}'
  1267. raises(ValueError, lambda: latex(expr, mode='foo'))
  1268. def test_latex_mathieu():
  1269. assert latex(mathieuc(x, y, z)) == r"C\left(x, y, z\right)"
  1270. assert latex(mathieus(x, y, z)) == r"S\left(x, y, z\right)"
  1271. assert latex(mathieuc(x, y, z)**2) == r"C\left(x, y, z\right)^{2}"
  1272. assert latex(mathieus(x, y, z)**2) == r"S\left(x, y, z\right)^{2}"
  1273. assert latex(mathieucprime(x, y, z)) == r"C^{\prime}\left(x, y, z\right)"
  1274. assert latex(mathieusprime(x, y, z)) == r"S^{\prime}\left(x, y, z\right)"
  1275. assert latex(mathieucprime(x, y, z)**2) == r"C^{\prime}\left(x, y, z\right)^{2}"
  1276. assert latex(mathieusprime(x, y, z)**2) == r"S^{\prime}\left(x, y, z\right)^{2}"
  1277. def test_latex_Piecewise():
  1278. p = Piecewise((x, x < 1), (x**2, True))
  1279. assert latex(p) == r"\begin{cases} x & \text{for}\: x < 1 \\x^{2} &" \
  1280. r" \text{otherwise} \end{cases}"
  1281. assert latex(p, itex=True) == \
  1282. r"\begin{cases} x & \text{for}\: x \lt 1 \\x^{2} &" \
  1283. r" \text{otherwise} \end{cases}"
  1284. p = Piecewise((x, x < 0), (0, x >= 0))
  1285. assert latex(p) == r'\begin{cases} x & \text{for}\: x < 0 \\0 &' \
  1286. r' \text{otherwise} \end{cases}'
  1287. A, B = symbols("A B", commutative=False)
  1288. p = Piecewise((A**2, Eq(A, B)), (A*B, True))
  1289. s = r"\begin{cases} A^{2} & \text{for}\: A = B \\A B & \text{otherwise} \end{cases}"
  1290. assert latex(p) == s
  1291. assert latex(A*p) == r"A \left(%s\right)" % s
  1292. assert latex(p*A) == r"\left(%s\right) A" % s
  1293. assert latex(Piecewise((x, x < 1), (x**2, x < 2))) == \
  1294. r'\begin{cases} x & ' \
  1295. r'\text{for}\: x < 1 \\x^{2} & \text{for}\: x < 2 \end{cases}'
  1296. def test_latex_Matrix():
  1297. M = Matrix([[1 + x, y], [y, x - 1]])
  1298. assert latex(M) == \
  1299. r'\left[\begin{matrix}x + 1 & y\\y & x - 1\end{matrix}\right]'
  1300. assert latex(M, mode='inline') == \
  1301. r'$\left[\begin{smallmatrix}x + 1 & y\\' \
  1302. r'y & x - 1\end{smallmatrix}\right]$'
  1303. assert latex(M, mat_str='array') == \
  1304. r'\left[\begin{array}{cc}x + 1 & y\\y & x - 1\end{array}\right]'
  1305. assert latex(M, mat_str='bmatrix') == \
  1306. r'\left[\begin{bmatrix}x + 1 & y\\y & x - 1\end{bmatrix}\right]'
  1307. assert latex(M, mat_delim=None, mat_str='bmatrix') == \
  1308. r'\begin{bmatrix}x + 1 & y\\y & x - 1\end{bmatrix}'
  1309. M2 = Matrix(1, 11, range(11))
  1310. assert latex(M2) == \
  1311. r'\left[\begin{array}{ccccccccccc}' \
  1312. r'0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\end{array}\right]'
  1313. def test_latex_matrix_with_functions():
  1314. t = symbols('t')
  1315. theta1 = symbols('theta1', cls=Function)
  1316. M = Matrix([[sin(theta1(t)), cos(theta1(t))],
  1317. [cos(theta1(t).diff(t)), sin(theta1(t).diff(t))]])
  1318. expected = (r'\left[\begin{matrix}\sin{\left('
  1319. r'\theta_{1}{\left(t \right)} \right)} & '
  1320. r'\cos{\left(\theta_{1}{\left(t \right)} \right)'
  1321. r'}\\\cos{\left(\frac{d}{d t} \theta_{1}{\left(t '
  1322. r'\right)} \right)} & \sin{\left(\frac{d}{d t} '
  1323. r'\theta_{1}{\left(t \right)} \right'
  1324. r')}\end{matrix}\right]')
  1325. assert latex(M) == expected
  1326. def test_latex_NDimArray():
  1327. x, y, z, w = symbols("x y z w")
  1328. for ArrayType in (ImmutableDenseNDimArray, ImmutableSparseNDimArray,
  1329. MutableDenseNDimArray, MutableSparseNDimArray):
  1330. # Basic: scalar array
  1331. M = ArrayType(x)
  1332. assert latex(M) == r"x"
  1333. M = ArrayType([[1 / x, y], [z, w]])
  1334. M1 = ArrayType([1 / x, y, z])
  1335. M2 = tensorproduct(M1, M)
  1336. M3 = tensorproduct(M, M)
  1337. assert latex(M) == \
  1338. r'\left[\begin{matrix}\frac{1}{x} & y\\z & w\end{matrix}\right]'
  1339. assert latex(M1) == \
  1340. r"\left[\begin{matrix}\frac{1}{x} & y & z\end{matrix}\right]"
  1341. assert latex(M2) == \
  1342. r"\left[\begin{matrix}" \
  1343. r"\left[\begin{matrix}\frac{1}{x^{2}} & \frac{y}{x}\\\frac{z}{x} & \frac{w}{x}\end{matrix}\right] & " \
  1344. r"\left[\begin{matrix}\frac{y}{x} & y^{2}\\y z & w y\end{matrix}\right] & " \
  1345. r"\left[\begin{matrix}\frac{z}{x} & y z\\z^{2} & w z\end{matrix}\right]" \
  1346. r"\end{matrix}\right]"
  1347. assert latex(M3) == \
  1348. r"""\left[\begin{matrix}"""\
  1349. r"""\left[\begin{matrix}\frac{1}{x^{2}} & \frac{y}{x}\\\frac{z}{x} & \frac{w}{x}\end{matrix}\right] & """\
  1350. r"""\left[\begin{matrix}\frac{y}{x} & y^{2}\\y z & w y\end{matrix}\right]\\"""\
  1351. r"""\left[\begin{matrix}\frac{z}{x} & y z\\z^{2} & w z\end{matrix}\right] & """\
  1352. r"""\left[\begin{matrix}\frac{w}{x} & w y\\w z & w^{2}\end{matrix}\right]"""\
  1353. r"""\end{matrix}\right]"""
  1354. Mrow = ArrayType([[x, y, 1/z]])
  1355. Mcolumn = ArrayType([[x], [y], [1/z]])
  1356. Mcol2 = ArrayType([Mcolumn.tolist()])
  1357. assert latex(Mrow) == \
  1358. r"\left[\left[\begin{matrix}x & y & \frac{1}{z}\end{matrix}\right]\right]"
  1359. assert latex(Mcolumn) == \
  1360. r"\left[\begin{matrix}x\\y\\\frac{1}{z}\end{matrix}\right]"
  1361. assert latex(Mcol2) == \
  1362. r'\left[\begin{matrix}\left[\begin{matrix}x\\y\\\frac{1}{z}\end{matrix}\right]\end{matrix}\right]'
  1363. def test_latex_mul_symbol():
  1364. assert latex(4*4**x, mul_symbol='times') == r"4 \times 4^{x}"
  1365. assert latex(4*4**x, mul_symbol='dot') == r"4 \cdot 4^{x}"
  1366. assert latex(4*4**x, mul_symbol='ldot') == r"4 \,.\, 4^{x}"
  1367. assert latex(4*x, mul_symbol='times') == r"4 \times x"
  1368. assert latex(4*x, mul_symbol='dot') == r"4 \cdot x"
  1369. assert latex(4*x, mul_symbol='ldot') == r"4 \,.\, x"
  1370. def test_latex_issue_4381():
  1371. y = 4*4**log(2)
  1372. assert latex(y) == r'4 \cdot 4^{\log{\left(2 \right)}}'
  1373. assert latex(1/y) == r'\frac{1}{4 \cdot 4^{\log{\left(2 \right)}}}'
  1374. def test_latex_issue_4576():
  1375. assert latex(Symbol("beta_13_2")) == r"\beta_{13 2}"
  1376. assert latex(Symbol("beta_132_20")) == r"\beta_{132 20}"
  1377. assert latex(Symbol("beta_13")) == r"\beta_{13}"
  1378. assert latex(Symbol("x_a_b")) == r"x_{a b}"
  1379. assert latex(Symbol("x_1_2_3")) == r"x_{1 2 3}"
  1380. assert latex(Symbol("x_a_b1")) == r"x_{a b1}"
  1381. assert latex(Symbol("x_a_1")) == r"x_{a 1}"
  1382. assert latex(Symbol("x_1_a")) == r"x_{1 a}"
  1383. assert latex(Symbol("x_1^aa")) == r"x^{aa}_{1}"
  1384. assert latex(Symbol("x_1__aa")) == r"x^{aa}_{1}"
  1385. assert latex(Symbol("x_11^a")) == r"x^{a}_{11}"
  1386. assert latex(Symbol("x_11__a")) == r"x^{a}_{11}"
  1387. assert latex(Symbol("x_a_a_a_a")) == r"x_{a a a a}"
  1388. assert latex(Symbol("x_a_a^a^a")) == r"x^{a a}_{a a}"
  1389. assert latex(Symbol("x_a_a__a__a")) == r"x^{a a}_{a a}"
  1390. assert latex(Symbol("alpha_11")) == r"\alpha_{11}"
  1391. assert latex(Symbol("alpha_11_11")) == r"\alpha_{11 11}"
  1392. assert latex(Symbol("alpha_alpha")) == r"\alpha_{\alpha}"
  1393. assert latex(Symbol("alpha^aleph")) == r"\alpha^{\aleph}"
  1394. assert latex(Symbol("alpha__aleph")) == r"\alpha^{\aleph}"
  1395. def test_latex_pow_fraction():
  1396. x = Symbol('x')
  1397. # Testing exp
  1398. assert r'e^{-x}' in latex(exp(-x)/2).replace(' ', '') # Remove Whitespace
  1399. # Testing e^{-x} in case future changes alter behavior of muls or fracs
  1400. # In particular current output is \frac{1}{2}e^{- x} but perhaps this will
  1401. # change to \frac{e^{-x}}{2}
  1402. # Testing general, non-exp, power
  1403. assert r'3^{-x}' in latex(3**-x/2).replace(' ', '')
  1404. def test_noncommutative():
  1405. A, B, C = symbols('A,B,C', commutative=False)
  1406. assert latex(A*B*C**-1) == r"A B C^{-1}"
  1407. assert latex(C**-1*A*B) == r"C^{-1} A B"
  1408. assert latex(A*C**-1*B) == r"A C^{-1} B"
  1409. def test_latex_order():
  1410. expr = x**3 + x**2*y + y**4 + 3*x*y**3
  1411. assert latex(expr, order='lex') == r"x^{3} + x^{2} y + 3 x y^{3} + y^{4}"
  1412. assert latex(
  1413. expr, order='rev-lex') == r"y^{4} + 3 x y^{3} + x^{2} y + x^{3}"
  1414. assert latex(expr, order='none') == r"x^{3} + y^{4} + y x^{2} + 3 x y^{3}"
  1415. def test_latex_Lambda():
  1416. assert latex(Lambda(x, x + 1)) == r"\left( x \mapsto x + 1 \right)"
  1417. assert latex(Lambda((x, y), x + 1)) == r"\left( \left( x, \ y\right) \mapsto x + 1 \right)"
  1418. assert latex(Lambda(x, x)) == r"\left( x \mapsto x \right)"
  1419. def test_latex_PolyElement():
  1420. Ruv, u, v = ring("u,v", ZZ)
  1421. Rxyz, x, y, z = ring("x,y,z", Ruv)
  1422. assert latex(x - x) == r"0"
  1423. assert latex(x - 1) == r"x - 1"
  1424. assert latex(x + 1) == r"x + 1"
  1425. assert latex((u**2 + 3*u*v + 1)*x**2*y + u + 1) == \
  1426. r"\left({u}^{2} + 3 u v + 1\right) {x}^{2} y + u + 1"
  1427. assert latex((u**2 + 3*u*v + 1)*x**2*y + (u + 1)*x) == \
  1428. r"\left({u}^{2} + 3 u v + 1\right) {x}^{2} y + \left(u + 1\right) x"
  1429. assert latex((u**2 + 3*u*v + 1)*x**2*y + (u + 1)*x + 1) == \
  1430. r"\left({u}^{2} + 3 u v + 1\right) {x}^{2} y + \left(u + 1\right) x + 1"
  1431. assert latex((-u**2 + 3*u*v - 1)*x**2*y - (u + 1)*x - 1) == \
  1432. r"-\left({u}^{2} - 3 u v + 1\right) {x}^{2} y - \left(u + 1\right) x - 1"
  1433. assert latex(-(v**2 + v + 1)*x + 3*u*v + 1) == \
  1434. r"-\left({v}^{2} + v + 1\right) x + 3 u v + 1"
  1435. assert latex(-(v**2 + v + 1)*x - 3*u*v + 1) == \
  1436. r"-\left({v}^{2} + v + 1\right) x - 3 u v + 1"
  1437. def test_latex_FracElement():
  1438. Fuv, u, v = field("u,v", ZZ)
  1439. Fxyzt, x, y, z, t = field("x,y,z,t", Fuv)
  1440. assert latex(x - x) == r"0"
  1441. assert latex(x - 1) == r"x - 1"
  1442. assert latex(x + 1) == r"x + 1"
  1443. assert latex(x/3) == r"\frac{x}{3}"
  1444. assert latex(x/z) == r"\frac{x}{z}"
  1445. assert latex(x*y/z) == r"\frac{x y}{z}"
  1446. assert latex(x/(z*t)) == r"\frac{x}{z t}"
  1447. assert latex(x*y/(z*t)) == r"\frac{x y}{z t}"
  1448. assert latex((x - 1)/y) == r"\frac{x - 1}{y}"
  1449. assert latex((x + 1)/y) == r"\frac{x + 1}{y}"
  1450. assert latex((-x - 1)/y) == r"\frac{-x - 1}{y}"
  1451. assert latex((x + 1)/(y*z)) == r"\frac{x + 1}{y z}"
  1452. assert latex(-y/(x + 1)) == r"\frac{-y}{x + 1}"
  1453. assert latex(y*z/(x + 1)) == r"\frac{y z}{x + 1}"
  1454. assert latex(((u + 1)*x*y + 1)/((v - 1)*z - 1)) == \
  1455. r"\frac{\left(u + 1\right) x y + 1}{\left(v - 1\right) z - 1}"
  1456. assert latex(((u + 1)*x*y + 1)/((v - 1)*z - t*u*v - 1)) == \
  1457. r"\frac{\left(u + 1\right) x y + 1}{\left(v - 1\right) z - u v t - 1}"
  1458. def test_latex_Poly():
  1459. assert latex(Poly(x**2 + 2 * x, x)) == \
  1460. r"\operatorname{Poly}{\left( x^{2} + 2 x, x, domain=\mathbb{Z} \right)}"
  1461. assert latex(Poly(x/y, x)) == \
  1462. r"\operatorname{Poly}{\left( \frac{1}{y} x, x, domain=\mathbb{Z}\left(y\right) \right)}"
  1463. assert latex(Poly(2.0*x + y)) == \
  1464. r"\operatorname{Poly}{\left( 2.0 x + 1.0 y, x, y, domain=\mathbb{R} \right)}"
  1465. def test_latex_Poly_order():
  1466. assert latex(Poly([a, 1, b, 2, c, 3], x)) == \
  1467. r'\operatorname{Poly}{\left( a x^{5} + x^{4} + b x^{3} + 2 x^{2} + c'\
  1468. r' x + 3, x, domain=\mathbb{Z}\left[a, b, c\right] \right)}'
  1469. assert latex(Poly([a, 1, b+c, 2, 3], x)) == \
  1470. r'\operatorname{Poly}{\left( a x^{4} + x^{3} + \left(b + c\right) '\
  1471. r'x^{2} + 2 x + 3, x, domain=\mathbb{Z}\left[a, b, c\right] \right)}'
  1472. assert latex(Poly(a*x**3 + x**2*y - x*y - c*y**3 - b*x*y**2 + y - a*x + b,
  1473. (x, y))) == \
  1474. r'\operatorname{Poly}{\left( a x^{3} + x^{2}y - b xy^{2} - xy - '\
  1475. r'a x - c y^{3} + y + b, x, y, domain=\mathbb{Z}\left[a, b, c\right] \right)}'
  1476. def test_latex_ComplexRootOf():
  1477. assert latex(rootof(x**5 + x + 3, 0)) == \
  1478. r"\operatorname{CRootOf} {\left(x^{5} + x + 3, 0\right)}"
  1479. def test_latex_RootSum():
  1480. assert latex(RootSum(x**5 + x + 3, sin)) == \
  1481. r"\operatorname{RootSum} {\left(x^{5} + x + 3, \left( x \mapsto \sin{\left(x \right)} \right)\right)}"
  1482. def test_settings():
  1483. raises(TypeError, lambda: latex(x*y, method="garbage"))
  1484. def test_latex_numbers():
  1485. assert latex(catalan(n)) == r"C_{n}"
  1486. assert latex(catalan(n)**2) == r"C_{n}^{2}"
  1487. assert latex(bernoulli(n)) == r"B_{n}"
  1488. assert latex(bernoulli(n, x)) == r"B_{n}\left(x\right)"
  1489. assert latex(bernoulli(n)**2) == r"B_{n}^{2}"
  1490. assert latex(bernoulli(n, x)**2) == r"B_{n}^{2}\left(x\right)"
  1491. assert latex(genocchi(n)) == r"G_{n}"
  1492. assert latex(genocchi(n, x)) == r"G_{n}\left(x\right)"
  1493. assert latex(genocchi(n)**2) == r"G_{n}^{2}"
  1494. assert latex(genocchi(n, x)**2) == r"G_{n}^{2}\left(x\right)"
  1495. assert latex(bell(n)) == r"B_{n}"
  1496. assert latex(bell(n, x)) == r"B_{n}\left(x\right)"
  1497. assert latex(bell(n, m, (x, y))) == r"B_{n, m}\left(x, y\right)"
  1498. assert latex(bell(n)**2) == r"B_{n}^{2}"
  1499. assert latex(bell(n, x)**2) == r"B_{n}^{2}\left(x\right)"
  1500. assert latex(bell(n, m, (x, y))**2) == r"B_{n, m}^{2}\left(x, y\right)"
  1501. assert latex(fibonacci(n)) == r"F_{n}"
  1502. assert latex(fibonacci(n, x)) == r"F_{n}\left(x\right)"
  1503. assert latex(fibonacci(n)**2) == r"F_{n}^{2}"
  1504. assert latex(fibonacci(n, x)**2) == r"F_{n}^{2}\left(x\right)"
  1505. assert latex(lucas(n)) == r"L_{n}"
  1506. assert latex(lucas(n)**2) == r"L_{n}^{2}"
  1507. assert latex(tribonacci(n)) == r"T_{n}"
  1508. assert latex(tribonacci(n, x)) == r"T_{n}\left(x\right)"
  1509. assert latex(tribonacci(n)**2) == r"T_{n}^{2}"
  1510. assert latex(tribonacci(n, x)**2) == r"T_{n}^{2}\left(x\right)"
  1511. assert latex(mobius(n)) == r"\mu\left(n\right)"
  1512. assert latex(mobius(n)**2) == r"\mu^{2}\left(n\right)"
  1513. def test_latex_euler():
  1514. assert latex(euler(n)) == r"E_{n}"
  1515. assert latex(euler(n, x)) == r"E_{n}\left(x\right)"
  1516. assert latex(euler(n, x)**2) == r"E_{n}^{2}\left(x\right)"
  1517. def test_lamda():
  1518. assert latex(Symbol('lamda')) == r"\lambda"
  1519. assert latex(Symbol('Lamda')) == r"\Lambda"
  1520. def test_custom_symbol_names():
  1521. x = Symbol('x')
  1522. y = Symbol('y')
  1523. assert latex(x) == r"x"
  1524. assert latex(x, symbol_names={x: "x_i"}) == r"x_i"
  1525. assert latex(x + y, symbol_names={x: "x_i"}) == r"x_i + y"
  1526. assert latex(x**2, symbol_names={x: "x_i"}) == r"x_i^{2}"
  1527. assert latex(x + y, symbol_names={x: "x_i", y: "y_j"}) == r"x_i + y_j"
  1528. def test_matAdd():
  1529. C = MatrixSymbol('C', 5, 5)
  1530. B = MatrixSymbol('B', 5, 5)
  1531. n = symbols("n")
  1532. h = MatrixSymbol("h", 1, 1)
  1533. assert latex(C - 2*B) in [r'- 2 B + C', r'C -2 B']
  1534. assert latex(C + 2*B) in [r'2 B + C', r'C + 2 B']
  1535. assert latex(B - 2*C) in [r'B - 2 C', r'- 2 C + B']
  1536. assert latex(B + 2*C) in [r'B + 2 C', r'2 C + B']
  1537. assert latex(n * h - (-h + h.T) * (h + h.T)) == 'n h - \\left(- h + h^{T}\\right) \\left(h + h^{T}\\right)'
  1538. assert latex(MatAdd(MatAdd(h, h), MatAdd(h, h))) == '\\left(h + h\\right) + \\left(h + h\\right)'
  1539. assert latex(MatMul(MatMul(h, h), MatMul(h, h))) == '\\left(h h\\right) \\left(h h\\right)'
  1540. def test_matMul():
  1541. A = MatrixSymbol('A', 5, 5)
  1542. B = MatrixSymbol('B', 5, 5)
  1543. x = Symbol('x')
  1544. assert latex(2*A) == r'2 A'
  1545. assert latex(2*x*A) == r'2 x A'
  1546. assert latex(-2*A) == r'- 2 A'
  1547. assert latex(1.5*A) == r'1.5 A'
  1548. assert latex(sqrt(2)*A) == r'\sqrt{2} A'
  1549. assert latex(-sqrt(2)*A) == r'- \sqrt{2} A'
  1550. assert latex(2*sqrt(2)*x*A) == r'2 \sqrt{2} x A'
  1551. assert latex(-2*A*(A + 2*B)) in [r'- 2 A \left(A + 2 B\right)',
  1552. r'- 2 A \left(2 B + A\right)']
  1553. def test_latex_MatrixSlice():
  1554. n = Symbol('n', integer=True)
  1555. x, y, z, w, t, = symbols('x y z w t')
  1556. X = MatrixSymbol('X', n, n)
  1557. Y = MatrixSymbol('Y', 10, 10)
  1558. Z = MatrixSymbol('Z', 10, 10)
  1559. assert latex(MatrixSlice(X, (None, None, None), (None, None, None))) == r'X\left[:, :\right]'
  1560. assert latex(X[x:x + 1, y:y + 1]) == r'X\left[x:x + 1, y:y + 1\right]'
  1561. assert latex(X[x:x + 1:2, y:y + 1:2]) == r'X\left[x:x + 1:2, y:y + 1:2\right]'
  1562. assert latex(X[:x, y:]) == r'X\left[:x, y:\right]'
  1563. assert latex(X[:x, y:]) == r'X\left[:x, y:\right]'
  1564. assert latex(X[x:, :y]) == r'X\left[x:, :y\right]'
  1565. assert latex(X[x:y, z:w]) == r'X\left[x:y, z:w\right]'
  1566. assert latex(X[x:y:t, w:t:x]) == r'X\left[x:y:t, w:t:x\right]'
  1567. assert latex(X[x::y, t::w]) == r'X\left[x::y, t::w\right]'
  1568. assert latex(X[:x:y, :t:w]) == r'X\left[:x:y, :t:w\right]'
  1569. assert latex(X[::x, ::y]) == r'X\left[::x, ::y\right]'
  1570. assert latex(MatrixSlice(X, (0, None, None), (0, None, None))) == r'X\left[:, :\right]'
  1571. assert latex(MatrixSlice(X, (None, n, None), (None, n, None))) == r'X\left[:, :\right]'
  1572. assert latex(MatrixSlice(X, (0, n, None), (0, n, None))) == r'X\left[:, :\right]'
  1573. assert latex(MatrixSlice(X, (0, n, 2), (0, n, 2))) == r'X\left[::2, ::2\right]'
  1574. assert latex(X[1:2:3, 4:5:6]) == r'X\left[1:2:3, 4:5:6\right]'
  1575. assert latex(X[1:3:5, 4:6:8]) == r'X\left[1:3:5, 4:6:8\right]'
  1576. assert latex(X[1:10:2]) == r'X\left[1:10:2, :\right]'
  1577. assert latex(Y[:5, 1:9:2]) == r'Y\left[:5, 1:9:2\right]'
  1578. assert latex(Y[:5, 1:10:2]) == r'Y\left[:5, 1::2\right]'
  1579. assert latex(Y[5, :5:2]) == r'Y\left[5:6, :5:2\right]'
  1580. assert latex(X[0:1, 0:1]) == r'X\left[:1, :1\right]'
  1581. assert latex(X[0:1:2, 0:1:2]) == r'X\left[:1:2, :1:2\right]'
  1582. assert latex((Y + Z)[2:, 2:]) == r'\left(Y + Z\right)\left[2:, 2:\right]'
  1583. def test_latex_RandomDomain():
  1584. from sympy.stats import Normal, Die, Exponential, pspace, where
  1585. from sympy.stats.rv import RandomDomain
  1586. X = Normal('x1', 0, 1)
  1587. assert latex(where(X > 0)) == r"\text{Domain: }0 < x_{1} \wedge x_{1} < \infty"
  1588. D = Die('d1', 6)
  1589. assert latex(where(D > 4)) == r"\text{Domain: }d_{1} = 5 \vee d_{1} = 6"
  1590. A = Exponential('a', 1)
  1591. B = Exponential('b', 1)
  1592. assert latex(
  1593. pspace(Tuple(A, B)).domain) == \
  1594. r"\text{Domain: }0 \leq a \wedge 0 \leq b \wedge a < \infty \wedge b < \infty"
  1595. assert latex(RandomDomain(FiniteSet(x), FiniteSet(1, 2))) == \
  1596. r'\text{Domain: }\left\{x\right\} \in \left\{1, 2\right\}'
  1597. def test_PrettyPoly():
  1598. from sympy.polys.domains import QQ
  1599. F = QQ.frac_field(x, y)
  1600. R = QQ[x, y]
  1601. assert latex(F.convert(x/(x + y))) == latex(x/(x + y))
  1602. assert latex(R.convert(x + y)) == latex(x + y)
  1603. def test_integral_transforms():
  1604. x = Symbol("x")
  1605. k = Symbol("k")
  1606. f = Function("f")
  1607. a = Symbol("a")
  1608. b = Symbol("b")
  1609. assert latex(MellinTransform(f(x), x, k)) == \
  1610. r"\mathcal{M}_{x}\left[f{\left(x \right)}\right]\left(k\right)"
  1611. assert latex(InverseMellinTransform(f(k), k, x, a, b)) == \
  1612. r"\mathcal{M}^{-1}_{k}\left[f{\left(k \right)}\right]\left(x\right)"
  1613. assert latex(LaplaceTransform(f(x), x, k)) == \
  1614. r"\mathcal{L}_{x}\left[f{\left(x \right)}\right]\left(k\right)"
  1615. assert latex(InverseLaplaceTransform(f(k), k, x, (a, b))) == \
  1616. r"\mathcal{L}^{-1}_{k}\left[f{\left(k \right)}\right]\left(x\right)"
  1617. assert latex(FourierTransform(f(x), x, k)) == \
  1618. r"\mathcal{F}_{x}\left[f{\left(x \right)}\right]\left(k\right)"
  1619. assert latex(InverseFourierTransform(f(k), k, x)) == \
  1620. r"\mathcal{F}^{-1}_{k}\left[f{\left(k \right)}\right]\left(x\right)"
  1621. assert latex(CosineTransform(f(x), x, k)) == \
  1622. r"\mathcal{COS}_{x}\left[f{\left(x \right)}\right]\left(k\right)"
  1623. assert latex(InverseCosineTransform(f(k), k, x)) == \
  1624. r"\mathcal{COS}^{-1}_{k}\left[f{\left(k \right)}\right]\left(x\right)"
  1625. assert latex(SineTransform(f(x), x, k)) == \
  1626. r"\mathcal{SIN}_{x}\left[f{\left(x \right)}\right]\left(k\right)"
  1627. assert latex(InverseSineTransform(f(k), k, x)) == \
  1628. r"\mathcal{SIN}^{-1}_{k}\left[f{\left(k \right)}\right]\left(x\right)"
  1629. def test_PolynomialRingBase():
  1630. from sympy.polys.domains import QQ
  1631. assert latex(QQ.old_poly_ring(x, y)) == r"\mathbb{Q}\left[x, y\right]"
  1632. assert latex(QQ.old_poly_ring(x, y, order="ilex")) == \
  1633. r"S_<^{-1}\mathbb{Q}\left[x, y\right]"
  1634. def test_categories():
  1635. from sympy.categories import (Object, IdentityMorphism,
  1636. NamedMorphism, Category, Diagram,
  1637. DiagramGrid)
  1638. A1 = Object("A1")
  1639. A2 = Object("A2")
  1640. A3 = Object("A3")
  1641. f1 = NamedMorphism(A1, A2, "f1")
  1642. f2 = NamedMorphism(A2, A3, "f2")
  1643. id_A1 = IdentityMorphism(A1)
  1644. K1 = Category("K1")
  1645. assert latex(A1) == r"A_{1}"
  1646. assert latex(f1) == r"f_{1}:A_{1}\rightarrow A_{2}"
  1647. assert latex(id_A1) == r"id:A_{1}\rightarrow A_{1}"
  1648. assert latex(f2*f1) == r"f_{2}\circ f_{1}:A_{1}\rightarrow A_{3}"
  1649. assert latex(K1) == r"\mathbf{K_{1}}"
  1650. d = Diagram()
  1651. assert latex(d) == r"\emptyset"
  1652. d = Diagram({f1: "unique", f2: S.EmptySet})
  1653. assert latex(d) == r"\left\{ f_{2}\circ f_{1}:A_{1}" \
  1654. r"\rightarrow A_{3} : \emptyset, \ id:A_{1}\rightarrow " \
  1655. r"A_{1} : \emptyset, \ id:A_{2}\rightarrow A_{2} : " \
  1656. r"\emptyset, \ id:A_{3}\rightarrow A_{3} : \emptyset, " \
  1657. r"\ f_{1}:A_{1}\rightarrow A_{2} : \left\{unique\right\}, " \
  1658. r"\ f_{2}:A_{2}\rightarrow A_{3} : \emptyset\right\}"
  1659. d = Diagram({f1: "unique", f2: S.EmptySet}, {f2 * f1: "unique"})
  1660. assert latex(d) == r"\left\{ f_{2}\circ f_{1}:A_{1}" \
  1661. r"\rightarrow A_{3} : \emptyset, \ id:A_{1}\rightarrow " \
  1662. r"A_{1} : \emptyset, \ id:A_{2}\rightarrow A_{2} : " \
  1663. r"\emptyset, \ id:A_{3}\rightarrow A_{3} : \emptyset, " \
  1664. r"\ f_{1}:A_{1}\rightarrow A_{2} : \left\{unique\right\}," \
  1665. r" \ f_{2}:A_{2}\rightarrow A_{3} : \emptyset\right\}" \
  1666. r"\Longrightarrow \left\{ f_{2}\circ f_{1}:A_{1}" \
  1667. r"\rightarrow A_{3} : \left\{unique\right\}\right\}"
  1668. # A linear diagram.
  1669. A = Object("A")
  1670. B = Object("B")
  1671. C = Object("C")
  1672. f = NamedMorphism(A, B, "f")
  1673. g = NamedMorphism(B, C, "g")
  1674. d = Diagram([f, g])
  1675. grid = DiagramGrid(d)
  1676. assert latex(grid) == r"\begin{array}{cc}" + "\n" \
  1677. r"A & B \\" + "\n" \
  1678. r" & C " + "\n" \
  1679. r"\end{array}" + "\n"
  1680. def test_Modules():
  1681. from sympy.polys.domains import QQ
  1682. from sympy.polys.agca import homomorphism
  1683. R = QQ.old_poly_ring(x, y)
  1684. F = R.free_module(2)
  1685. M = F.submodule([x, y], [1, x**2])
  1686. assert latex(F) == r"{\mathbb{Q}\left[x, y\right]}^{2}"
  1687. assert latex(M) == \
  1688. r"\left\langle {\left[ {x},{y} \right]},{\left[ {1},{x^{2}} \right]} \right\rangle"
  1689. I = R.ideal(x**2, y)
  1690. assert latex(I) == r"\left\langle {x^{2}},{y} \right\rangle"
  1691. Q = F / M
  1692. assert latex(Q) == \
  1693. r"\frac{{\mathbb{Q}\left[x, y\right]}^{2}}{\left\langle {\left[ {x},"\
  1694. r"{y} \right]},{\left[ {1},{x^{2}} \right]} \right\rangle}"
  1695. assert latex(Q.submodule([1, x**3/2], [2, y])) == \
  1696. r"\left\langle {{\left[ {1},{\frac{x^{3}}{2}} \right]} + {\left"\
  1697. r"\langle {\left[ {x},{y} \right]},{\left[ {1},{x^{2}} \right]} "\
  1698. r"\right\rangle}},{{\left[ {2},{y} \right]} + {\left\langle {\left[ "\
  1699. r"{x},{y} \right]},{\left[ {1},{x^{2}} \right]} \right\rangle}} \right\rangle"
  1700. h = homomorphism(QQ.old_poly_ring(x).free_module(2),
  1701. QQ.old_poly_ring(x).free_module(2), [0, 0])
  1702. assert latex(h) == \
  1703. r"{\left[\begin{matrix}0 & 0\\0 & 0\end{matrix}\right]} : "\
  1704. r"{{\mathbb{Q}\left[x\right]}^{2}} \to {{\mathbb{Q}\left[x\right]}^{2}}"
  1705. def test_QuotientRing():
  1706. from sympy.polys.domains import QQ
  1707. R = QQ.old_poly_ring(x)/[x**2 + 1]
  1708. assert latex(R) == \
  1709. r"\frac{\mathbb{Q}\left[x\right]}{\left\langle {x^{2} + 1} \right\rangle}"
  1710. assert latex(R.one) == r"{1} + {\left\langle {x^{2} + 1} \right\rangle}"
  1711. def test_Tr():
  1712. #TODO: Handle indices
  1713. A, B = symbols('A B', commutative=False)
  1714. t = Tr(A*B)
  1715. assert latex(t) == r'\operatorname{tr}\left(A B\right)'
  1716. def test_Determinant():
  1717. from sympy.matrices import Determinant, Inverse, BlockMatrix, OneMatrix, ZeroMatrix
  1718. m = Matrix(((1, 2), (3, 4)))
  1719. assert latex(Determinant(m)) == '\\left|{\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}}\\right|'
  1720. assert latex(Determinant(Inverse(m))) == \
  1721. '\\left|{\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right]^{-1}}\\right|'
  1722. X = MatrixSymbol('X', 2, 2)
  1723. assert latex(Determinant(X)) == '\\left|{X}\\right|'
  1724. assert latex(Determinant(X + m)) == \
  1725. '\\left|{\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] + X}\\right|'
  1726. assert latex(Determinant(BlockMatrix(((OneMatrix(2, 2), X),
  1727. (m, ZeroMatrix(2, 2)))))) == \
  1728. '\\left|{\\begin{matrix}1 & X\\\\\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] & 0\\end{matrix}}\\right|'
  1729. def test_Adjoint():
  1730. from sympy.matrices import Adjoint, Inverse, Transpose
  1731. X = MatrixSymbol('X', 2, 2)
  1732. Y = MatrixSymbol('Y', 2, 2)
  1733. assert latex(Adjoint(X)) == r'X^{\dagger}'
  1734. assert latex(Adjoint(X + Y)) == r'\left(X + Y\right)^{\dagger}'
  1735. assert latex(Adjoint(X) + Adjoint(Y)) == r'X^{\dagger} + Y^{\dagger}'
  1736. assert latex(Adjoint(X*Y)) == r'\left(X Y\right)^{\dagger}'
  1737. assert latex(Adjoint(Y)*Adjoint(X)) == r'Y^{\dagger} X^{\dagger}'
  1738. assert latex(Adjoint(X**2)) == r'\left(X^{2}\right)^{\dagger}'
  1739. assert latex(Adjoint(X)**2) == r'\left(X^{\dagger}\right)^{2}'
  1740. assert latex(Adjoint(Inverse(X))) == r'\left(X^{-1}\right)^{\dagger}'
  1741. assert latex(Inverse(Adjoint(X))) == r'\left(X^{\dagger}\right)^{-1}'
  1742. assert latex(Adjoint(Transpose(X))) == r'\left(X^{T}\right)^{\dagger}'
  1743. assert latex(Transpose(Adjoint(X))) == r'\left(X^{\dagger}\right)^{T}'
  1744. assert latex(Transpose(Adjoint(X) + Y)) == r'\left(X^{\dagger} + Y\right)^{T}'
  1745. m = Matrix(((1, 2), (3, 4)))
  1746. assert latex(Adjoint(m)) == '\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right]^{\\dagger}'
  1747. assert latex(Adjoint(m+X)) == \
  1748. '\\left(\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] + X\\right)^{\\dagger}'
  1749. from sympy.matrices import BlockMatrix, OneMatrix, ZeroMatrix
  1750. assert latex(Adjoint(BlockMatrix(((OneMatrix(2, 2), X),
  1751. (m, ZeroMatrix(2, 2)))))) == \
  1752. '\\left[\\begin{matrix}1 & X\\\\\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] & 0\\end{matrix}\\right]^{\\dagger}'
  1753. # Issue 20959
  1754. Mx = MatrixSymbol('M^x', 2, 2)
  1755. assert latex(Adjoint(Mx)) == r'\left(M^{x}\right)^{\dagger}'
  1756. # adjoint style
  1757. assert latex(Adjoint(X), adjoint_style="star") == r'X^{\ast}'
  1758. assert latex(Adjoint(X + Y), adjoint_style="hermitian") == r'\left(X + Y\right)^{\mathsf{H}}'
  1759. assert latex(Adjoint(X) + Adjoint(Y), adjoint_style="dagger") == r'X^{\dagger} + Y^{\dagger}'
  1760. assert latex(Adjoint(Y)*Adjoint(X)) == r'Y^{\dagger} X^{\dagger}'
  1761. assert latex(Adjoint(X**2), adjoint_style="star") == r'\left(X^{2}\right)^{\ast}'
  1762. assert latex(Adjoint(X)**2, adjoint_style="hermitian") == r'\left(X^{\mathsf{H}}\right)^{2}'
  1763. def test_Transpose():
  1764. from sympy.matrices import Transpose, MatPow, HadamardPower
  1765. X = MatrixSymbol('X', 2, 2)
  1766. Y = MatrixSymbol('Y', 2, 2)
  1767. assert latex(Transpose(X)) == r'X^{T}'
  1768. assert latex(Transpose(X + Y)) == r'\left(X + Y\right)^{T}'
  1769. assert latex(Transpose(HadamardPower(X, 2))) == r'\left(X^{\circ {2}}\right)^{T}'
  1770. assert latex(HadamardPower(Transpose(X), 2)) == r'\left(X^{T}\right)^{\circ {2}}'
  1771. assert latex(Transpose(MatPow(X, 2))) == r'\left(X^{2}\right)^{T}'
  1772. assert latex(MatPow(Transpose(X), 2)) == r'\left(X^{T}\right)^{2}'
  1773. m = Matrix(((1, 2), (3, 4)))
  1774. assert latex(Transpose(m)) == '\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right]^{T}'
  1775. assert latex(Transpose(m+X)) == \
  1776. '\\left(\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] + X\\right)^{T}'
  1777. from sympy.matrices import BlockMatrix, OneMatrix, ZeroMatrix
  1778. assert latex(Transpose(BlockMatrix(((OneMatrix(2, 2), X),
  1779. (m, ZeroMatrix(2, 2)))))) == \
  1780. '\\left[\\begin{matrix}1 & X\\\\\\left[\\begin{matrix}1 & 2\\\\3 & 4\\end{matrix}\\right] & 0\\end{matrix}\\right]^{T}'
  1781. # Issue 20959
  1782. Mx = MatrixSymbol('M^x', 2, 2)
  1783. assert latex(Transpose(Mx)) == r'\left(M^{x}\right)^{T}'
  1784. def test_Hadamard():
  1785. from sympy.matrices import HadamardProduct, HadamardPower
  1786. from sympy.matrices.expressions import MatAdd, MatMul, MatPow
  1787. X = MatrixSymbol('X', 2, 2)
  1788. Y = MatrixSymbol('Y', 2, 2)
  1789. assert latex(HadamardProduct(X, Y*Y)) == r'X \circ Y^{2}'
  1790. assert latex(HadamardProduct(X, Y)*Y) == r'\left(X \circ Y\right) Y'
  1791. assert latex(HadamardPower(X, 2)) == r'X^{\circ {2}}'
  1792. assert latex(HadamardPower(X, -1)) == r'X^{\circ \left({-1}\right)}'
  1793. assert latex(HadamardPower(MatAdd(X, Y), 2)) == \
  1794. r'\left(X + Y\right)^{\circ {2}}'
  1795. assert latex(HadamardPower(MatMul(X, Y), 2)) == \
  1796. r'\left(X Y\right)^{\circ {2}}'
  1797. assert latex(HadamardPower(MatPow(X, -1), -1)) == \
  1798. r'\left(X^{-1}\right)^{\circ \left({-1}\right)}'
  1799. assert latex(MatPow(HadamardPower(X, -1), -1)) == \
  1800. r'\left(X^{\circ \left({-1}\right)}\right)^{-1}'
  1801. assert latex(HadamardPower(X, n+1)) == \
  1802. r'X^{\circ \left({n + 1}\right)}'
  1803. def test_MatPow():
  1804. from sympy.matrices.expressions import MatPow
  1805. X = MatrixSymbol('X', 2, 2)
  1806. Y = MatrixSymbol('Y', 2, 2)
  1807. assert latex(MatPow(X, 2)) == 'X^{2}'
  1808. assert latex(MatPow(X*X, 2)) == '\\left(X^{2}\\right)^{2}'
  1809. assert latex(MatPow(X*Y, 2)) == '\\left(X Y\\right)^{2}'
  1810. assert latex(MatPow(X + Y, 2)) == '\\left(X + Y\\right)^{2}'
  1811. assert latex(MatPow(X + X, 2)) == '\\left(2 X\\right)^{2}'
  1812. # Issue 20959
  1813. Mx = MatrixSymbol('M^x', 2, 2)
  1814. assert latex(MatPow(Mx, 2)) == r'\left(M^{x}\right)^{2}'
  1815. def test_ElementwiseApplyFunction():
  1816. X = MatrixSymbol('X', 2, 2)
  1817. expr = (X.T*X).applyfunc(sin)
  1818. assert latex(expr) == r"{\left( d \mapsto \sin{\left(d \right)} \right)}_{\circ}\left({X^{T} X}\right)"
  1819. expr = X.applyfunc(Lambda(x, 1/x))
  1820. assert latex(expr) == r'{\left( x \mapsto \frac{1}{x} \right)}_{\circ}\left({X}\right)'
  1821. def test_ZeroMatrix():
  1822. from sympy.matrices.expressions.special import ZeroMatrix
  1823. assert latex(ZeroMatrix(1, 1), mat_symbol_style='plain') == r"0"
  1824. assert latex(ZeroMatrix(1, 1), mat_symbol_style='bold') == r"\mathbf{0}"
  1825. def test_OneMatrix():
  1826. from sympy.matrices.expressions.special import OneMatrix
  1827. assert latex(OneMatrix(3, 4), mat_symbol_style='plain') == r"1"
  1828. assert latex(OneMatrix(3, 4), mat_symbol_style='bold') == r"\mathbf{1}"
  1829. def test_Identity():
  1830. from sympy.matrices.expressions.special import Identity
  1831. assert latex(Identity(1), mat_symbol_style='plain') == r"\mathbb{I}"
  1832. assert latex(Identity(1), mat_symbol_style='bold') == r"\mathbf{I}"
  1833. def test_latex_DFT_IDFT():
  1834. from sympy.matrices.expressions.fourier import DFT, IDFT
  1835. assert latex(DFT(13)) == r"\text{DFT}_{13}"
  1836. assert latex(IDFT(x)) == r"\text{IDFT}_{x}"
  1837. def test_boolean_args_order():
  1838. syms = symbols('a:f')
  1839. expr = And(*syms)
  1840. assert latex(expr) == r'a \wedge b \wedge c \wedge d \wedge e \wedge f'
  1841. expr = Or(*syms)
  1842. assert latex(expr) == r'a \vee b \vee c \vee d \vee e \vee f'
  1843. expr = Equivalent(*syms)
  1844. assert latex(expr) == \
  1845. r'a \Leftrightarrow b \Leftrightarrow c \Leftrightarrow d \Leftrightarrow e \Leftrightarrow f'
  1846. expr = Xor(*syms)
  1847. assert latex(expr) == \
  1848. r'a \veebar b \veebar c \veebar d \veebar e \veebar f'
  1849. def test_imaginary():
  1850. i = sqrt(-1)
  1851. assert latex(i) == r'i'
  1852. def test_builtins_without_args():
  1853. assert latex(sin) == r'\sin'
  1854. assert latex(cos) == r'\cos'
  1855. assert latex(tan) == r'\tan'
  1856. assert latex(log) == r'\log'
  1857. assert latex(Ei) == r'\operatorname{Ei}'
  1858. assert latex(zeta) == r'\zeta'
  1859. def test_latex_greek_functions():
  1860. # bug because capital greeks that have roman equivalents should not use
  1861. # \Alpha, \Beta, \Eta, etc.
  1862. s = Function('Alpha')
  1863. assert latex(s) == r'\mathrm{A}'
  1864. assert latex(s(x)) == r'\mathrm{A}{\left(x \right)}'
  1865. s = Function('Beta')
  1866. assert latex(s) == r'\mathrm{B}'
  1867. s = Function('Eta')
  1868. assert latex(s) == r'\mathrm{H}'
  1869. assert latex(s(x)) == r'\mathrm{H}{\left(x \right)}'
  1870. # bug because sympy.core.numbers.Pi is special
  1871. p = Function('Pi')
  1872. # assert latex(p(x)) == r'\Pi{\left(x \right)}'
  1873. assert latex(p) == r'\Pi'
  1874. # bug because not all greeks are included
  1875. c = Function('chi')
  1876. assert latex(c(x)) == r'\chi{\left(x \right)}'
  1877. assert latex(c) == r'\chi'
  1878. def test_translate():
  1879. s = 'Alpha'
  1880. assert translate(s) == r'\mathrm{A}'
  1881. s = 'Beta'
  1882. assert translate(s) == r'\mathrm{B}'
  1883. s = 'Eta'
  1884. assert translate(s) == r'\mathrm{H}'
  1885. s = 'omicron'
  1886. assert translate(s) == r'o'
  1887. s = 'Pi'
  1888. assert translate(s) == r'\Pi'
  1889. s = 'pi'
  1890. assert translate(s) == r'\pi'
  1891. s = 'LamdaHatDOT'
  1892. assert translate(s) == r'\dot{\hat{\Lambda}}'
  1893. def test_other_symbols():
  1894. from sympy.printing.latex import other_symbols
  1895. for s in other_symbols:
  1896. assert latex(symbols(s)) == r"" "\\" + s
  1897. def test_modifiers():
  1898. # Test each modifier individually in the simplest case
  1899. # (with funny capitalizations)
  1900. assert latex(symbols("xMathring")) == r"\mathring{x}"
  1901. assert latex(symbols("xCheck")) == r"\check{x}"
  1902. assert latex(symbols("xBreve")) == r"\breve{x}"
  1903. assert latex(symbols("xAcute")) == r"\acute{x}"
  1904. assert latex(symbols("xGrave")) == r"\grave{x}"
  1905. assert latex(symbols("xTilde")) == r"\tilde{x}"
  1906. assert latex(symbols("xPrime")) == r"{x}'"
  1907. assert latex(symbols("xddDDot")) == r"\ddddot{x}"
  1908. assert latex(symbols("xDdDot")) == r"\dddot{x}"
  1909. assert latex(symbols("xDDot")) == r"\ddot{x}"
  1910. assert latex(symbols("xBold")) == r"\boldsymbol{x}"
  1911. assert latex(symbols("xnOrM")) == r"\left\|{x}\right\|"
  1912. assert latex(symbols("xAVG")) == r"\left\langle{x}\right\rangle"
  1913. assert latex(symbols("xHat")) == r"\hat{x}"
  1914. assert latex(symbols("xDot")) == r"\dot{x}"
  1915. assert latex(symbols("xBar")) == r"\bar{x}"
  1916. assert latex(symbols("xVec")) == r"\vec{x}"
  1917. assert latex(symbols("xAbs")) == r"\left|{x}\right|"
  1918. assert latex(symbols("xMag")) == r"\left|{x}\right|"
  1919. assert latex(symbols("xPrM")) == r"{x}'"
  1920. assert latex(symbols("xBM")) == r"\boldsymbol{x}"
  1921. # Test strings that are *only* the names of modifiers
  1922. assert latex(symbols("Mathring")) == r"Mathring"
  1923. assert latex(symbols("Check")) == r"Check"
  1924. assert latex(symbols("Breve")) == r"Breve"
  1925. assert latex(symbols("Acute")) == r"Acute"
  1926. assert latex(symbols("Grave")) == r"Grave"
  1927. assert latex(symbols("Tilde")) == r"Tilde"
  1928. assert latex(symbols("Prime")) == r"Prime"
  1929. assert latex(symbols("DDot")) == r"\dot{D}"
  1930. assert latex(symbols("Bold")) == r"Bold"
  1931. assert latex(symbols("NORm")) == r"NORm"
  1932. assert latex(symbols("AVG")) == r"AVG"
  1933. assert latex(symbols("Hat")) == r"Hat"
  1934. assert latex(symbols("Dot")) == r"Dot"
  1935. assert latex(symbols("Bar")) == r"Bar"
  1936. assert latex(symbols("Vec")) == r"Vec"
  1937. assert latex(symbols("Abs")) == r"Abs"
  1938. assert latex(symbols("Mag")) == r"Mag"
  1939. assert latex(symbols("PrM")) == r"PrM"
  1940. assert latex(symbols("BM")) == r"BM"
  1941. assert latex(symbols("hbar")) == r"\hbar"
  1942. # Check a few combinations
  1943. assert latex(symbols("xvecdot")) == r"\dot{\vec{x}}"
  1944. assert latex(symbols("xDotVec")) == r"\vec{\dot{x}}"
  1945. assert latex(symbols("xHATNorm")) == r"\left\|{\hat{x}}\right\|"
  1946. # Check a couple big, ugly combinations
  1947. assert latex(symbols('xMathringBm_yCheckPRM__zbreveAbs')) == \
  1948. r"\boldsymbol{\mathring{x}}^{\left|{\breve{z}}\right|}_{{\check{y}}'}"
  1949. assert latex(symbols('alphadothat_nVECDOT__tTildePrime')) == \
  1950. r"\hat{\dot{\alpha}}^{{\tilde{t}}'}_{\dot{\vec{n}}}"
  1951. def test_greek_symbols():
  1952. assert latex(Symbol('alpha')) == r'\alpha'
  1953. assert latex(Symbol('beta')) == r'\beta'
  1954. assert latex(Symbol('gamma')) == r'\gamma'
  1955. assert latex(Symbol('delta')) == r'\delta'
  1956. assert latex(Symbol('epsilon')) == r'\epsilon'
  1957. assert latex(Symbol('zeta')) == r'\zeta'
  1958. assert latex(Symbol('eta')) == r'\eta'
  1959. assert latex(Symbol('theta')) == r'\theta'
  1960. assert latex(Symbol('iota')) == r'\iota'
  1961. assert latex(Symbol('kappa')) == r'\kappa'
  1962. assert latex(Symbol('lambda')) == r'\lambda'
  1963. assert latex(Symbol('mu')) == r'\mu'
  1964. assert latex(Symbol('nu')) == r'\nu'
  1965. assert latex(Symbol('xi')) == r'\xi'
  1966. assert latex(Symbol('omicron')) == r'o'
  1967. assert latex(Symbol('pi')) == r'\pi'
  1968. assert latex(Symbol('rho')) == r'\rho'
  1969. assert latex(Symbol('sigma')) == r'\sigma'
  1970. assert latex(Symbol('tau')) == r'\tau'
  1971. assert latex(Symbol('upsilon')) == r'\upsilon'
  1972. assert latex(Symbol('phi')) == r'\phi'
  1973. assert latex(Symbol('chi')) == r'\chi'
  1974. assert latex(Symbol('psi')) == r'\psi'
  1975. assert latex(Symbol('omega')) == r'\omega'
  1976. assert latex(Symbol('Alpha')) == r'\mathrm{A}'
  1977. assert latex(Symbol('Beta')) == r'\mathrm{B}'
  1978. assert latex(Symbol('Gamma')) == r'\Gamma'
  1979. assert latex(Symbol('Delta')) == r'\Delta'
  1980. assert latex(Symbol('Epsilon')) == r'\mathrm{E}'
  1981. assert latex(Symbol('Zeta')) == r'\mathrm{Z}'
  1982. assert latex(Symbol('Eta')) == r'\mathrm{H}'
  1983. assert latex(Symbol('Theta')) == r'\Theta'
  1984. assert latex(Symbol('Iota')) == r'\mathrm{I}'
  1985. assert latex(Symbol('Kappa')) == r'\mathrm{K}'
  1986. assert latex(Symbol('Lambda')) == r'\Lambda'
  1987. assert latex(Symbol('Mu')) == r'\mathrm{M}'
  1988. assert latex(Symbol('Nu')) == r'\mathrm{N}'
  1989. assert latex(Symbol('Xi')) == r'\Xi'
  1990. assert latex(Symbol('Omicron')) == r'\mathrm{O}'
  1991. assert latex(Symbol('Pi')) == r'\Pi'
  1992. assert latex(Symbol('Rho')) == r'\mathrm{P}'
  1993. assert latex(Symbol('Sigma')) == r'\Sigma'
  1994. assert latex(Symbol('Tau')) == r'\mathrm{T}'
  1995. assert latex(Symbol('Upsilon')) == r'\Upsilon'
  1996. assert latex(Symbol('Phi')) == r'\Phi'
  1997. assert latex(Symbol('Chi')) == r'\mathrm{X}'
  1998. assert latex(Symbol('Psi')) == r'\Psi'
  1999. assert latex(Symbol('Omega')) == r'\Omega'
  2000. assert latex(Symbol('varepsilon')) == r'\varepsilon'
  2001. assert latex(Symbol('varkappa')) == r'\varkappa'
  2002. assert latex(Symbol('varphi')) == r'\varphi'
  2003. assert latex(Symbol('varpi')) == r'\varpi'
  2004. assert latex(Symbol('varrho')) == r'\varrho'
  2005. assert latex(Symbol('varsigma')) == r'\varsigma'
  2006. assert latex(Symbol('vartheta')) == r'\vartheta'
  2007. def test_fancyset_symbols():
  2008. assert latex(S.Rationals) == r'\mathbb{Q}'
  2009. assert latex(S.Naturals) == r'\mathbb{N}'
  2010. assert latex(S.Naturals0) == r'\mathbb{N}_0'
  2011. assert latex(S.Integers) == r'\mathbb{Z}'
  2012. assert latex(S.Reals) == r'\mathbb{R}'
  2013. assert latex(S.Complexes) == r'\mathbb{C}'
  2014. @XFAIL
  2015. def test_builtin_without_args_mismatched_names():
  2016. assert latex(CosineTransform) == r'\mathcal{COS}'
  2017. def test_builtin_no_args():
  2018. assert latex(Chi) == r'\operatorname{Chi}'
  2019. assert latex(beta) == r'\operatorname{B}'
  2020. assert latex(gamma) == r'\Gamma'
  2021. assert latex(KroneckerDelta) == r'\delta'
  2022. assert latex(DiracDelta) == r'\delta'
  2023. assert latex(lowergamma) == r'\gamma'
  2024. def test_issue_6853():
  2025. p = Function('Pi')
  2026. assert latex(p(x)) == r"\Pi{\left(x \right)}"
  2027. def test_Mul():
  2028. e = Mul(-2, x + 1, evaluate=False)
  2029. assert latex(e) == r'- 2 \left(x + 1\right)'
  2030. e = Mul(2, x + 1, evaluate=False)
  2031. assert latex(e) == r'2 \left(x + 1\right)'
  2032. e = Mul(S.Half, x + 1, evaluate=False)
  2033. assert latex(e) == r'\frac{x + 1}{2}'
  2034. e = Mul(y, x + 1, evaluate=False)
  2035. assert latex(e) == r'y \left(x + 1\right)'
  2036. e = Mul(-y, x + 1, evaluate=False)
  2037. assert latex(e) == r'- y \left(x + 1\right)'
  2038. e = Mul(-2, x + 1)
  2039. assert latex(e) == r'- 2 x - 2'
  2040. e = Mul(2, x + 1)
  2041. assert latex(e) == r'2 x + 2'
  2042. def test_Pow():
  2043. e = Pow(2, 2, evaluate=False)
  2044. assert latex(e) == r'2^{2}'
  2045. assert latex(x**(Rational(-1, 3))) == r'\frac{1}{\sqrt[3]{x}}'
  2046. x2 = Symbol(r'x^2')
  2047. assert latex(x2**2) == r'\left(x^{2}\right)^{2}'
  2048. # Issue 11011
  2049. assert latex(S('1.453e4500')**x) == r'{1.453 \cdot 10^{4500}}^{x}'
  2050. def test_issue_7180():
  2051. assert latex(Equivalent(x, y)) == r"x \Leftrightarrow y"
  2052. assert latex(Not(Equivalent(x, y))) == r"x \not\Leftrightarrow y"
  2053. def test_issue_8409():
  2054. assert latex(S.Half**n) == r"\left(\frac{1}{2}\right)^{n}"
  2055. def test_issue_8470():
  2056. from sympy.parsing.sympy_parser import parse_expr
  2057. e = parse_expr("-B*A", evaluate=False)
  2058. assert latex(e) == r"A \left(- B\right)"
  2059. def test_issue_15439():
  2060. x = MatrixSymbol('x', 2, 2)
  2061. y = MatrixSymbol('y', 2, 2)
  2062. assert latex((x * y).subs(y, -y)) == r"x \left(- y\right)"
  2063. assert latex((x * y).subs(y, -2*y)) == r"x \left(- 2 y\right)"
  2064. assert latex((x * y).subs(x, -x)) == r"\left(- x\right) y"
  2065. def test_issue_2934():
  2066. assert latex(Symbol(r'\frac{a_1}{b_1}')) == r'\frac{a_1}{b_1}'
  2067. def test_issue_10489():
  2068. latexSymbolWithBrace = r'C_{x_{0}}'
  2069. s = Symbol(latexSymbolWithBrace)
  2070. assert latex(s) == latexSymbolWithBrace
  2071. assert latex(cos(s)) == r'\cos{\left(C_{x_{0}} \right)}'
  2072. def test_issue_12886():
  2073. m__1, l__1 = symbols('m__1, l__1')
  2074. assert latex(m__1**2 + l__1**2) == \
  2075. r'\left(l^{1}\right)^{2} + \left(m^{1}\right)^{2}'
  2076. def test_issue_13559():
  2077. from sympy.parsing.sympy_parser import parse_expr
  2078. expr = parse_expr('5/1', evaluate=False)
  2079. assert latex(expr) == r"\frac{5}{1}"
  2080. def test_issue_13651():
  2081. expr = c + Mul(-1, a + b, evaluate=False)
  2082. assert latex(expr) == r"c - \left(a + b\right)"
  2083. def test_latex_UnevaluatedExpr():
  2084. x = symbols("x")
  2085. he = UnevaluatedExpr(1/x)
  2086. assert latex(he) == latex(1/x) == r"\frac{1}{x}"
  2087. assert latex(he**2) == r"\left(\frac{1}{x}\right)^{2}"
  2088. assert latex(he + 1) == r"1 + \frac{1}{x}"
  2089. assert latex(x*he) == r"x \frac{1}{x}"
  2090. def test_MatrixElement_printing():
  2091. # test cases for issue #11821
  2092. A = MatrixSymbol("A", 1, 3)
  2093. B = MatrixSymbol("B", 1, 3)
  2094. C = MatrixSymbol("C", 1, 3)
  2095. assert latex(A[0, 0]) == r"{A}_{0,0}"
  2096. assert latex(3 * A[0, 0]) == r"3 {A}_{0,0}"
  2097. F = C[0, 0].subs(C, A - B)
  2098. assert latex(F) == r"{\left(A - B\right)}_{0,0}"
  2099. i, j, k = symbols("i j k")
  2100. M = MatrixSymbol("M", k, k)
  2101. N = MatrixSymbol("N", k, k)
  2102. assert latex((M*N)[i, j]) == \
  2103. r'\sum_{i_{1}=0}^{k - 1} {M}_{i,i_{1}} {N}_{i_{1},j}'
  2104. X_a = MatrixSymbol('X_a', 3, 3)
  2105. assert latex(X_a[0, 0]) == r"{X_{a}}_{0,0}"
  2106. def test_MatrixSymbol_printing():
  2107. # test cases for issue #14237
  2108. A = MatrixSymbol("A", 3, 3)
  2109. B = MatrixSymbol("B", 3, 3)
  2110. C = MatrixSymbol("C", 3, 3)
  2111. assert latex(-A) == r"- A"
  2112. assert latex(A - A*B - B) == r"A - A B - B"
  2113. assert latex(-A*B - A*B*C - B) == r"- A B - A B C - B"
  2114. def test_DotProduct_printing():
  2115. X = MatrixSymbol('X', 3, 1)
  2116. Y = MatrixSymbol('Y', 3, 1)
  2117. a = Symbol('a')
  2118. assert latex(DotProduct(X, Y)) == r"X \cdot Y"
  2119. assert latex(DotProduct(a * X, Y)) == r"a X \cdot Y"
  2120. assert latex(a * DotProduct(X, Y)) == r"a \left(X \cdot Y\right)"
  2121. def test_KroneckerProduct_printing():
  2122. A = MatrixSymbol('A', 3, 3)
  2123. B = MatrixSymbol('B', 2, 2)
  2124. assert latex(KroneckerProduct(A, B)) == r'A \otimes B'
  2125. def test_Series_printing():
  2126. tf1 = TransferFunction(x*y**2 - z, y**3 - t**3, y)
  2127. tf2 = TransferFunction(x - y, x + y, y)
  2128. tf3 = TransferFunction(t*x**2 - t**w*x + w, t - y, y)
  2129. assert latex(Series(tf1, tf2)) == \
  2130. r'\left(\frac{x y^{2} - z}{- t^{3} + y^{3}}\right) \left(\frac{x - y}{x + y}\right)'
  2131. assert latex(Series(tf1, tf2, tf3)) == \
  2132. r'\left(\frac{x y^{2} - z}{- t^{3} + y^{3}}\right) \left(\frac{x - y}{x + y}\right) \left(\frac{t x^{2} - t^{w} x + w}{t - y}\right)'
  2133. assert latex(Series(-tf2, tf1)) == \
  2134. r'\left(\frac{- x + y}{x + y}\right) \left(\frac{x y^{2} - z}{- t^{3} + y^{3}}\right)'
  2135. M_1 = Matrix([[5/s], [5/(2*s)]])
  2136. T_1 = TransferFunctionMatrix.from_Matrix(M_1, s)
  2137. M_2 = Matrix([[5, 6*s**3]])
  2138. T_2 = TransferFunctionMatrix.from_Matrix(M_2, s)
  2139. # Brackets
  2140. assert latex(T_1*(T_2 + T_2)) == \
  2141. r'\left[\begin{matrix}\frac{5}{s}\\\frac{5}{2 s}\end{matrix}\right]_\tau\cdot\left(\left[\begin{matrix}\frac{5}{1} &' \
  2142. r' \frac{6 s^{3}}{1}\end{matrix}\right]_\tau + \left[\begin{matrix}\frac{5}{1} & \frac{6 s^{3}}{1}\end{matrix}\right]_\tau\right)' \
  2143. == latex(MIMOSeries(MIMOParallel(T_2, T_2), T_1))
  2144. # No Brackets
  2145. M_3 = Matrix([[5, 6], [6, 5/s]])
  2146. T_3 = TransferFunctionMatrix.from_Matrix(M_3, s)
  2147. assert latex(T_1*T_2 + T_3) == r'\left[\begin{matrix}\frac{5}{s}\\\frac{5}{2 s}\end{matrix}\right]_\tau\cdot\left[\begin{matrix}' \
  2148. r'\frac{5}{1} & \frac{6 s^{3}}{1}\end{matrix}\right]_\tau + \left[\begin{matrix}\frac{5}{1} & \frac{6}{1}\\\frac{6}{1} & ' \
  2149. r'\frac{5}{s}\end{matrix}\right]_\tau' == latex(MIMOParallel(MIMOSeries(T_2, T_1), T_3))
  2150. def test_TransferFunction_printing():
  2151. tf1 = TransferFunction(x - 1, x + 1, x)
  2152. assert latex(tf1) == r"\frac{x - 1}{x + 1}"
  2153. tf2 = TransferFunction(x + 1, 2 - y, x)
  2154. assert latex(tf2) == r"\frac{x + 1}{2 - y}"
  2155. tf3 = TransferFunction(y, y**2 + 2*y + 3, y)
  2156. assert latex(tf3) == r"\frac{y}{y^{2} + 2 y + 3}"
  2157. def test_Parallel_printing():
  2158. tf1 = TransferFunction(x*y**2 - z, y**3 - t**3, y)
  2159. tf2 = TransferFunction(x - y, x + y, y)
  2160. assert latex(Parallel(tf1, tf2)) == \
  2161. r'\frac{x y^{2} - z}{- t^{3} + y^{3}} + \frac{x - y}{x + y}'
  2162. assert latex(Parallel(-tf2, tf1)) == \
  2163. r'\frac{- x + y}{x + y} + \frac{x y^{2} - z}{- t^{3} + y^{3}}'
  2164. M_1 = Matrix([[5, 6], [6, 5/s]])
  2165. T_1 = TransferFunctionMatrix.from_Matrix(M_1, s)
  2166. M_2 = Matrix([[5/s, 6], [6, 5/(s - 1)]])
  2167. T_2 = TransferFunctionMatrix.from_Matrix(M_2, s)
  2168. M_3 = Matrix([[6, 5/(s*(s - 1))], [5, 6]])
  2169. T_3 = TransferFunctionMatrix.from_Matrix(M_3, s)
  2170. assert latex(T_1 + T_2 + T_3) == r'\left[\begin{matrix}\frac{5}{1} & \frac{6}{1}\\\frac{6}{1} & \frac{5}{s}\end{matrix}\right]' \
  2171. r'_\tau + \left[\begin{matrix}\frac{5}{s} & \frac{6}{1}\\\frac{6}{1} & \frac{5}{s - 1}\end{matrix}\right]_\tau + \left[\begin{matrix}' \
  2172. r'\frac{6}{1} & \frac{5}{s \left(s - 1\right)}\\\frac{5}{1} & \frac{6}{1}\end{matrix}\right]_\tau' \
  2173. == latex(MIMOParallel(T_1, T_2, T_3)) == latex(MIMOParallel(T_1, MIMOParallel(T_2, T_3))) == latex(MIMOParallel(MIMOParallel(T_1, T_2), T_3))
  2174. def test_TransferFunctionMatrix_printing():
  2175. tf1 = TransferFunction(p, p + x, p)
  2176. tf2 = TransferFunction(-s + p, p + s, p)
  2177. tf3 = TransferFunction(p, y**2 + 2*y + 3, p)
  2178. assert latex(TransferFunctionMatrix([[tf1], [tf2]])) == \
  2179. r'\left[\begin{matrix}\frac{p}{p + x}\\\frac{p - s}{p + s}\end{matrix}\right]_\tau'
  2180. assert latex(TransferFunctionMatrix([[tf1, tf2], [tf3, -tf1]])) == \
  2181. r'\left[\begin{matrix}\frac{p}{p + x} & \frac{p - s}{p + s}\\\frac{p}{y^{2} + 2 y + 3} & \frac{\left(-1\right) p}{p + x}\end{matrix}\right]_\tau'
  2182. def test_Feedback_printing():
  2183. tf1 = TransferFunction(p, p + x, p)
  2184. tf2 = TransferFunction(-s + p, p + s, p)
  2185. # Negative Feedback (Default)
  2186. assert latex(Feedback(tf1, tf2)) == \
  2187. r'\frac{\frac{p}{p + x}}{\frac{1}{1} + \left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}'
  2188. assert latex(Feedback(tf1*tf2, TransferFunction(1, 1, p))) == \
  2189. r'\frac{\left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}{\frac{1}{1} + \left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}'
  2190. # Positive Feedback
  2191. assert latex(Feedback(tf1, tf2, 1)) == \
  2192. r'\frac{\frac{p}{p + x}}{\frac{1}{1} - \left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}'
  2193. assert latex(Feedback(tf1*tf2, sign=1)) == \
  2194. r'\frac{\left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}{\frac{1}{1} - \left(\frac{p}{p + x}\right) \left(\frac{p - s}{p + s}\right)}'
  2195. def test_MIMOFeedback_printing():
  2196. tf1 = TransferFunction(1, s, s)
  2197. tf2 = TransferFunction(s, s**2 - 1, s)
  2198. tf3 = TransferFunction(s, s - 1, s)
  2199. tf4 = TransferFunction(s**2, s**2 - 1, s)
  2200. tfm_1 = TransferFunctionMatrix([[tf1, tf2], [tf3, tf4]])
  2201. tfm_2 = TransferFunctionMatrix([[tf4, tf3], [tf2, tf1]])
  2202. # Negative Feedback (Default)
  2203. assert latex(MIMOFeedback(tfm_1, tfm_2)) == \
  2204. r'\left(I_{\tau} + \left[\begin{matrix}\frac{1}{s} & \frac{s}{s^{2} - 1}\\\frac{s}{s - 1} & \frac{s^{2}}{s^{2} - 1}\end{matrix}\right]_\tau\cdot\left[' \
  2205. r'\begin{matrix}\frac{s^{2}}{s^{2} - 1} & \frac{s}{s - 1}\\\frac{s}{s^{2} - 1} & \frac{1}{s}\end{matrix}\right]_\tau\right)^{-1} \cdot \left[\begin{matrix}' \
  2206. r'\frac{1}{s} & \frac{s}{s^{2} - 1}\\\frac{s}{s - 1} & \frac{s^{2}}{s^{2} - 1}\end{matrix}\right]_\tau'
  2207. # Positive Feedback
  2208. assert latex(MIMOFeedback(tfm_1*tfm_2, tfm_1, 1)) == \
  2209. r'\left(I_{\tau} - \left[\begin{matrix}\frac{1}{s} & \frac{s}{s^{2} - 1}\\\frac{s}{s - 1} & \frac{s^{2}}{s^{2} - 1}\end{matrix}\right]_\tau\cdot\left' \
  2210. r'[\begin{matrix}\frac{s^{2}}{s^{2} - 1} & \frac{s}{s - 1}\\\frac{s}{s^{2} - 1} & \frac{1}{s}\end{matrix}\right]_\tau\cdot\left[\begin{matrix}\frac{1}{s} & \frac{s}{s^{2} - 1}' \
  2211. r'\\\frac{s}{s - 1} & \frac{s^{2}}{s^{2} - 1}\end{matrix}\right]_\tau\right)^{-1} \cdot \left[\begin{matrix}\frac{1}{s} & \frac{s}{s^{2} - 1}' \
  2212. r'\\\frac{s}{s - 1} & \frac{s^{2}}{s^{2} - 1}\end{matrix}\right]_\tau\cdot\left[\begin{matrix}\frac{s^{2}}{s^{2} - 1} & \frac{s}{s - 1}\\\frac{s}{s^{2} - 1}' \
  2213. r' & \frac{1}{s}\end{matrix}\right]_\tau'
  2214. def test_Quaternion_latex_printing():
  2215. q = Quaternion(x, y, z, t)
  2216. assert latex(q) == r"x + y i + z j + t k"
  2217. q = Quaternion(x, y, z, x*t)
  2218. assert latex(q) == r"x + y i + z j + t x k"
  2219. q = Quaternion(x, y, z, x + t)
  2220. assert latex(q) == r"x + y i + z j + \left(t + x\right) k"
  2221. def test_TensorProduct_printing():
  2222. from sympy.tensor.functions import TensorProduct
  2223. A = MatrixSymbol("A", 3, 3)
  2224. B = MatrixSymbol("B", 3, 3)
  2225. assert latex(TensorProduct(A, B)) == r"A \otimes B"
  2226. def test_WedgeProduct_printing():
  2227. from sympy.diffgeom.rn import R2
  2228. from sympy.diffgeom import WedgeProduct
  2229. wp = WedgeProduct(R2.dx, R2.dy)
  2230. assert latex(wp) == r"\operatorname{d}x \wedge \operatorname{d}y"
  2231. def test_issue_9216():
  2232. expr_1 = Pow(1, -1, evaluate=False)
  2233. assert latex(expr_1) == r"1^{-1}"
  2234. expr_2 = Pow(1, Pow(1, -1, evaluate=False), evaluate=False)
  2235. assert latex(expr_2) == r"1^{1^{-1}}"
  2236. expr_3 = Pow(3, -2, evaluate=False)
  2237. assert latex(expr_3) == r"\frac{1}{9}"
  2238. expr_4 = Pow(1, -2, evaluate=False)
  2239. assert latex(expr_4) == r"1^{-2}"
  2240. def test_latex_printer_tensor():
  2241. from sympy.tensor.tensor import TensorIndexType, tensor_indices, TensorHead, tensor_heads
  2242. L = TensorIndexType("L")
  2243. i, j, k, l = tensor_indices("i j k l", L)
  2244. i0 = tensor_indices("i_0", L)
  2245. A, B, C, D = tensor_heads("A B C D", [L])
  2246. H = TensorHead("H", [L, L])
  2247. K = TensorHead("K", [L, L, L, L])
  2248. assert latex(i) == r"{}^{i}"
  2249. assert latex(-i) == r"{}_{i}"
  2250. expr = A(i)
  2251. assert latex(expr) == r"A{}^{i}"
  2252. expr = A(i0)
  2253. assert latex(expr) == r"A{}^{i_{0}}"
  2254. expr = A(-i)
  2255. assert latex(expr) == r"A{}_{i}"
  2256. expr = -3*A(i)
  2257. assert latex(expr) == r"-3A{}^{i}"
  2258. expr = K(i, j, -k, -i0)
  2259. assert latex(expr) == r"K{}^{ij}{}_{ki_{0}}"
  2260. expr = K(i, -j, -k, i0)
  2261. assert latex(expr) == r"K{}^{i}{}_{jk}{}^{i_{0}}"
  2262. expr = K(i, -j, k, -i0)
  2263. assert latex(expr) == r"K{}^{i}{}_{j}{}^{k}{}_{i_{0}}"
  2264. expr = H(i, -j)
  2265. assert latex(expr) == r"H{}^{i}{}_{j}"
  2266. expr = H(i, j)
  2267. assert latex(expr) == r"H{}^{ij}"
  2268. expr = H(-i, -j)
  2269. assert latex(expr) == r"H{}_{ij}"
  2270. expr = (1+x)*A(i)
  2271. assert latex(expr) == r"\left(x + 1\right)A{}^{i}"
  2272. expr = H(i, -i)
  2273. assert latex(expr) == r"H{}^{L_{0}}{}_{L_{0}}"
  2274. expr = H(i, -j)*A(j)*B(k)
  2275. assert latex(expr) == r"H{}^{i}{}_{L_{0}}A{}^{L_{0}}B{}^{k}"
  2276. expr = A(i) + 3*B(i)
  2277. assert latex(expr) == r"3B{}^{i} + A{}^{i}"
  2278. # Test ``TensorElement``:
  2279. from sympy.tensor.tensor import TensorElement
  2280. expr = TensorElement(K(i, j, k, l), {i: 3, k: 2})
  2281. assert latex(expr) == r'K{}^{i=3,j,k=2,l}'
  2282. expr = TensorElement(K(i, j, k, l), {i: 3})
  2283. assert latex(expr) == r'K{}^{i=3,jkl}'
  2284. expr = TensorElement(K(i, -j, k, l), {i: 3, k: 2})
  2285. assert latex(expr) == r'K{}^{i=3}{}_{j}{}^{k=2,l}'
  2286. expr = TensorElement(K(i, -j, k, -l), {i: 3, k: 2})
  2287. assert latex(expr) == r'K{}^{i=3}{}_{j}{}^{k=2}{}_{l}'
  2288. expr = TensorElement(K(i, j, -k, -l), {i: 3, -k: 2})
  2289. assert latex(expr) == r'K{}^{i=3,j}{}_{k=2,l}'
  2290. expr = TensorElement(K(i, j, -k, -l), {i: 3})
  2291. assert latex(expr) == r'K{}^{i=3,j}{}_{kl}'
  2292. expr = PartialDerivative(A(i), A(i))
  2293. assert latex(expr) == r"\frac{\partial}{\partial {A{}^{L_{0}}}}{A{}^{L_{0}}}"
  2294. expr = PartialDerivative(A(-i), A(-j))
  2295. assert latex(expr) == r"\frac{\partial}{\partial {A{}_{j}}}{A{}_{i}}"
  2296. expr = PartialDerivative(K(i, j, -k, -l), A(m), A(-n))
  2297. assert latex(expr) == r"\frac{\partial^{2}}{\partial {A{}^{m}} \partial {A{}_{n}}}{K{}^{ij}{}_{kl}}"
  2298. expr = PartialDerivative(B(-i) + A(-i), A(-j), A(-n))
  2299. assert latex(expr) == r"\frac{\partial^{2}}{\partial {A{}_{j}} \partial {A{}_{n}}}{\left(A{}_{i} + B{}_{i}\right)}"
  2300. expr = PartialDerivative(3*A(-i), A(-j), A(-n))
  2301. assert latex(expr) == r"\frac{\partial^{2}}{\partial {A{}_{j}} \partial {A{}_{n}}}{\left(3A{}_{i}\right)}"
  2302. def test_multiline_latex():
  2303. a, b, c, d, e, f = symbols('a b c d e f')
  2304. expr = -a + 2*b -3*c +4*d -5*e
  2305. expected = r"\begin{eqnarray}" + "\n"\
  2306. r"f & = &- a \nonumber\\" + "\n"\
  2307. r"& & + 2 b \nonumber\\" + "\n"\
  2308. r"& & - 3 c \nonumber\\" + "\n"\
  2309. r"& & + 4 d \nonumber\\" + "\n"\
  2310. r"& & - 5 e " + "\n"\
  2311. r"\end{eqnarray}"
  2312. assert multiline_latex(f, expr, environment="eqnarray") == expected
  2313. expected2 = r'\begin{eqnarray}' + '\n'\
  2314. r'f & = &- a + 2 b \nonumber\\' + '\n'\
  2315. r'& & - 3 c + 4 d \nonumber\\' + '\n'\
  2316. r'& & - 5 e ' + '\n'\
  2317. r'\end{eqnarray}'
  2318. assert multiline_latex(f, expr, 2, environment="eqnarray") == expected2
  2319. expected3 = r'\begin{eqnarray}' + '\n'\
  2320. r'f & = &- a + 2 b - 3 c \nonumber\\'+ '\n'\
  2321. r'& & + 4 d - 5 e ' + '\n'\
  2322. r'\end{eqnarray}'
  2323. assert multiline_latex(f, expr, 3, environment="eqnarray") == expected3
  2324. expected3dots = r'\begin{eqnarray}' + '\n'\
  2325. r'f & = &- a + 2 b - 3 c \dots\nonumber\\'+ '\n'\
  2326. r'& & + 4 d - 5 e ' + '\n'\
  2327. r'\end{eqnarray}'
  2328. assert multiline_latex(f, expr, 3, environment="eqnarray", use_dots=True) == expected3dots
  2329. expected3align = r'\begin{align*}' + '\n'\
  2330. r'f = &- a + 2 b - 3 c \\'+ '\n'\
  2331. r'& + 4 d - 5 e ' + '\n'\
  2332. r'\end{align*}'
  2333. assert multiline_latex(f, expr, 3) == expected3align
  2334. assert multiline_latex(f, expr, 3, environment='align*') == expected3align
  2335. expected2ieee = r'\begin{IEEEeqnarray}{rCl}' + '\n'\
  2336. r'f & = &- a + 2 b \nonumber\\' + '\n'\
  2337. r'& & - 3 c + 4 d \nonumber\\' + '\n'\
  2338. r'& & - 5 e ' + '\n'\
  2339. r'\end{IEEEeqnarray}'
  2340. assert multiline_latex(f, expr, 2, environment="IEEEeqnarray") == expected2ieee
  2341. raises(ValueError, lambda: multiline_latex(f, expr, environment="foo"))
  2342. def test_issue_15353():
  2343. a, x = symbols('a x')
  2344. # Obtained from nonlinsolve([(sin(a*x)),cos(a*x)],[x,a])
  2345. sol = ConditionSet(
  2346. Tuple(x, a), Eq(sin(a*x), 0) & Eq(cos(a*x), 0), S.Complexes**2)
  2347. assert latex(sol) == \
  2348. r'\left\{\left( x, \ a\right)\; \middle|\; \left( x, \ a\right) \in ' \
  2349. r'\mathbb{C}^{2} \wedge \sin{\left(a x \right)} = 0 \wedge ' \
  2350. r'\cos{\left(a x \right)} = 0 \right\}'
  2351. def test_latex_symbolic_probability():
  2352. mu = symbols("mu")
  2353. sigma = symbols("sigma", positive=True)
  2354. X = Normal("X", mu, sigma)
  2355. assert latex(Expectation(X)) == r'\operatorname{E}\left[X\right]'
  2356. assert latex(Variance(X)) == r'\operatorname{Var}\left(X\right)'
  2357. assert latex(Probability(X > 0)) == r'\operatorname{P}\left(X > 0\right)'
  2358. Y = Normal("Y", mu, sigma)
  2359. assert latex(Covariance(X, Y)) == r'\operatorname{Cov}\left(X, Y\right)'
  2360. def test_trace():
  2361. # Issue 15303
  2362. from sympy.matrices.expressions.trace import trace
  2363. A = MatrixSymbol("A", 2, 2)
  2364. assert latex(trace(A)) == r"\operatorname{tr}\left(A \right)"
  2365. assert latex(trace(A**2)) == r"\operatorname{tr}\left(A^{2} \right)"
  2366. def test_print_basic():
  2367. # Issue 15303
  2368. from sympy.core.basic import Basic
  2369. from sympy.core.expr import Expr
  2370. # dummy class for testing printing where the function is not
  2371. # implemented in latex.py
  2372. class UnimplementedExpr(Expr):
  2373. def __new__(cls, e):
  2374. return Basic.__new__(cls, e)
  2375. # dummy function for testing
  2376. def unimplemented_expr(expr):
  2377. return UnimplementedExpr(expr).doit()
  2378. # override class name to use superscript / subscript
  2379. def unimplemented_expr_sup_sub(expr):
  2380. result = UnimplementedExpr(expr)
  2381. result.__class__.__name__ = 'UnimplementedExpr_x^1'
  2382. return result
  2383. assert latex(unimplemented_expr(x)) == r'\operatorname{UnimplementedExpr}\left(x\right)'
  2384. assert latex(unimplemented_expr(x**2)) == \
  2385. r'\operatorname{UnimplementedExpr}\left(x^{2}\right)'
  2386. assert latex(unimplemented_expr_sup_sub(x)) == \
  2387. r'\operatorname{UnimplementedExpr^{1}_{x}}\left(x\right)'
  2388. def test_MatrixSymbol_bold():
  2389. # Issue #15871
  2390. from sympy.matrices.expressions.trace import trace
  2391. A = MatrixSymbol("A", 2, 2)
  2392. assert latex(trace(A), mat_symbol_style='bold') == \
  2393. r"\operatorname{tr}\left(\mathbf{A} \right)"
  2394. assert latex(trace(A), mat_symbol_style='plain') == \
  2395. r"\operatorname{tr}\left(A \right)"
  2396. A = MatrixSymbol("A", 3, 3)
  2397. B = MatrixSymbol("B", 3, 3)
  2398. C = MatrixSymbol("C", 3, 3)
  2399. assert latex(-A, mat_symbol_style='bold') == r"- \mathbf{A}"
  2400. assert latex(A - A*B - B, mat_symbol_style='bold') == \
  2401. r"\mathbf{A} - \mathbf{A} \mathbf{B} - \mathbf{B}"
  2402. assert latex(-A*B - A*B*C - B, mat_symbol_style='bold') == \
  2403. r"- \mathbf{A} \mathbf{B} - \mathbf{A} \mathbf{B} \mathbf{C} - \mathbf{B}"
  2404. A_k = MatrixSymbol("A_k", 3, 3)
  2405. assert latex(A_k, mat_symbol_style='bold') == r"\mathbf{A}_{k}"
  2406. A = MatrixSymbol(r"\nabla_k", 3, 3)
  2407. assert latex(A, mat_symbol_style='bold') == r"\mathbf{\nabla}_{k}"
  2408. def test_AppliedPermutation():
  2409. p = Permutation(0, 1, 2)
  2410. x = Symbol('x')
  2411. assert latex(AppliedPermutation(p, x)) == \
  2412. r'\sigma_{\left( 0\; 1\; 2\right)}(x)'
  2413. def test_PermutationMatrix():
  2414. p = Permutation(0, 1, 2)
  2415. assert latex(PermutationMatrix(p)) == r'P_{\left( 0\; 1\; 2\right)}'
  2416. p = Permutation(0, 3)(1, 2)
  2417. assert latex(PermutationMatrix(p)) == \
  2418. r'P_{\left( 0\; 3\right)\left( 1\; 2\right)}'
  2419. def test_issue_21758():
  2420. from sympy.functions.elementary.piecewise import piecewise_fold
  2421. from sympy.series.fourier import FourierSeries
  2422. x = Symbol('x')
  2423. k, n = symbols('k n')
  2424. fo = FourierSeries(x, (x, -pi, pi), (0, SeqFormula(0, (k, 1, oo)), SeqFormula(
  2425. Piecewise((-2*pi*cos(n*pi)/n + 2*sin(n*pi)/n**2, (n > -oo) & (n < oo) & Ne(n, 0)),
  2426. (0, True))*sin(n*x)/pi, (n, 1, oo))))
  2427. assert latex(piecewise_fold(fo)) == '\\begin{cases} 2 \\sin{\\left(x \\right)}' \
  2428. ' - \\sin{\\left(2 x \\right)} + \\frac{2 \\sin{\\left(3 x \\right)}}{3} +' \
  2429. ' \\ldots & \\text{for}\\: n > -\\infty \\wedge n < \\infty \\wedge ' \
  2430. 'n \\neq 0 \\\\0 & \\text{otherwise} \\end{cases}'
  2431. assert latex(FourierSeries(x, (x, -pi, pi), (0, SeqFormula(0, (k, 1, oo)),
  2432. SeqFormula(0, (n, 1, oo))))) == '0'
  2433. def test_imaginary_unit():
  2434. assert latex(1 + I) == r'1 + i'
  2435. assert latex(1 + I, imaginary_unit='i') == r'1 + i'
  2436. assert latex(1 + I, imaginary_unit='j') == r'1 + j'
  2437. assert latex(1 + I, imaginary_unit='foo') == r'1 + foo'
  2438. assert latex(I, imaginary_unit="ti") == r'\text{i}'
  2439. assert latex(I, imaginary_unit="tj") == r'\text{j}'
  2440. def test_text_re_im():
  2441. assert latex(im(x), gothic_re_im=True) == r'\Im{\left(x\right)}'
  2442. assert latex(im(x), gothic_re_im=False) == r'\operatorname{im}{\left(x\right)}'
  2443. assert latex(re(x), gothic_re_im=True) == r'\Re{\left(x\right)}'
  2444. assert latex(re(x), gothic_re_im=False) == r'\operatorname{re}{\left(x\right)}'
  2445. def test_latex_diffgeom():
  2446. from sympy.diffgeom import Manifold, Patch, CoordSystem, BaseScalarField, Differential
  2447. from sympy.diffgeom.rn import R2
  2448. x,y = symbols('x y', real=True)
  2449. m = Manifold('M', 2)
  2450. assert latex(m) == r'\text{M}'
  2451. p = Patch('P', m)
  2452. assert latex(p) == r'\text{P}_{\text{M}}'
  2453. rect = CoordSystem('rect', p, [x, y])
  2454. assert latex(rect) == r'\text{rect}^{\text{P}}_{\text{M}}'
  2455. b = BaseScalarField(rect, 0)
  2456. assert latex(b) == r'\mathbf{x}'
  2457. g = Function('g')
  2458. s_field = g(R2.x, R2.y)
  2459. assert latex(Differential(s_field)) == \
  2460. r'\operatorname{d}\left(g{\left(\mathbf{x},\mathbf{y} \right)}\right)'
  2461. def test_unit_printing():
  2462. assert latex(5*meter) == r'5 \text{m}'
  2463. assert latex(3*gibibyte) == r'3 \text{gibibyte}'
  2464. assert latex(4*microgram/second) == r'\frac{4 \mu\text{g}}{\text{s}}'
  2465. assert latex(4*micro*gram/second) == r'\frac{4 \mu \text{g}}{\text{s}}'
  2466. assert latex(5*milli*meter) == r'5 \text{m} \text{m}'
  2467. assert latex(milli) == r'\text{m}'
  2468. def test_issue_17092():
  2469. x_star = Symbol('x^*')
  2470. assert latex(Derivative(x_star, x_star,2)) == r'\frac{d^{2}}{d \left(x^{*}\right)^{2}} x^{*}'
  2471. def test_latex_decimal_separator():
  2472. x, y, z, t = symbols('x y z t')
  2473. k, m, n = symbols('k m n', integer=True)
  2474. f, g, h = symbols('f g h', cls=Function)
  2475. # comma decimal_separator
  2476. assert(latex([1, 2.3, 4.5], decimal_separator='comma') == r'\left[ 1; \ 2{,}3; \ 4{,}5\right]')
  2477. assert(latex(FiniteSet(1, 2.3, 4.5), decimal_separator='comma') == r'\left\{1; 2{,}3; 4{,}5\right\}')
  2478. assert(latex((1, 2.3, 4.6), decimal_separator = 'comma') == r'\left( 1; \ 2{,}3; \ 4{,}6\right)')
  2479. assert(latex((1,), decimal_separator='comma') == r'\left( 1;\right)')
  2480. # period decimal_separator
  2481. assert(latex([1, 2.3, 4.5], decimal_separator='period') == r'\left[ 1, \ 2.3, \ 4.5\right]' )
  2482. assert(latex(FiniteSet(1, 2.3, 4.5), decimal_separator='period') == r'\left\{1, 2.3, 4.5\right\}')
  2483. assert(latex((1, 2.3, 4.6), decimal_separator = 'period') == r'\left( 1, \ 2.3, \ 4.6\right)')
  2484. assert(latex((1,), decimal_separator='period') == r'\left( 1,\right)')
  2485. # default decimal_separator
  2486. assert(latex([1, 2.3, 4.5]) == r'\left[ 1, \ 2.3, \ 4.5\right]')
  2487. assert(latex(FiniteSet(1, 2.3, 4.5)) == r'\left\{1, 2.3, 4.5\right\}')
  2488. assert(latex((1, 2.3, 4.6)) == r'\left( 1, \ 2.3, \ 4.6\right)')
  2489. assert(latex((1,)) == r'\left( 1,\right)')
  2490. assert(latex(Mul(3.4,5.3), decimal_separator = 'comma') == r'18{,}02')
  2491. assert(latex(3.4*5.3, decimal_separator = 'comma') == r'18{,}02')
  2492. x = symbols('x')
  2493. y = symbols('y')
  2494. z = symbols('z')
  2495. assert(latex(x*5.3 + 2**y**3.4 + 4.5 + z, decimal_separator = 'comma') == r'2^{y^{3{,}4}} + 5{,}3 x + z + 4{,}5')
  2496. assert(latex(0.987, decimal_separator='comma') == r'0{,}987')
  2497. assert(latex(S(0.987), decimal_separator='comma') == r'0{,}987')
  2498. assert(latex(.3, decimal_separator='comma') == r'0{,}3')
  2499. assert(latex(S(.3), decimal_separator='comma') == r'0{,}3')
  2500. assert(latex(5.8*10**(-7), decimal_separator='comma') == r'5{,}8 \cdot 10^{-7}')
  2501. assert(latex(S(5.7)*10**(-7), decimal_separator='comma') == r'5{,}7 \cdot 10^{-7}')
  2502. assert(latex(S(5.7*10**(-7)), decimal_separator='comma') == r'5{,}7 \cdot 10^{-7}')
  2503. x = symbols('x')
  2504. assert(latex(1.2*x+3.4, decimal_separator='comma') == r'1{,}2 x + 3{,}4')
  2505. assert(latex(FiniteSet(1, 2.3, 4.5), decimal_separator='period') == r'\left\{1, 2.3, 4.5\right\}')
  2506. # Error Handling tests
  2507. raises(ValueError, lambda: latex([1,2.3,4.5], decimal_separator='non_existing_decimal_separator_in_list'))
  2508. raises(ValueError, lambda: latex(FiniteSet(1,2.3,4.5), decimal_separator='non_existing_decimal_separator_in_set'))
  2509. raises(ValueError, lambda: latex((1,2.3,4.5), decimal_separator='non_existing_decimal_separator_in_tuple'))
  2510. def test_Str():
  2511. from sympy.core.symbol import Str
  2512. assert str(Str('x')) == r'x'
  2513. def test_latex_escape():
  2514. assert latex_escape(r"~^\&%$#_{}") == "".join([
  2515. r'\textasciitilde',
  2516. r'\textasciicircum',
  2517. r'\textbackslash',
  2518. r'\&',
  2519. r'\%',
  2520. r'\$',
  2521. r'\#',
  2522. r'\_',
  2523. r'\{',
  2524. r'\}',
  2525. ])
  2526. def test_emptyPrinter():
  2527. class MyObject:
  2528. def __repr__(self):
  2529. return "<MyObject with {...}>"
  2530. # unknown objects are monospaced
  2531. assert latex(MyObject()) == r"\mathtt{\text{<MyObject with \{...\}>}}"
  2532. # even if they are nested within other objects
  2533. assert latex((MyObject(),)) == r"\left( \mathtt{\text{<MyObject with \{...\}>}},\right)"
  2534. def test_global_settings():
  2535. import inspect
  2536. # settings should be visible in the signature of `latex`
  2537. assert inspect.signature(latex).parameters['imaginary_unit'].default == r'i'
  2538. assert latex(I) == r'i'
  2539. try:
  2540. # but changing the defaults...
  2541. LatexPrinter.set_global_settings(imaginary_unit='j')
  2542. # ... should change the signature
  2543. assert inspect.signature(latex).parameters['imaginary_unit'].default == r'j'
  2544. assert latex(I) == r'j'
  2545. finally:
  2546. # there's no public API to undo this, but we need to make sure we do
  2547. # so as not to impact other tests
  2548. del LatexPrinter._global_settings['imaginary_unit']
  2549. # check we really did undo it
  2550. assert inspect.signature(latex).parameters['imaginary_unit'].default == r'i'
  2551. assert latex(I) == r'i'
  2552. def test_pickleable():
  2553. # this tests that the _PrintFunction instance is pickleable
  2554. import pickle
  2555. assert pickle.loads(pickle.dumps(latex)) is latex
  2556. def test_printing_latex_array_expressions():
  2557. assert latex(ArraySymbol("A", (2, 3, 4))) == "A"
  2558. assert latex(ArrayElement("A", (2, 1/(1-x), 0))) == "{{A}_{2, \\frac{1}{1 - x}, 0}}"
  2559. M = MatrixSymbol("M", 3, 3)
  2560. N = MatrixSymbol("N", 3, 3)
  2561. assert latex(ArrayElement(M*N, [x, 0])) == "{{\\left(M N\\right)}_{x, 0}}"
  2562. def test_Array():
  2563. arr = Array(range(10))
  2564. assert latex(arr) == r'\left[\begin{matrix}0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9\end{matrix}\right]'
  2565. arr = Array(range(11))
  2566. # fill the empty argument with a bunch of 'c' to avoid latex errors
  2567. assert latex(arr) == r'\left[\begin{array}{ccccccccccc}0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\end{array}\right]'
  2568. def test_latex_with_unevaluated():
  2569. with evaluate(False):
  2570. assert latex(a * a) == r"a a"
  2571. def test_latex_disable_split_super_sub():
  2572. assert latex(Symbol('u^a_b')) == 'u^{a}_{b}'
  2573. assert latex(Symbol('u^a_b'), disable_split_super_sub=False) == 'u^{a}_{b}'
  2574. assert latex(Symbol('u^a_b'), disable_split_super_sub=True) == 'u\\^a\\_b'