我在 mako 模板中有很多定义和捕获。模板的渲染传递给 pdflatex,所以 mako 的输出一定是正确的。打印的文本可能包含撇号或 & 号等。并禁止它们转向'
等。我必须在模板内的所有表达式中使用过滤器“n”:${text | n}
我试图添加,<%page expression_filter="n" />
但它对此事没有影响。其他过滤器,如trim
与 一起工作得很好page-tag
,但禁用所有过滤器不起作用。
这就是我所拥有的
<%! from bs4 import BeautifulSoup %>
<%def name='html_tag_to_latex(tag, content)' filter="trim">
% if tag == "p":
${content | n}\par{}
% elif tag == "h1":
\clearpage\section{${content | n}}
% elif tag == "h2":
\subsection{${content | n}}
% else:
${content | n}
</%def>
<%def name='html_to_latex(html_string)' filter="n,trim">
<%def name='beautifulsoup_to_latex(item)' filter="n,trim">
<% text = u'' %>
% for child in item.contents:
% try:
<% child.contents %>
<% subtext = capture(beautifulsoup_to_latex, item=child) %>
% if subtext.strip():
<%
text += capture(
html_tag_to_latex,
tag=child.name,
content=subtext.strip()
)
%>
% endif
% except AttributeError:
<% text += unicode_to_latex(child.string) %>
% endtry
% endfor
## Capture all the kids and then print out
${text | n}
</%def>
<% soup = BeautifulSoup(html_string) %>
${beautifulsoup_to_latex(soup)}
</%def>
出于某种原因,所有 n 过滤器都需要显式放置在侧面表达式中。在 defs 中添加过滤器 n 没有效果;filter="n,trim"
或者filter="n"
什么都不做。无论出于何种原因,这只会影响撇号。
- 方法进行字典检查以将unicode_to_latex
unicodes 转换为 LaTeX 标记,例如。&
-> \&
。它工作正常,但 mako 把它变成了\&
. 斯堪的纳维亚字母äåö
按原样显示,因此entity
未使用 makos -filter。
唯一的解决方案真的是添加| n
到所有表达式吗?由于某种原因,它是唯一有效的。为什么我不能使用 expression_filter?
编辑:注意到该行${beautifulsoup_to_latex(soup)}
不需要禁用过滤器。只有在html_tag_to_latex
和html_to_latex
方法表达式中才需要它。