Technical reports written in R Markdown frequently incorporate mathematical symbols. R Markdown supports this requirement through the inclusion of raw LaTeX code, which is rendered by an appropriate LaTeX engine based on the desired output format. While this functionality is valuable, it presents certain challenges.
Writing LaTeX code can be cumbersome and often results in poor
readability. While newcommand can mitigate these issues, it
is underutilized in practice. This package leverages the fact that R
Markdown users are already working within the R environment, enabling
them to generate LaTeX code programmatically using familiar R
syntax.
The following example demonstrates this approach. Consider the following equation, encountered in Riemannian geometry:
\[ \frac{d}{dt} \left \langle V,W \right \rangle = \left \langle \frac{DV}{dt}, W \right \rangle + \left \langle V, \frac{DW}{dt} \right \rangle \]
The traditional LaTeX implementation would be:
\frac{d}{dt} \left \langle V,W \right \rangle = \left \langle \frac{DV}{dt}, W \right \rangle + \left \langle V, \frac{DW}{dt} \right \rangleUsing latexSymb, the same equation can be constructed
programmatically. Begin by creating objects of class
latex_symb to represent the vector fields:
## The following objects are masked from common (pos = 3):
##
## Comps, Ints, Nats, Rats, Reals, al, be, bgs, ch, comma, de, des,
## endl, ep, eq, et, f, g, ga, geq, gt, h, i, indic, infty, io, j, k,
## ka, l, la, ldots, leq, lt, m, mapsto, minus, mu, n, neq, nu, om,
## om, ph, pi, plus, ps, quad, rh, ruler, si, ta, th, thus, times, to,
## up, x, xi, y, z, ze
## The following objects are masked from common (pos = 4):
##
## Comps, Ints, Nats, Rats, Reals, al, be, bgs, ch, comma, de, des,
## endl, ep, eq, et, f, g, ga, geq, gt, h, i, indic, infty, io, j, k,
## ka, l, la, ldots, leq, lt, m, mapsto, minus, mu, n, neq, nu, om,
## om, ph, pi, plus, ps, quad, rh, ruler, si, ta, th, thus, times, to,
## up, x, xi, y, z, ze
## The following object is masked from package:base:
##
## pi
Next, define R functions to represent the mathematical operations: the inner product, the covariant derivative, and the ordinary derivative:
inner <- function(x, y) ang(lsymb(x, ",", y))
cov.der <- function(x) lsymb("D", x) / "dt"
ddt <- function(x) lsymb("d", x) / "dt"Finally, combine these elements within an equation
environment:
lenv(
"equation",
lsymb(
ddt(inner(vf1, vf2)),
eq,
inner(cov.der(vf1), vf2) + inner(vf1, cov.der(vf2))
)
) |> cat()\[\begin{equation}\frac{ d \langle V , W \rangle }{ dt } = \langle \frac{ D V }{ dt } , W \rangle + \langle V , \frac{ D W }{ dt } \rangle\end{equation}\]
Note: Use cat rather than print to prevent
the display of escaped backslashes.
This approach utilizes several key features of the
latexSymb package.
The definition of cov.der demonstrates operator
overloading in latexSymb. The / operator is
redefined such that when either argument is a latex_symb
object, it returns a new latex_symb object using the
appropriate \frac command. Similar overloading is
implemented for +, -, *, and
^ operators. The under function provides
subscript functionality.
In the numerator of cov.der, lsymb("D", x)
concatenates the string "D" with the object x,
returning a new latex_symb object.
The ang function automatically handles delimiter sizing
for angle brackets, eliminating the need for explicit \left
and \right commands. Similar functionality is provided by
br (braces), sqbr (square brackets), and
pths (parentheses).
The lenv function simplifies environment creation by
automatically generating \begin and \end
statements. The second argument accepts a list or vector where each
element represents a separate line. For example, the equation could
alternatively be formatted as:
lenv(
"align*",
c(
lsymb(ddt(inner(vf1, vf2)), "&=\\\\"),
lsymb("&=", inner(cov.der(vf1), vf2) + inner(vf1, cov.der(vf2)))
)
) |> cat()\[\begin{align*}\frac{ d \langle V , W \rangle }{ dt } &=\\&= \langle \frac{ D V }{ dt } , W \rangle + \langle V , \frac{ D W }{ dt } \rangle\end{align*}\]
The package also provides the il function, which wraps
expressions in dollar signs for inline mathematical content.
While latexSymb may not substantially reduce code volume
compared to raw LaTeX, it enhances readability and reduces error
likelihood. The package enables users to express mathematical concepts
semantically rather than syntactically.
The package is not restricted to R Markdown and may be particularly
well-suited for .Rtex documents. It is compatible with any
format supported by knitr.
For complex equations, R’s pipe operator can further enhance code organization and readability.