I’m trying to write LaTeX (which I’m sure most of you know involves a lot of backslashes, e.g. \dfrac{3}{5}
to create a fraction with numerator 3 and denominator 5) to a text file. By a DuckDuckGo search I found that sed isn’t very LaTeX friendly in itself, so to insert that example piece of LaTeX to say line 19 I’d need to run:
sed -i "19i\\\dfrac{3}{5}" file.tex
I’ve tried using run
to run this command in Julia (i.e. I’ve run:
run(`sed -i "19i\\\dfrac{3}{5}" file.tex`)
, and what I get is: dfrac{3}{5}
being added to line 19 of file.tex. I’ve tried with fewer backslashes (1 backslash and 2 backslashes have been tried) and it doesn’t fix this error.
Is there a way around this issue?
There’s a package called latexstrings.jl that help you with this.
2 Likes
My best guess would be that for sed
to output a \
, the slash needs to be escaped, with an extra '', but you need to escape each of those \
s in your julia string, for a total of 4.
I’ve looked at the usage info and I’m guessing using:
string = L"\\dfrac{3}{2}"
run(`sed -i "19i $string" file.tex`)
is what you had in mind. While for this case, this works as this is meant to be in an equation and doing this causes $\dfrac{3}{2}$
to be added to file.tex, but not all the LaTeX I want to add will be inline equations, so it doesn’t seem like this is a general solution unless I’m wrong in my usage of it.
Tried four backslashes before dfrac
and I get the same result.
@simeonschaub provided me with a general solution to this problem at Write to a particular line in a file. Here’s the function I’m going to use to edit my LaTeX file and insert my LaTeX code (contained within string
):
function skiplines(io::IO, n)
i = 1
while i <= n
eof(io) && error("File contains less than $n lines")
i += read(io, Char) === '\n'
end
end
function insertLine(file::String, string::String, lineNr::Integer)
f = open(file, "r+");
skiplines(f, lineNr);
skip(f, -1)
mark(f)
buf = IOBuffer()
write(buf, f)
seekstart(buf)
reset(f)
print(f, string);
write(f, buf)
close(f)
end
For the aforementioned example I’d use the code:
insertLine("file.tex", "\\dfrac{3}{2}", 19)
to call this function.
1 Like
Perhaps if you provided some context, you could get a more general solution.
Usually, LaTeX and similar output is easiest to generate from Julia, instead of replacing strings in existing files. You can use a some kind of template for this, or alternatively just write out a tiny snippet like
\dfrac{3}{2}
into a file and \input
it in your LaTeX source.