diff --git a/src/show.jl b/src/show.jl index e909f088..c7cd0047 100644 --- a/src/show.jl +++ b/src/show.jl @@ -1,12 +1,27 @@ -Base.print(io::IO, v::AbstractPolynomialLike) = show(io, MIME"text/print"(), v) +function Base.show(io::IO, mime::MIME"text/latex", + p::Union{AbstractPolynomialLike, RationalPoly}) + print(io, "\$\$ ") + _show(io, mime, p) + print(io, " \$\$") +end -# VARIABLES -Base.show(io::IO, v::AbstractVariable) = print_var(io, MIME"text/plain"(), v) -Base.show(io::IO, mime::MIME"text/plain", v::AbstractVariable) = print_var(io, mime, v) -Base.show(io::IO, mime::MIME"text/latex", v::AbstractVariable) = print_var(io, mime, v) -Base.show(io::IO, mime::MIME"text/print", v::AbstractVariable) = print_var(io, mime, v) +# If the MIME is not specified, IJulia thinks that it supports images, ... +# and then use the result of show and tries to interpret it as an svg, ... +# We need the two methods to avoid ambiguity +function Base.show(io::IO, mime::MIME"text/plain", + p::Union{AbstractPolynomialLike, RationalPoly}) + _show(io, mime, p) +end +function Base.show(io::IO, mime::MIME"text/print", + p::Union{AbstractPolynomialLike, RationalPoly}) + _show(io, mime, p) +end -function print_var(io::IO, mime::MIME, var::AbstractVariable) +Base.print(io::IO, p::Union{AbstractPolynomialLike, RationalPoly}) = show(io, MIME"text/print"(), p) +Base.show(io::IO, p::Union{AbstractPolynomialLike, RationalPoly}) = show(io, MIME"text/plain"(), p) + +# VARIABLES +function _show(io::IO, mime::MIME, var::AbstractVariable) base, indices = name_base_indices(var) if isempty(indices) print(io, base) @@ -15,7 +30,7 @@ function print_var(io::IO, mime::MIME, var::AbstractVariable) print_subscript(io, mime, indices) end end -print_var(io::IO, mime::MIME"text/print", var::AbstractVariable) = print(io, name(var)) +_show(io::IO, mime::MIME"text/print", var::AbstractVariable) = print(io, name(var)) function print_subscript(io::IO, ::MIME"text/latex", index) print(io, "_{", join(index, ","), "}") @@ -32,13 +47,7 @@ const unicode_subscripts = ("₀","₁","₂","₃","₄","₅","₆","₇","₈ unicode_subscript(i) = join(unicode_subscripts[d+1] for d in reverse(digits(i))) # MONOMIALS - -Base.show(io::IO, mime::MIME"text/latex", m::AbstractMonomial) = print_monomial(io, mime, m) -Base.show(io::IO, mime::MIME"text/plain", m::AbstractMonomial) = print_monomial(io, mime, m) -Base.show(io::IO, mime::MIME"text/print", m::AbstractMonomial) = print_monomial(io, mime, m) -Base.show(io::IO, m::AbstractMonomial) = print_monomial(io, MIME"text/plain"(), m) - -function print_monomial(io::IO, mime, m::AbstractMonomial) +function _show(io::IO, mime, m::AbstractMonomial) if isconstant(m) print(io, '1') else @@ -50,7 +59,7 @@ function print_monomial(io::IO, mime, m::AbstractMonomial) if mime isa MIME"text/print" && printed_var && i > 0 && print(io,"*") end - print_var(io, mime, var) + _show(io, mime, var) printed_var = true if !isone(exp) print_exponent(io, mime, exp) @@ -59,7 +68,7 @@ function print_monomial(io::IO, mime, m::AbstractMonomial) end end end -# + print_exponent(io::IO, ::MIME"text/latex", exp) = print(io, "^{", exp, "}") print_exponent(io::IO, ::MIME"text/print", exp) = print(io, "^", exp) function print_exponent(io::IO, mime, exp) @@ -70,13 +79,7 @@ const unicode_superscripts = ("⁰","¹","²","³","⁴","⁵","⁶","⁷","⁸" unicode_superscript(i) = unicode_superscripts[i+1] # TERM - -Base.show(io::IO, t::AbstractTerm) = print_term(io, MIME"text/plain"(), t) -Base.show(io::IO, mime::MIME"text/latex", t::AbstractTerm) = print_term(io, mime, t) -Base.show(io::IO, mime::MIME"text/plain", t::AbstractTerm) = print_term(io, mime, t) -Base.show(io::IO, mime::MIME"text/print", t::AbstractTerm) = print_term(io, mime, t) - -function print_term(io::IO, mime, t::AbstractTerm) +function _show(io::IO, mime, t::AbstractTerm) if isconstant(t) print_coefficient(io, coefficient(t)) else @@ -93,7 +96,7 @@ function print_term(io::IO, mime, t::AbstractTerm) end end if !iszero(t) - show(io, mime, monomial(t)) + _show(io, mime, monomial(t)) end end end @@ -112,25 +115,19 @@ print_coefficient(io::IO, coeff::Real) = print(io, coeff) print_coefficient(io::IO, coeff) = print(io, "(", coeff, ")") # POLYNOMIAL - -Base.show(io::IO, t::AbstractPolynomial) = print_poly(io, MIME"text/plain"(), t) -Base.show(io::IO, mime::MIME"text/plain", t::AbstractPolynomial) = print_poly(io, mime, t) -Base.show(io::IO, mime::MIME"text/latex", t::AbstractPolynomial) = print_poly(io, mime, t) -Base.show(io::IO, mime::MIME"text/print", t::AbstractPolynomial) = print_poly(io, mime, t) - -function print_poly(io::IO, mime, p::AbstractPolynomial{T}) where T +function _show(io::IO, mime, p::AbstractPolynomial{T}) where T ts = terms(p) if isempty(ts) print(io, zero(T)) else - print_term(io, mime, first(ts)) + _show(io, mime, first(ts)) for t in Iterators.drop(ts, 1) if isnegative(coefficient(t)) print(io, " - ") - show(io, mime, abs(coefficient(t)) * monomial(t)) + _show(io, mime, abs(coefficient(t)) * monomial(t)) else print(io, " + ") - show(io, mime, t) + _show(io, mime, t) end end end @@ -140,16 +137,10 @@ isnegative(x::Real) = x < 0 isnegative(x) = false # RATIONAL POLY - -Base.show(io::IO, t::RationalPoly) = print_ratpoly(io, MIME"text/plain"(), t) -Base.show(io::IO, mime::MIME"text/plain", t::RationalPoly) = print_ratpoly(io, mime, t) -Base.show(io::IO, mime::MIME"text/latex", t::RationalPoly) = print_ratpoly(io, mime, t) -Base.show(io::IO, mime::MIME"text/print", t::RationalPoly) = print_ratpoly(io, mime, t) - -function print_ratpoly(io::IO, mime, p::RationalPoly) - print(io, "(") - show(io, mime, p.num) - print(io, ") / (") - show(io, mime, p.den) - print(io, ")") +function _show(io::IO, mime, p::RationalPoly) + print(io, mime isa MIME"text/latex" ? "\\frac{" : "(") + _show(io, mime, p.num) + print(io, mime isa MIME"text/latex" ? "}{" : ") / (") + _show(io, mime, p.den) + print(io, mime isa MIME"text/latex" ? "}" : ")") end diff --git a/test/show.jl b/test/show.jl index adaedb9b..7065082a 100644 --- a/test/show.jl +++ b/test/show.jl @@ -28,10 +28,11 @@ Mod.@polyvar x[0:9] @test sprint(show, sum(i*x[i]^i for i=1:10)) == "10x₉¹⁰ + 9x₈⁹ + 8x₇⁸ + 7x₆⁷ + 6x₅⁶ + 5x₄⁵ + 4x₃⁴ + 3x₂³ + 2x₁² + x₀" - @test sprint(show, "text/latex", sum(i*x[i]^i for i=1:10)) == "10x_{9}^{10} + 9x_{8}^{9} + 8x_{7}^{8} + 7x_{6}^{7} + 6x_{5}^{6} + 5x_{4}^{5} + 4x_{3}^{4} + 3x_{2}^{3} + 2x_{1}^{2} + x_{0}" + @test sprint(show, "text/latex", sum(i*x[i]^i for i=1:10)) == "\$\$ 10x_{9}^{10} + 9x_{8}^{9} + 8x_{7}^{8} + 7x_{6}^{7} + 6x_{5}^{6} + 5x_{4}^{5} + 4x_{3}^{4} + 3x_{2}^{3} + 2x_{1}^{2} + x_{0} \$\$" + @test sprint(show, "text/latex", (x[2] + 1) / x[3]^2) == "\$\$ \\frac{x_{1} + 1}{x_{2}^{2}} \$\$" Mod.@polyvar x[1:11] - @test sprint(show, "text/latex", x[10]) == "x_{10}" + @test sprint(show, "text/latex", x[10]) == "\$\$ x_{10} \$\$" @test sprint(show, x[10]) == "x₁₀" @test sprint(print, 2x[1]^2+3x[3]+1+x[4]) == "2*x[1]^2 + 3*x[3] + x[4] + 1"