如何在RMarkdown导出ODT时保留YAML多行地址的换行?
解决RMarkdown导出ODT时页眉多行地址保留换行的问题
咱们一步步来解决你遇到的这个问题,核心是YAML多行字符串的正确写法,加上ODT模板对换行的适配处理:
第一步:修正YAML中的多行地址写法
你之前用管道符时每行多加了|,这会让YAML把这些竖线当成地址内容的一部分,还可能导致pandoc解析异常。正确的多行字符串写法是只在address:后面加|,然后每行保持一致的缩进(至少2个空格):
--- title: Test Multi address: | First Name Institute Street City output: odt_document: template: default.opendocument --- # Just a test document With some text
第二步:修改ODT模板适配换行
ODT是基于XML的格式,普通的换行符(\n)不会被渲染成换行,需要转换成ODT支持的<text:line-break/>标签。你可以在default.opendocument模板里用pandoc的变量替换过滤器,把地址里的换行替换成ODT的换行标签:
$if(address)$ <text:p text:style-name="Author">$address|replace("\n", "<text:line-break/>")$</text:p> $endif$
这样导出后,地址的每一行都会在ODT页眉中正确换行。
可选方案:每行地址作为单独段落
如果你希望每行地址之间有更大的间距(成为独立段落),可以把YAML中的address写成列表形式,然后在模板里循环输出:
YAML部分
--- title: Test Multi address: - First Name - Institute - Street - City output: odt_document: template: default.opendocument ---
模板部分
$if(address)$ $for(address)$ <text:p text:style-name="Author">$address$</text:p> $endfor$ $endif$
为啥之前的写法不对?
- 第一次直接写多行地址时,YAML默认会把连续多行折叠成单行(除非用
|或>标记),所以$address$变量里没有换行,导出后自然看不到换行效果。 - 第二次用管道符时每行加了
|,这会让YAML把竖线当成文本内容,还可能干扰pandoc对变量的解析,导致地址完全没显示。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

