\usepackage[english]{babel}
\usepackage{xcolor}
\usepackage{geometry}
\usepackage{fontspec}
\usepackage{xeCJK}
\usepackage{titlesec}
\usepackage{calc}
\usepackage{mdframed}
\usepackage{ragged2e}

\geometry{left=2.51cm,right=2.34cm,top=2.85cm,bottom=1.75cm}

\definecolor{MsBlue}{RGB}{0,112,192}

% =========================
% 可调参数（建议优先改这里）
% =========================

% 中文假粗体强度。
% 用途：控制标题、提示语等中文加粗文字的“粗细程度”。
% 调参参考：1.2=很轻，1.5=偏轻，1.8=当前默认，2.0=偏明显，2.5=较重。

\newcommand{\BudgetCJKFakeBold}{0.1}

\IfFileExists{./fonts/TimesNewRoman.ttf}{
  \setmainfont{TimesNewRoman}[Path=./fonts/,Extension=.ttf]
}{
  \IfFontExistsTF{Times New Roman}{
    \setmainfont{Times New Roman}
  }{
    \setmainfont{TeX Gyre Termes}
  }
}

\IfFileExists{./fonts/FandolFang-Regular.otf}{
  \setCJKmainfont{FandolFang-Regular}[Path=./fonts/,Extension=.otf]
}{
  \setCJKmainfont{STSong}
}

% 页面标题“预算说明书”专用中文字体族。
% 按官方样式要求，封面标题使用黑体。

\IfFileExists{./fonts/FandolHei-Regular.otf}{
  \newCJKfontfamily\budgettitlefont{FandolHei-Regular}[Path=./fonts/,Extension=.otf,AutoFakeBold=\BudgetCJKFakeBold]
}{
  \newCJKfontfamily\budgettitlefont{Heiti SC}[AutoFakeBold=\BudgetCJKFakeBold]
}

% 正文中的中文加粗字体族。
% 当前策略：正文里的强调文字不切换到黑体，继续使用与正文相同的中文字体，只额外施加假粗体。
% 这样可以避免“加粗后字体风格突变”，更贴近正文原始字形。

\IfFileExists{./fonts/FandolFang-Regular.otf}{
  \newCJKfontfamily\budgetboldfont{FandolFang-Regular}[Path=./fonts/,Extension=.otf,AutoFakeBold=\BudgetCJKFakeBold]
}{
  \newCJKfontfamily\budgetboldfont{STSong}[AutoFakeBold=\BudgetCJKFakeBold]
}

\xeCJKsetup{CJKecglue={}}

\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt}
\renewcommand{\baselinestretch}{1.35}

\setcounter{secnumdepth}{0}

\titleformat{\section}[block]
  {\normalfont\budgetboldfont\bfseries\fontsize{9.03bp}{12.17bp}\selectfont}
  {}
  {0pt}
  {}

\titlespacing*{\section}{0pt}{0.45\baselineskip}{0.10\baselineskip}

\titleformat{\subsection}[block]
  {\normalfont\fontsize{9.03bp}{12.17bp}\selectfont}
  {}
  {0pt}
  {}

\titlespacing*{\subsection}{0pt}{0.28\baselineskip}{0pt}

% 正文基础字号。
% 说明：预算说明书正文及多数段落宏都会复用这一字号设置。

\newcommand{\BudgetBodyFont}{\fontsize{9.03bp}{12.17bp}\selectfont}

% 页面标题“预算说明书”的字号与字体。
% 按官方样式使用“黑体四号加粗”；这里用 14pt 对应四号。

\newcommand{\BudgetTitleFont}{\budgettitlefont\bfseries\fontsize{14pt}{16pt}\selectfont}

% 行内手动加粗工具。

\newcommand{\BudgetBold}[1]{{\budgetboldfont\bfseries #1}}

% 占位空白：用于保持模板空白区域高度。

\newcommand{\BudgetPlaceholder}[1]{\vspace*{#1}}

% 正文整体左移补偿。
% 用途：微调整个段落块的视觉起点；一般不建议频繁改。
% 调参参考：数值更负=整体更靠左；更接近 0=整体更靠右。

\newcommand{\BudgetLeftShift}{-7pt}

% 段落首行缩进。
% 当前语义：严格按“2 个中文字符宽度”计算，缩进发生在序号前面。
% 若想改成 1.5 个或 3 个中文字符，可写成 1.5\ccwd 或 3\ccwd。

\newcommand{\BudgetIndent}{2\ccwd}

% 外框内部顶部到首个一级标题之间的微调量。
% 用途：单独控制 \begin{BudgetBox} 与首个 \BudgetSectionLine 之间的间隙。
% 调参参考：更负=间隙更小、内容更靠上；更接近 0=间隙更大。

\newcommand{\BudgetBoxTopGapAdjust}{-2pt}

% 一级标题行（如“1.科学基金资助项目直接费用”）。

\newcommand{\BudgetSectionLine}[1]{%
  {\budgetboldfont\bfseries\BudgetBodyFont\noindent\hspace*{\BudgetIndent}#1\par}%
}

% 普通正文段落。
% 特点：首行缩进，续行顶格，两端对齐。

\newcommand{\BudgetParagraph}[1]{%
  {\BudgetBodyFont\leftskip=\BudgetLeftShift\relax\justifying\parindent=\BudgetIndent #1\par}%
}

% 加粗正文段落。
% 用于顶部“请按照……”这类强调说明。

\newcommand{\BudgetBoldParagraph}[1]{%
  {\budgetboldfont\bfseries\BudgetBodyFont\leftskip=\BudgetLeftShift\relax\justifying\parindent=\BudgetIndent #1\par}%
}

% 外框环境：控制边框、内边距、固定高度等。
% 若想调“框本身”的粗细或上下内边距，可优先查看这里的 mdframed 参数。

\newenvironment{BudgetBox}{%
  \begin{mdframed}[
    skipabove=0pt,
    skipbelow=0pt,
    leftmargin=2pt,
    rightmargin=2pt,
    innertopmargin=7pt,
    innerbottommargin=7pt,
    innerleftmargin=3pt,
    innerrightmargin=3pt,
    linewidth=0.8pt,
    linecolor=black
  ]
    \begin{minipage}[t][22.35cm][t]{\linewidth}
    \vspace*{\BudgetBoxTopGapAdjust}
    \BudgetBodyFont
    \justifying
    \setlength{\parindent}{\BudgetIndent}%
    \setlength{\parskip}{0pt}%
}{%
    \end{minipage}
  \end{mdframed}
}
