如何在Jinja2+LaTeX模板中消除缺失数据导致的换行
解决方案
问题根源在于你原本把每个联系方式单独写在一行并强制换行(\\),就算用if去掉某个项,剩下的项还是各自占一行,自然会换行。要让所有有效内容在同一行,得先把有效项收集成列表,再用分隔符连接,这样就不会有多余的换行和分隔符。
步骤1:修改Jinja2模板
把所有联系方式改成条件判断加入列表,再用分隔符拼接:
my_template = r""" \begin{document} \pagestyle{empty} \begin{tabularx}{\linewidth}{@{} C @{}} \Huge{ {{ data.name }} } \\\\[7.5pt] {% set contact_items = [] %} {% if data.github_username %} {% do contact_items.append("\href{https://github.com/" + data.github_username + "}{\raisebox{-0.05\\height}\\faGithub\ " + data.github_username + "}") %} {% endif %} {% if data.linkedin_username %} {% do contact_items.append("\href{https://linkedin.com/in/" + data.linkedin_username + "}{\raisebox{-0.05\\height}\\faLinkedin\ " + data.linkedin_username + "}") %} {% endif %} {% if data.website_url %} {% do contact_items.append("\href{" + data.website_url + "}{\raisebox{-0.05\\height}\\faGlobe \ " + data.website_url | replace('https://', '') + "}") %} {% endif %} {% if data.email %} {% do contact_items.append("\href{mailto:" + data.email + "}{\raisebox{-0.05\\height}\\faEnvelope \ " + data.email + "}") %} {% endif %} {% if data.phone %} {% do contact_items.append("\href{tel:" + data.phone + "}{\raisebox{-0.05\\height}\\faMobile \ " + data.phone + "}") %} {% endif %} {{ contact_items | join(' \\ $|$ \\ ') }} \\ \end{tabularx} \end{document} """
步骤2:启用Jinja2的do扩展
因为用到了{% do ... %}语句,需要在Python初始化Jinja2环境时启用do扩展:
from jinja2 import Environment, BaseLoader # 初始化环境并启用do扩展 env = Environment(loader=BaseLoader(), extensions=['jinja2.ext.do']) template = env.from_string(my_template) # 渲染模板(示例数据) data = { "name": "John Doe", "github_username": "johndoe", # "website_url": "", # 注释掉模拟空数据 "email": "john@example.com", "phone": "+123456789" } rendered_latex = template.render(data=data)
说明
- 用
{% set contact_items = [] %}创建空列表,把所有非空的联系方式片段用{% do ... append(...) %}加入列表 - 用
{{ contact_items | join(' \\ $|$ \\ ') }}把列表中的项用$|$分隔,并且保持在同一行 - 最后只需要一个
\\来结束这一行,避免多余换行
这样不管哪个字段为空,剩下的有效项都会自动拼接在同一行,不会出现换行问题,也不会有多余的分隔符。
内容的提问来源于stack exchange,提问作者Crypto Man
相关产品推荐
相关产品推荐

