Markdown 在[R]标记数学表达式中为HTML输出插入不间断空格
我正在用bookdown写科学报告,我想用s作为后面的数千个分隔符 <>实际上,我更喜欢非破坏性(<代码> u+202f /<代码>和8239,),但为了简单,我们在这里考虑<代码> U+00 A0< /代码> /<代码> <代码>。 我设置了一个Markdown 在[R]标记数学表达式中为HTML输出插入不间断空格,markdown,r-markdown,pandoc,mathjax,bookdown,Markdown,R Markdown,Pandoc,Mathjax,Bookdown,我正在用bookdown写科学报告,我想用s作为后面的数千个分隔符 实际上,我更喜欢非破坏性( u+202f /和8239,),但为了简单,我们在这里考虑 U+00 A0< /代码> / 。 我设置了一个knitrhook来动态执行此操作: knitr::knit_hooks$set(内联=函数(输出) ifelse(是数字的(输出), prettyNum(四舍五入(输出,1), 大。马克=“”), 输出量) 只要我不在数学表达式中使用任何返回数值输出>999的内联R表达式,这就可以正常工作
knitr
hook来动态执行此操作:
knitr::knit_hooks$set(内联=函数(输出)
ifelse(是数字的(输出),
prettyNum(四舍五入(输出,1),
大。马克=“”),
输出量)
只要我不在数学表达式中使用任何返回数值输出>999的内联R表达式,这就可以正常工作
以下bookdown MWE说明了该问题:
---
输出:
bookdown::html_document2:默认值
---
```{r set输出挂钩,include=FALSE}
knitr::knit_hooks$set(内联=函数(输出)
ifelse(是数字的(输出),
prettyNum(四舍五入(输出,1),
大。马克=“”),
输出量)
```
这项工作:
$\pi$和'r 1000'的乘积是'r pi*1000'。
这无法呈现:
$\pi\cdot`r 1000`=`r pi*1000`$
这是一种渲染,但很麻烦,因为它需要我知道“先验”是什么
值可能超过999:
$\pi\cdot1000=`r as.character(圆形(pi*1000,1))`$
我试图找到它,并得出以下rmarkdown MWE:
---
output:
rmarkdown::html_document:
keep_md: true
---
| Rmarkdown | Render | HTML | Markdown |
|--------------|------------|-----------------------------------------------------|--------------|
| `1000` | 1000 |`1000` | `1000` |
|`$1000$` |$1000$ |`<span class="math inline">\(1000\)</span>` |`$1000$` |
| | | | |
| `100,0` | 100,0 |`100,0` | `100,0` |
|`$100,0$` |$100,0$ |`<span class="math inline">\(100,0\)</span>` |`$100,0$` |
| | | | |
| `100 0` | 100 0 |`100 0` | `100 0` |
|`$100 0$` |$100 0$ |`<span class="math inline">\(100 0\)</span>` |`$100 0$` |
| | | | |
| `100 0`| 100 0 |`100 0` | `100 0` |
|`$100 0$`|$100 0$|`<span class="math inline">\(100&nbsp;0\)</span>`|`$100 0$`|
所以从我能告诉你的
- 我只是提到了bookdown,因为我很高兴有专门的bookdown工作
- 我只是提到rmarkdown,因为我很乐意了解rmarkdown的具体工作
&
替换为&代码>,我不希望它正确呈现。
- 无论如何,我会很高兴与MathJax相关的工作
取代了&
代码>在代码和数学上下文中,但不在文本上下文中。
- 我确信,如果有办法说服pandoc不要这样做,那么通过rmarkdown YAML头配置它就很容易了
从Markdown逐字转换为HTML的任何想法都可能有助于我理解其余部分
附录: 截至,
$100 0$
无效。
但是,手动修改HTML以包含\(100 0\)
的效果与之前一样好。
由于我不关心通过LaTex输出的PDF,这意味着不将
$100 0$
转换为\(100 ;0\)
,而是转换为\(100 0\)
(正如100 0
也不转换为100 ;0
)我只需要将标记转换为HTML即可。Pandoc希望数学环境包含LaTeX数学标记,而不是HTML。转换失败,因为pandoc试图将$100000$
输出为LaTeX,但这会导致\(100000\)
,而不是您想要的结果
作为一种解决方案,您可以尝试使用文本窄无中断空间unicode字符“ 代码>”在钩子中
或者,可以使用a(或可能是a)强制pandoc不改变地通过数学内容:
-- filename: force plain math
function Math (el)
if el.mathtype == 'DisplayMath' then
return pandoc.RawInline('html', '\\[' .. el.text .. '\\]')
else -- InlineMath
return pandoc.RawInline('html', '\\(' .. el.text .. '\\)')
end
end
保存到文件并通过添加
output:
bookdown::html_document2:
pandoc_args: --lua-filter=force-plain-math.lua
到您的文档。谢谢您的回复。我在问题中补充了我对你第一段的想法。关于第二段中的第一个建议,你能给我一个关于如何实际实现的代码示例吗?这会通过单独的knitr
hook来完成吗?或者使用一个单一的pandoc功能,根据目标格式使用不同的文本?我将改进我的答案,稍后用更好的内容替换它。我意识到我误解了你问题的某些部分,忘记了knitr钩子是如何工作的。Thx,+1+作为字面
似乎在我的情况下起作用。我必须检查MathJax是否也能处理窄版本。过滤器解决方案看起来也很有希望,但我无法测试它,因为这似乎需要pandoc>=2.0,而我现在没有任何一个系统可以测试它。只是一个快速更新:我使用和apt get install-f./pandoc-2.1-1-amd64.deb
在我的Ubuntu 16.04机器上安装了pandoc 2.1。在上面我的MWE的YAML头中添加了一个(现在是必需的)title:test
之后,我也可以成功地使用您的lua过滤器。
output:
bookdown::html_document2:
pandoc_args: --lua-filter=force-plain-math.lua