已更新。请参见下文
我正在写一份双语报告。即使用阿拉伯语和英语。使用xelatex
引擎、mainfont: Arial
和lang: ar
YAML元数据,文档可以平滑地呈现阿拉伯语和英语(经过一番努力(。
如何在Rmarkdown中自动对齐文本->LaTeX文档
问题是:在lang
变量中选择的语言是从右到左对齐的,因此整个文档都遵循这种对齐方式。每当我想插入英语段落时,我都必须使用[text]{dir="ltr"}
。有没有一种方法可以根据使用的语言自动对齐段落?有LaTeX套餐或Pandoc/Rmarkdown的诀窍吗?Preambable中的纯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
- @tarleb提出的过滤器旨在检测英文文本段落,并自动将其方向设置为从左到右
- 由此产生的文档是,所有文本,无论是阿拉伯语还是英语,都是从左到右的方向,并与页面的左边框对齐。请在此处查看生成的PDF
我认为这种不便是因为Lua过滤器不能只检测拉丁/英语字符,它不能区分阿拉伯语和英语字符。拉丁字符与非拉丁字符,因此过滤器只将文档中每个段落的方向设置为从左到右。
因此,所发生的事情是,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过滤器来说是一项不错的工作。我们使用过滤器来检查段落中的所有字符是否都是数字、拉丁字母、标点符号或空白。如果是这种情况,那么我们将段落包装在具有属性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'