You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandoc转换Markdown到PDF的行内数学字体与公式间距问题

问题:Pandoc转PDF时行内数学字体过大、公式间距与Obsidian不符

我用Vim+Markdown替代Obsidian,通过Pandoc将Markdown转为PDF,希望输出样式尽可能贴近Obsidian的PDF效果。目前已通过自定义LaTeX片段调整好页面边距、标题与文本间距,但仍存在两个问题:

  • 行内数学字体过大
  • 公式(行间、行内)前后的间距和Obsidian输出不一致

对比截图:
Pandoc生成的PDF
Obsidian生成的PDF

我通过pandoc -H style.tex ...命令引入自定义LaTeX代码片段设置样式,曾尝试在公式中写入$\small \vec{E}$调整行内数学字体,但无效。已知Pandoc使用unicode-math包处理LaTeX公式,但未找到调整数学字体大小和公式间距的有效方法。


附:style.tex文件内容

% page setup
\usepackage[a4paper,
            top=2cm,
            bottom=1.75cm,
            left=1.75cm,
            right=1.75cm]{geometry}

\usepackage{titlesec}
\usepackage{fontspec}

% inline code (backticks in md)
% taken from https://jdhao.github.io/2019/05/30/markdown2pdf_pandoc/
\linespread{1.15}
\definecolor{bgcolor}{HTML}{e0e0e0}
\let\oldtexttt\texttt

\renewcommand{\texttt}[1]{
    \colorbox{bgcolor}{\oldtexttt{#1}}
}

% change boldfont bold to extrabold
% \setmainfont[
%  BoldFont={Inter-ExtraBold}
% ]{Inter}

% change regular font to light font
% \setmainfont{Inter light}

\newfontfamily\titlefont{Inter}[
UprightFont     =   *-Regular,
BoldFont        =   *-ExtraBold,
]

\newfontfamily\sectionsfont{Inter}[
UprightFont     =   *-Regular,
BoldFont        =   *-SemiBold,
]

\titleformat{\section}
{\titlefont\huge\bfseries}
{}
{0em}
{}

\titleformat{\subsection}
{\sectionsfont\LARGE\bfseries}
{}
{0em}
{}

\titleformat{\subsubsection}
{\sectionsfont\Large\bfseries}
{}
{0em}
{}

\titleformat{\paragraph}
{\sectionsfont\large\bfseries}{\theparagraph}{1em}{}

\titlespacing*{\paragraph}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\titlespacing*{\subsubsection}
{0pt}{2.5ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\titleformat{\subparagraph}
{\normalfont\large\bfseries}{\theparagraph}{1em}{}

\titlespacing*{\subparagraph}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

附:Pandoc转换后的.tex片段(对应截图内容)

eléctrica que efectúa el campo sobre la partícula. se puede calcular entonces como:

\[\frac{w_{a \rightarrow b}}{q_{0}} = - \int_{a}^{b} \vec{e} \cdot d\vec{l} = v_{b} - v_{a} = v_{ab}\]

donde \({q_{0}}\) es una pequeña carga puntual, \(v_{a}\) y \(v_{b}\) el potencial por unidad de carga de los puntos \(a\) y \(b\) respectivamente, \(\vec{e}\) el valor del campo eléctrico 

解决方法

1. 调整行内数学字体大小

在style.tex中引入unicode-math包,并设置数学字体的缩放比例,匹配Obsidian的行内数学字体大小:

\usepackage{unicode-math}
% 将数学字体缩放到正文字体的0.9倍(可根据Obsidian效果微调数值)
\setmathfont{Latin Modern Math}[Scale=0.9]
% 若使用和正文字体匹配的数学字体(如Inter对应的Inter Math),替换为对应字体名即可

如果需要更精准的控制,也可以重定义行内数学环境:

% 重定义行内数学环境为小号字体
\DeclareRobustCommand{\[}{\begin{math}\small}
\DeclareRobustCommand{\]}{\end{math}}

2. 调整公式前后间距

行间公式(\[...\])的上下间距

Obsidian的行间公式前后间距较紧凑,修改以下LaTeX参数即可调整:

% 设置行间公式上下间距,单位用ex或pt,可根据Obsidian效果微调
\setlength{\abovedisplayskip}{1ex}
\setlength{\belowdisplayskip}{1ex}
% 调整短公式(上下文无换行时)的上下间距
\setlength{\abovedisplayshortskip}{0.5ex}
\setlength{\belowdisplayshortskip}{0.5ex}

行内公式的前后空白

调整mathsurround参数,缩小行内公式与普通文本的间距:

% 设置行内公式前后的空白,Obsidian的行内公式间距极小,可设为1pt左右
\setlength{\mathsurround}{1pt}

整合后的style.tex示例

将上述代码整合到原有文件中,完整内容如下:

% page setup
\usepackage[a4paper,
            top=2cm,
            bottom=1.75cm,
            left=1.75cm,
            right=1.75cm]{geometry}

\usepackage{titlesec}
\usepackage{fontspec}
\usepackage{unicode-math}

% 调整行内数学字体大小
\setmathfont{Latin Modern Math}[Scale=0.9]

% 调整行间公式间距
\setlength{\abovedisplayskip}{1ex}
\setlength{\belowdisplayskip}{1ex}
\setlength{\abovedisplayshortskip}{0.5ex}
\setlength{\belowdisplayshortskip}{0.5ex}

% 调整行内公式前后间距
\setlength{\mathsurround}{1pt}

% inline code (backticks in md)
\linespread{1.15}
\definecolor{bgcolor}{HTML}{e0e0e0}
\let\oldtexttt\texttt

\renewcommand{\texttt}[1]{
    \colorbox{bgcolor}{\oldtexttt{#1}}
}

% 字体设置
\newfontfamily\titlefont{Inter}[
UprightFont     =   *-Regular,
BoldFont        =   *-ExtraBold,
]

\newfontfamily\sectionsfont{Inter}[
UprightFont     =   *-Regular,
BoldFont        =   *-SemiBold,
]

% 标题格式设置
\titleformat{\section}
{\titlefont\huge\bfseries}
{}
{0em}
{}

\titleformat{\subsection}
{\sectionsfont\LARGE\bfseries}
{}
{0em}
{}

\titleformat{\subsubsection}
{\sectionsfont\Large\bfseries}
{}
{0em}
{}

\titleformat{\paragraph}
{\sectionsfont\large\bfseries}{\theparagraph}{1em}{}

\titlespacing*{\paragraph}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\titlespacing*{\subsubsection}
{0pt}{2.5ex plus 1ex minus .2ex}{1.5ex plus .2ex}

\titleformat{\subparagraph}
{\normalfont\large\bfseries}{\theparagraph}{1em}{}

\titlespacing*{\subparagraph}
{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}

验证与微调

修改完成后,重新用Pandoc编译:

pandoc -H style.tex --pdf-engine=xelatex your-file.md -o output.pdf

对比Obsidian的PDF效果,微调Scale值、间距参数,直到样式匹配。


内容的提问来源于stack exchange,提问作者mjkloeckner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:25:18