Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 38 additions & 47 deletions src/show.jl
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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, ","), "}")
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
5 changes: 3 additions & 2 deletions test/show.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down