Markdown 在[R]标记数学表达式中为HTML输出插入不间断空格

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表达式,这就可以正常工作

我正在用bookdown写科学报告,我想用s作为后面的数千个分隔符

<>实际上,我更喜欢非破坏性(<代码> u+202f /<代码>和8239,),但为了简单,我们在这里考虑<代码> U+00 A0< /代码> /<代码> <代码>。 我设置了一个
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&nbsp;0`| 100&nbsp;0 |`100 0`                                              | `100&nbsp;0` |
|`$100&nbsp;0$`|$100&nbsp;0$|`<span class="math inline">\(100&amp;nbsp;0\)</span>`|`$100&nbsp;0$`|
所以从我能告诉你的

  • 这不是一个登记问题,因为它可以通过普通的rmarkdown复制。
    • 我只是提到了bookdown,因为我很高兴有专门的bookdown工作
  • 这不是rmarkdown问题,因为生成的Markdown看起来与我预期的完全一样。
    • 我只是提到rmarkdown,因为我很乐意了解rmarkdown的具体工作
  • 这不是MathJax的问题,因为HTML代码将普通的
    &
    替换为
    &,我不希望它正确呈现。
    
    • 无论如何,我会很高兴与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