r - 双语 Rmarkdown -> LaTeX 文档的自动对齐文本

标签 r latex r-markdown pandoc xelatex

已更新。见下文。

我正在编写一份双语报告。即使用阿拉伯语和英语。使用 xelatex 引擎、mainfont: Ariallang: ar YAML 元数据,文档可以流畅地呈现阿拉伯语和英语(在 hustle 之后) ).

如何在 Rmarkdown -> LaTeX 文档中自动对齐文本?

问题是:lang 变量中选择的语言是从右到左对齐的,因此整个文档都遵循这种对齐方式。每当我想插入英文段落时,我都必须使用 [text]{dir="ltr"}。有没有办法根据使用的语言自动对齐段落?任何 LaTeX 包或 Pandoc/Rmarkdown 技巧都可以这样做吗?序言中的纯 LaTeX?

附录 - reprex(旧)

如果你需要,下面的代码就是你重现问题所需要的。

---
output:
  pdf_document:
    latex_engine: xelatex
mainfont: Arial
lang: ar
---

بسم الله الرحمن الرحيم

This text is mis-aligned in rendered document.

[This text is well-aligned in rendered document.]{dir="ltr"}

更新

以下更新是合并@tarleb 友情提供的 Lua 过滤器。

底线是:

  • 在使用 Lua 过滤器之前,阿拉伯文本的方向和对齐方式正确,英文文本的文本方向 (rtl) 和对齐方式 (rigth-aligned) 错误。查看不带过滤器的渲染 PDF here
  • @tarleb 提出的过滤器旨在检测英文文本段落并自动将其方向设置为从左到右。
  • 生成的文档是所有文本,无论是阿拉伯语还是英语,都是从左到右的方向,并与页面的左边框对齐。查看生成的 PDF here

我认为这种不便是因为 Lua 过滤器不只检测拉丁/英语字符,它不区分阿拉伯语和英语字符,也就是。拉丁文 VS 非拉丁文字符,因此过滤器只是将文档中每个段落的方向设置为从左到右。

所以发生的事情是 lang: ar 属性的效果被 Lua 过滤器完全颠倒了,我们遇到了同样的问题,但现在使用的是阿拉伯语而不是英语。

此外,段落的对齐方式似乎与文本的方向一致;如果文档文本方向为 ltr,则所有段落都对齐到左边框,反之亦然。我不确定这是真的。我在这里的问题是我们如何为每个段落分别设置文档的文本方向和对齐方式?我们可以使用 Lua 过滤器来检测段落中的第一个字符是拉丁文还是非拉丁文,并相应地设置该段落的文本方向和对齐方式,例如,如果是拉丁文,则为 ltr 方向和左对齐,如果是拉丁文,则为 rtl 方向和右对齐如果不是拉丁语?

非常感谢。

更新的reprex:

---
output:
  pdf_document:
    latex_engine: xelatex
    pandoc_args: '--lua-filter=ltr-paras.lua'
mainfont: Arial
lang: ar
---

بسم الله الرحمن الرحيم

Thanks to the Lua filter from **@tarleb**, the English text is well-aligned in rendered document without having to wrap it in {dir=ltr}. The text direction is left-to-right and the paragraph itself is aligned to the left border of the page. 

To get the Arabic text direction right, I have to wrap it inside {dir=rtl}:

[بسم الله الرحمن الرحيم]{dir="rtl"}

However, the Arabic paragraph is still aligned wrongfully to the left border of the page.

最佳答案

这对 pandoc 来说是个不错的工作 Lua filters .我们使用过滤器来检查段落中的所有字符是否都是数字、拉丁字母、标点符号或空格。如果是这种情况,那么我们将段落包装在具有属性 dir='ltr' 的 div 中(也可以使用 lang='en')。

function Para (para)
  local str = pandoc.utils.stringify(para)
  if str:match '^[%w%p%s]*$' then
    return pandoc.Div(para, pandoc.Attr('', {}, {dir='ltr'}))
  end
end

将以上内容放入文档目录中的文件中,例如ltr-paras.lua,然后将其添加到您的 YAML 中:

output:
  pdf_document:
    latex_engine: xelatex
    pandoc_args: '--lua-filter=ltr-paras.lua'

关于r - 双语 Rmarkdown -> LaTeX 文档的自动对齐文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70397830/

相关文章:

latex - 如何在LaTeX中引用图形之前将其引用?

r - Bookdown 演示文稿中类似 Beamer 的叠加层

r - 数据框中的条件出现计算

r - `nlme` 具有交叉随机效应

git - 更改 git 冲突标记

latex - 如何使用\includegraphics 中的 .bb 文件指示边界框?

latex - 你能在 tufte 讲义 pdf 中有一个全宽的表格吗?

RTVS:无法使用 data.table 编织文档

arrays - 如何将数组/列表添加到对象

r - 将字符串向量连接成一个字符串 - 对于 df 中的每一行