diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 5de4957a..b092edd7 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1077,14 +1077,14 @@ else "use_default" end -const _gr_wstype = Ref(get(ENV, "GKS_WSTYPE", _gr_wstype_default)) +const _gr_wstype = Ref(get(ENV, "GKSwstype", _gr_wstype_default)) gr_set_output(wstype::String) = (_gr_wstype[] = wstype) for (mime, fmt) in _gr_mimeformats @eval function _show(io::IO, ::MIME{Symbol($mime)}, plt::Plot{GRBackend}) GR.emergencyclosegks() filepath = tempname() * "." * $fmt - ENV["GKS_WSTYPE"] = $fmt + ENV["GKSwstype"] = $fmt ENV["GKS_FILEPATH"] = filepath gr_display(plt) GR.emergencyclosegks() @@ -1097,7 +1097,7 @@ function _display(plt::Plot{GRBackend}) if plt[:display_type] == :inline GR.emergencyclosegks() filepath = tempname() * ".pdf" - ENV["GKS_WSTYPE"] = "pdf" + ENV["GKSwstype"] = "pdf" ENV["GKS_FILEPATH"] = filepath gr_display(plt) GR.emergencyclosegks() @@ -1107,7 +1107,7 @@ function _display(plt::Plot{GRBackend}) else ENV["GKS_DOUBLE_BUF"] = true if _gr_wstype[] != "use_default" - ENV["GKS_WSTYPE"] = _gr_wstype[] + ENV["GKSwstype"] = _gr_wstype[] end gr_display(plt) end diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl index 0eb97fd8..b42e8629 100644 --- a/src/backends/pgfplots.jl +++ b/src/backends/pgfplots.jl @@ -314,12 +314,18 @@ function _show(io::IO, mime::MIME"application/pdf", plt::Plot{PGFPlotsBackend}) PGFPlots.save(PGFPlots.PDF(fn), pgfplt) # read it into io - write(io, readall(open(fn))) + write(io, readstring(open(fn))) # cleanup PGFPlots.cleanup(plt.o) end +function _show(io::IO, mime::MIME"application/x-tex", plt::Plot{PGFPlotsBackend}) + fn = tempname()*".tex" + PGFPlots.save(fn, backend_object(plt), include_preamble=false) + write(io, readstring(open(fn))) +end + function _display(plt::Plot{PGFPlotsBackend}) # prepare the object pgfplt = PGFPlots.plot(plt.o) diff --git a/src/components.jl b/src/components.jl index 73c62f50..bbb2f9c2 100644 --- a/src/components.jl +++ b/src/components.jl @@ -248,7 +248,7 @@ end function font(args...) # defaults - family = "Helvetica" + family = "sans-serif" pointsize = 14 halign = :hcenter valign = :vcenter diff --git a/src/output.jl b/src/output.jl index ff4a1def..ee9972ab 100644 --- a/src/output.jl +++ b/src/output.jl @@ -154,6 +154,7 @@ const _mimeformats = Dict( "application/postscript" => "ps", "image/svg+xml" => "svg", "text/plain" => "txt", + "application/x-tex" => "tex", ) const _best_html_output_type = KW( diff --git a/src/series.jl b/src/series.jl index 69a36ea8..02e9eca2 100644 --- a/src/series.jl +++ b/src/series.jl @@ -6,7 +6,7 @@ # This should cut down on boilerplate code and allow more focused dispatch on type # note: returns meta information... mainly for use with automatic labeling from DataFrames for now -typealias FuncOrFuncs Union{Function, AVec{Function}} +typealias FuncOrFuncs{F} Union{F, Vector{F}, Matrix{F}} all3D(d::KW) = trueOrAllTrue(st -> st in (:contour, :contourf, :heatmap, :surface, :wireframe, :contour3d, :image), get(d, :seriestype, :none)) @@ -96,8 +96,8 @@ nobigs(v) = v end # not allowed -compute_xyz(x::Void, y::FuncOrFuncs, z) = error("If you want to plot the function `$y`, you need to define the x values!") -compute_xyz(x::Void, y::Void, z::FuncOrFuncs) = error("If you want to plot the function `$z`, you need to define x and y values!") +compute_xyz{F<:Function}(x::Void, y::FuncOrFuncs{F}, z) = error("If you want to plot the function `$y`, you need to define the x values!") +compute_xyz{F<:Function}(x::Void, y::Void, z::FuncOrFuncs{F}) = error("If you want to plot the function `$z`, you need to define x and y values!") compute_xyz(x::Void, y::Void, z::Void) = error("x/y/z are all nothing!") # -------------------------------------------------------------------- @@ -341,7 +341,7 @@ end # function without range... use the current range of the x-axis -@recipe function f(f::FuncOrFuncs) +@recipe function f{F<:Function}(f::FuncOrFuncs{F}) plt = d[:plot_object] xmin, xmax = try axis_limits(plt[1][:xaxis]) @@ -360,8 +360,9 @@ end # # if functions come first, just swap the order (not to be confused with parametric functions... # # as there would be more than one function passed in) -@recipe function f(f::FuncOrFuncs, x) - @assert !(typeof(x) <: FuncOrFuncs) # otherwise we'd hit infinite recursion here +@recipe function f{F<:Function}(f::FuncOrFuncs{F}, x) + F2 = typeof(x) + @assert !(F2 <: Function || (F2 <: AbstractArray && F2.parameters[1] <: Function)) # otherwise we'd hit infinite recursion here x, f end @@ -420,19 +421,23 @@ end # # # special handling... xmin/xmax with parametric function(s) -@recipe function f(f::FuncOrFuncs, xmin::Number, xmax::Number) +@recipe function f(f::Function, xmin::Number, xmax::Number) xs = adapted_grid(f, (xmin, xmax)) xs, f end -@recipe f(fx::FuncOrFuncs, fy::FuncOrFuncs, u::AVec) = mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u) -@recipe f(fx::FuncOrFuncs, fy::FuncOrFuncs, umin::Number, umax::Number, n = 200) = fx, fy, linspace(umin, umax, n) +@recipe function f{F<:Function}(fs::AbstractArray{F}, xmin::Number, xmax::Number) + xs = Any[adapted_grid(f, (xmin, xmax)) for f in fs] + xs, fs +end +@recipe f{F<:Function,G<:Function}(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, u::AVec) = mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u) +@recipe f{F<:Function,G<:Function}(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, umin::Number, umax::Number, n = 200) = fx, fy, linspace(umin, umax, n) # # # special handling... 3D parametric function(s) -@recipe function f(fx::FuncOrFuncs, fy::FuncOrFuncs, fz::FuncOrFuncs, u::AVec) +@recipe function f{F<:Function,G<:Function,H<:Function}(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, fz::FuncOrFuncs{H}, u::AVec) mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u), mapFuncOrFuncs(fz, u) end -@recipe function f(fx::FuncOrFuncs, fy::FuncOrFuncs, fz::FuncOrFuncs, umin::Number, umax::Number, numPoints = 200) +@recipe function f{F<:Function,G<:Function,H<:Function}(fx::FuncOrFuncs{F}, fy::FuncOrFuncs{G}, fz::FuncOrFuncs{H}, umin::Number, umax::Number, numPoints = 200) fx, fy, fz, linspace(umin, umax, numPoints) end diff --git a/src/utils.jl b/src/utils.jl index 7c2af0fd..da1d1cb6 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -265,7 +265,7 @@ maketuple(x::Real) = (x,x) maketuple{T,S}(x::Tuple{T,S}) = x mapFuncOrFuncs(f::Function, u::AVec) = map(f, u) -mapFuncOrFuncs(fs::AVec{Function}, u::AVec) = [map(f, u) for f in fs] +mapFuncOrFuncs{F<:Function}(fs::AVec{F}, u::AVec) = [map(f, u) for f in fs] unzip{X,Y}(xy::AVec{Tuple{X,Y}}) = [t[1] for t in xy], [t[2] for t in xy] unzip{X,Y,Z}(xyz::AVec{Tuple{X,Y,Z}}) = [t[1] for t in xyz], [t[2] for t in xyz], [t[3] for t in xyz]