将Markdown的斜体和粗体转换为LaTeX

4
我想要能够即时地将Markdown的斜体和粗体转换为LaTeX版本(即输入文本字符串,返回文本字符串)。我以为很容易。错了!(也许还是很容易的)。请参见下面我尝试的愚蠢业务和错误。
我有什么(注意起始星号已被转义为Markdown):
x <- "\\*note: I *like* chocolate **milk** too ***much***!"

我想要的是:
"*note: I \\emph{like} chocolate \\textbf{milk} too \\textbf{\\emph{much}}!"

我不依赖于正则表达式,但更喜欢基础解决方案(虽然不是必需的)。
愚蠢的事情:
helper <- function(ins, outs, x) {
    gsub(paste0(ins[1], ".+?", ins[2]), paste0(outs[1], ".+?", outs[2]), x)
}

helper(rep("***", 2), c("\\textbf{\\emph{", "}}"), x)

Error in gsub(paste0(ins[1], ".+?", ins[2]), paste0(outs[1], ".+?", outs[2]),  : 
  invalid regular expression '***.+?***', reason 'Invalid use of repetition operators'

我有一件玩具this toy,是Ananda Mahto帮我制作的,如果有帮助的话。你可以通过报告访问它,方法是:wheresPandoc <- reports:::wheresPandoc

编辑 根据Ben的意见,我尝试了:

action <- paste0(" echo ", x, " | ", wheresPandoc(), " -t latex ") 
system(action)

*note: I *like* chocolate **milk** too ***much***! | C:\PROGRA~2\Pandoc\bin\pandoc.exe -t latex

编辑2 根据Dason的评论,我试过了:
out <- paste("echo", shQuote(x), "|", wheresPandoc(), " -t latex"); system(out)
system(out, intern = T)

> system(out, intern = T)
\*note: I *like* chocolate **milk** too ***much***! | C:\PROGRA~2\Pandoc\bin\pandoc.exe -t latex

6
不知道上下文,但:有没有可能使用Pandoc将Markdown渲染为LaTeX? echo '\ *note:我也***非常喜欢***巧克力**牛奶**!' | pandoc -t latex - Ben Bolker
我曾考虑过这个问题(可能使用 pander),但似乎对于偶尔转换字符串来说有些大材小用了(就像用火箭筒打蚊子)。也许这是可行的方法。此外,它需要一个外部文件并重新读取(我认为,但可能是错误的)。 - Tyler Rinker
@TylerRinker 你不需要写入外部文件 - 你只需要正确使用命令行即可。 - Dason
out <- paste("echo", shQuote(x), "| pandoc -t latex"); ans <- system(out, intern = T) - Dason
2
pander有一个名为Pandoc.convert的函数,就是死活搞不明白如何设置它不返回完整的LaTeX文档。 - mnel
我使用的是Windows机器,这可能会使它变得困难。另外,在实际的Windows命令行中,上面out的输出结果是符合预期的。 - Tyler Rinker
2个回答

4

在Windows上缺少管道使得这变得棘手,但您可以使用input提供stdin来解决这个问题:

> x = system("pandoc -t latex", intern=TRUE, input="\\*note: I *like* chocolate **milk** too ***much***!")
> x
[1] "*note: I \\emph{like} chocolate \\textbf{milk} too \\textbf{\\emph{much}}!"

工作得很好,但我还是更喜欢system2。感谢您推动答案的进展。 - Tyler Rinker

3

注意,我正在使用Windows系统并从?system工作。

这意味着重定向、管道、DOS内部命令等都无法使用。

另外需要注意的是来自?system2的信息:

注意

system2是比system更便携和灵活的接口,自R 2.12.0引入以来,它允许在Windows上重定向输出而无需调用shell,在执行命令时以可移植的方式设置环境变量,并对stdout和stderr的重定向进行更精细的控制。相反,system(和Windows上的shell)允许调用任意命令行。因此建议使用system2

system2('pandoc', '-t latex', input = '**em**', stdout = TRUE)

我将在报告包中包含这项工作,并希望将署名归功于你。如果您不通过电子邮件告诉我正确的使用名称,我将使用stackoverflow.com的mnel。 - Tyler Rinker
抱歉,我认为您会去找报告包;不想大肆表现 :) tyler.rinker@gmail.com - Tyler Rinker
@TylerRinker -- 我的意思是在你的收件箱里 -- 我可以找到你的电子邮件 :) - mnel
哦 :) 明白了(在此插入一个愚蠢的评论)。 - Tyler Rinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接