diff --git a/src/LaTeXStrings.jl b/src/LaTeXStrings.jl index 06ceeae..e0ed58c 100644 --- a/src/LaTeXStrings.jl +++ b/src/LaTeXStrings.jl @@ -6,7 +6,7 @@ in supporting environments like IJulia. See in particular the `LaTeXString` type and the `L"..."` constructor macro. """ module LaTeXStrings -export LaTeXString, latexstring, @L_str +export LaTeXString, latexstring, @L_str, latexescape # IJulia supports LaTeX output for any object with a text/latex # writemime method, but these are annoying to type as string literals @@ -133,4 +133,33 @@ Base.match(re::Regex, s::LaTeXString, idx::Integer, add_opts::UInt32=UInt32(0)) Base.findnext(re::Regex, s::LaTeXString, idx::Integer) = findnext(re, s.s, idx) Base.eachmatch(re::Regex, s::LaTeXString; overlap = false) = eachmatch(re, s.s; overlap=overlap) +const LATEX_ESCAPE_SUB_TABLE = Pair{String,String}[ + raw"\\" => raw"\textbackslash{}", + raw"&" => raw"\&", + raw"%" => raw"\%", + raw"$" => raw"\$", + raw"#" => raw"\#", + raw"_" => raw"\_", + raw"{" => raw"\{", + raw"}" => raw"\}", + raw"~" => raw"\textasciitilde{}", + raw"^" => raw"\^{}", + raw"<" => raw"\textless{}", + raw">" => raw"\textgreater{}", +] + +@doc raw""" + latexscape(s::AbstractString) + +This function escapes common text so it can be included directly into ``\TeX`` code[^so16259923]. + +## References + +[^so16259923]: + Stack Overflow: ["How can I escape LaTeX special characters inside django templates?"](https://stackoverflow.com/questions/16259923) +""" +function latexescape(s::AbstractString) + return replace(s, LATEX_ESCAPE_SUB_TABLE...) +end + end # module diff --git a/test/runtests.jl b/test/runtests.jl index 7ac399c..b529bd8 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -84,6 +84,10 @@ end @test tst1[OneTo(5)] == tst1[1:5] end +@testset "escaping" begin + @test latexescape(raw"A\&%$#_{}~^<>z") == raw"A\textbackslash{}\&\%\$\#\_\{\}\textasciitilde{}\^{}\textless{}\textgreater{}z" +end + using Documenter DocMeta.setdocmeta!(LaTeXStrings, :DocTestSetup, :(using LaTeXStrings); recursive=true) doctest(LaTeXStrings; manual = false)