带有三个大括号的 jinja2 不包括额外的白色 space

jinja2 with three curly braces without including an extra white space

如果插入白色 space,Jinja2 会正确呈现三个并排的大括号,如下例 1 所示。但是,如果没有白色 space,则会抛出异常,如下面的案例 2。白色 space 在这里用红色条表示。

是否可以渲染不包含白色 space 的输出,即渲染类似 \textbf{Hello, World!} 的输出?

下面列出了一个python代码示例

from jinja2 import Template


template_1 = Template(r"\textbf{ {{msg}} }")

#template_2 = Template(r"\textbf{{{msg}} }") # Throws an exception

msg = "Hello, World!"

out_1 = template_1.render({'msg':msg})
#out2 = template_2.render({'msg':msg}) # FAILS!


print(out_1)

输出

\textbf{ Hello, World! }

我想要的是

\textbf{Hello, World!}

我发现的最佳解决方案是使用 {% raw %} 标签只包含一个花括号:

template_1 = Template(r"\textbf{% raw %}{{% endraw %}{{msg}}{% raw %}}{% endraw %}")

这将呈现

\textbf{Hello, World!}

随心所欲。

对 pedro-juan 的回答略有改进:

\hspace{0pt} 是一种非 unicode 乳胶方式,用于插入“零宽度 Space”(unicode U+200B),它说服解析器不处理“{{{”作为导致错误的东西。

Template(r"\textbf{% raw %}{{% endraw %}{{msg}}

应该产生与

相同的输出

Template(r"\textbf\hspace{0pt}{{msg}}")

也可以更改所有 jinja2 标记,这可能会使某些语法高亮器更容易避免被不匹配的花括号对混淆。 (至少我的 vim 用 latex-jinja2 做的工作不太体面)(参见 this article

例如

latex_jinja_env = jinja2.Environment(
    block_start_string = '\BLOCK{',
    block_end_string = '}',
[...]

您是否尝试过在 {{ 和 }} 之前添加“-”?

template_2 = Template(r"\textbf{ {{-msg-}} }")

这将删除空格。因此,您可以将 single/double 大括号之间的空格保留到模板中,Jinja2 在渲染期间将其删除。