创建专门的 \Sexpr 函数版本

Creation of especialized \Sexpr function version

我正在使用 exams 包生成一些考试(工程学)。我的源文件是 Rnw 格式,所以底层引擎是 Sweave。

在 R 端,我正在使用 units 包(检查维度的正确性)并且我创建了一个函数(称为 units2tex)将量级从单位转换为 LaTeX 等价物。所以,当我计算一个变量时,我必须为 LaTeX 创建一个副本:

<<>>=
R = set_units(1,ohm)
I = set_units(1,A)
V = R*I

R_tex = units2tex(R)
I_tex = units2tex(I)
#V_tex = units2tex(V)

@

For $R = \Sexpr{R_tex}$, the answer is \Sexpr{units2tex(V)}.

在这两种情况下(打印 RV)我必须在某处显式调用 units2tex 函数。这是很多输入(输入更多,错误的地方更多),因为有很多步骤和中间时间值。

是否可以轻松创建带有自动函数调用的 \Sexpr 版本?

更具体地说:

在两种情况下都使用原来的\Sexpr.

我目前的选择及其缺点:

所以,最好的方法是:是否可以创建 \Sexpr 的变体?

完整示例: 文件:“question.Rnw”

\usepackage[utf8]{inputenc}
\usepackage[OT1]{fontenc}

<<echo=FALSE, results=hide>>=
library(units)

units2tex <- function(x) {
# this function is not important here. Simplified version the original version much complex
paste0(x,deparse_unit(x))
}

@


\begin{question}

<<echo=FALSE, results=hide>>=

In <- set_units(1e-3,A)
Pn <- set_units(sample(c(2,1,0.5,0.25,0.125),1),W)

In_tex <- units2tex(In)
Pn_tex <- units2tex(Pn)

@

A resistor nah nah nah current $I_n=\Sexpr{In_tex}$ nah, nah, nah $P_n=\Sexpr{Pn_tex}$

What is V?

<<echo=FALSE, results=hide>>=
Vn <- set_units(Pn/In,V)
Vn_tex <- units2tex(Vn) 
@

\begin{answerlist}
  \item $V = \Sexpr{Vn_tex}$
  \item $V = \Sexpr{Pn_tex}$
  \item $V = \Sexpr{In_tex}$
\end{answerlist}    
\end{question}

\begin{solution}

To calculate $V$, we do $V= P_n/I_n = \frac{\Sexpr{Pn_tex}}{\Sexpr{In_tex}} = \Sexpr{Vn_tex}$
\begin{answerlist}
  \item Ok
  \item Bad
  \item Wrong
\end{answerlist}    
\end{solution}

\exname{question1}
\extype{schoice}
\exsolution{100}
\exshuffle{TRUE}

并编译:

library(exams)
exams2html(c("question1.Rnw"), encoding="utf-8",template='plain8.html',mathjax = TRUE)

减少命名空间污染:

a <- list(t=function(x){units2tex(x)},d=function(x){units2tex(x,digits=2)})

以后 \Sexpr{a$t(V)}

它几乎比 \Sexpr{V_tex} 短,但我不必定义 V_tex

在 Rnw 练习中,通过显式调用 as.character()\Sexpr{} 的内容转换为字符。由于这是一个通用函数,您可以轻松定义自己的方法,例如,

as.character.units <- function(x, ...) units2tex(x, ...)

然后只需使用 \Sexpr{V} 即可在后台自动调用您的 units2tex() 函数。

请注意,这同样不适用于 Rmd 练习。所以我想混合 Rnw 和 Rmd 练习,然后使用如下所示的快捷函数名称可能会更好:

u2t <- function(x, ...) units2tex(x, ...)

这需要分别称为 \Sexpr{u2t(V)}`r u2t(V)`