%==============================================================================
% cveoreport.cls - 通用技术报告 LaTeX 文档类
%==============================================================================
% 模板名称：cveoreport
% 适用场景：技术方案、报告文档、项目申报书、研究报告等
% 编译方式：lualatex
%==============================================================================

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{cveoreport}[2025/12/29 Universal Technical Report Template]

%==============================================================================
% 基础文档类设置
%==============================================================================
\LoadClass[a4paper, UTF8, zihao=-4]{ctexart}

%==============================================================================
% 页面设置（A4，国标规范）
%==============================================================================
\RequirePackage[
  top=2.5cm,
  bottom=2.5cm,
  left=3.0cm,
  right=3.0cm,
  headheight=15pt,
  headsep=12pt,
  footskip=12pt
]{geometry}


%==============================================================================
% 行距设置（1.5倍行距）
%==============================================================================
\RequirePackage{setspace}
\setstretch{1.5}

%==============================================================================
% 常用宏包
%==============================================================================
\RequirePackage{amsmath,amssymb}
\RequirePackage{xcolor}
\RequirePackage{graphicx}
\RequirePackage{pdflscape}
\RequirePackage{pifont}
\RequirePackage{booktabs}
\RequirePackage{array}
\RequirePackage{tabularx}
\RequirePackage{longtable}
\RequirePackage{xltabular}
\RequirePackage{hyperref}
\RequirePackage{bookmark}
\RequirePackage{setspace}
\RequirePackage{titletoc}
\RequirePackage[section]{placeins}
% \RequirePackage{subfigure}  % 旧包，已过时，使用 subcaption 替代
\RequirePackage{subcaption}  % 新包，支持子图标题和编号
\RequirePackage{tcolorbox}    % 彩色盒子（用于重点框）
\RequirePackage{lastpage}      % 获取总页数
\RequirePackage{tikz}         % 绘图（用于封面背景）
\RequirePackage{etoolbox}     % 条件控制（用于增强功能）

%==============================================================================
% 编号设置（国内政府文档规范）
%==============================================================================
\numberwithin{table}{section}
\numberwithin{figure}{section}
\counterwithin{equation}{section}

% 章节编号样式（政府文档规范）
\ctexset{
  section = {
    format = \zihao{-2} \bfseries \centering \vspace{0.5\baselineskip},
    name = {},
    number = \arabic{section}. ,
    aftername = \hspace{0.5em},
    beforeskip = 20pt plus 2pt minus 2pt,
    afterskip = 15pt plus 2pt minus 2pt,
    indent = 0pt
  },
  subsection = {
    format = \zihao{4} \bfseries \raggedright \vspace{0.3\baselineskip},
    name = {},
    number = \arabic{section}.\arabic{subsection},
    aftername = \hspace{0.3em},
    beforeskip = 15pt plus 2pt minus 1pt,
    afterskip = 10pt plus 1pt minus 1pt,
    indent = 0pt
  },
  subsubsection = {
    format = \zihao{-4} \bfseries \raggedright,
    name = {},
    number = \arabic{section}.\arabic{subsection}.\arabic{subsubsection},
    aftername = \hspace{0.3em},
    beforeskip = 10pt plus 1pt minus 0.5pt,
    afterskip = 8pt plus 0.5pt minus 0.3pt,
    indent = 0pt
  },
  paragraph = {
    format = \zihao{-4} \bfseries \raggedright,
    name = {},
    number = {},
    aftername = \hspace{0em},
    beforeskip = 10pt plus 0.5pt,
    afterskip = 12pt,
    indent = 0pt
  }
}

% 设置目录和编号深度
\ctexset{secnumdepth=4}
\ctexset{tocdepth=2}

%==============================================================================
% 每章新起一页
%==============================================================================
\let\oldsection\section
\renewcommand\section{\clearpage\oldsection}

%==============================================================================
% 中文标点符号优化
%==============================================================================
\RequirePackage{zhnumber}

%==============================================================================
% 目录设置
%==============================================================================
\titlecontents{section}[0pt]
  {\zihao{-4}\bfseries\addvspace{2pt}\parindent=0pt}
  {\contentslabel{2em}}
  {}
  {\hspace{2em}\leaders\hbox to 0.35em{\hss.}\hfill\contentspage}
  []

\titlecontents{subsection}[2em]
  {\zihao{-4}\addvspace{1pt}\parindent=0pt}
  {\contentslabel{2em}}
  {}
  {\hspace{2em}\leaders\hbox to 0.35em{\hss.}\hfill\contentspage}
  []

%==============================================================================
% 图表设置
%==============================================================================
% 图片路径
\graphicspath{{figures/}}

% 图片浮动环境默认设置
\makeatletter
\def\fps@figure{htbp}
\def\fps@table{htbp}
\makeatother

% 图表标题格式（简洁样式：图1-1、表1-1）
\RequirePackage{caption}
\DeclareCaptionLabelFormat{chinesefig}{图~#2}
\DeclareCaptionLabelFormat{chinesetable}{表~#2}

\captionsetup[figure]{
  labelformat=chinesefig,
  labelsep=quad,
  justification=raggedright,
  position=bottom,
  aboveskip=8pt,
  belowskip=8pt,
  font=small
}
\captionsetup[table]{
  labelformat=chinesetable,
  labelsep=quad,
  justification=centering,
  position=top,
  aboveskip=8pt,
  belowskip=6pt,
  font=small
}

% 子图标题设置（使用 subcaption 包）
\captionsetup[subfigure]{
  labelformat=simple,
  labelsep=space,
  justification=centering,
  font=small,
  aboveskip=4pt,
  belowskip=4pt
}

% 定义图片命令（使用相对宽度）
\newcommand{\figwidth}[2][0.85]{%
  \includegraphics[width=#1\textwidth]{#2}%
}

%==============================================================================
% 重点信息框环境
%==============================================================================
\newenvironment{keypoint}{
  \begin{tcolorbox}[colback=blue!10, colframe=blue!70, arc=3pt, boxrule=1pt]
    关键要点：
    \vspace{0.3\baselineskip}
}{
  \end{tcolorbox}
}

\newenvironment{warningbox}{
  \begin{tcolorbox}[colback=red!10, colframe=red!70, arc=3pt, boxrule=1pt]
    注意事项：
    \vspace{0.3\baselineskip}
}{
  \end{tcolorbox}
}

\newenvironment{tipbox}{
  \begin{tcolorbox}[colback=green!10, colframe=green!70, arc=3pt, boxrule=1pt]
    提示：
    \vspace{0.3\baselineskip}
}{
  \end{tcolorbox}
}

%==============================================================================
% 表格设置（国标三线表和完整线框表）
%==============================================================================
% 三线表命令
\newcommand{\topline}{\toprule[1.2pt]}
\newcommand{\midline}{\midrule[0.6pt]}
\newcommand{\bottomline}{\bottomrule[1.2pt]}

% 完整线框表格命令
\newcommand{\fulltopline}{\hline}
\newcommand{\fullmidline}{\hline}
\newcommand{\fullbottomline}{\hline}
\newcommand{\fullcline}[2]{\cline{#1-#2}}

% 表格单元格对齐
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}m{#1}}
%\newcolumntype{X}[1]{>{\raggedright\arraybackslash}p{#1}}  % X already defined by tabularx

%==============================================================================
% 列表环境设置（修复itemize序号0问题）
%==============================================================================
\RequirePackage{enumitem}
\setlist{
  nosep,
  labelsep=0.5em,
  leftmargin=2\ccwd,
  itemindent=0\ccwd,
  partopsep=0pt,
  parsep=0.5ex
}
\setlist[itemize,1]{label=\textbullet}
\setlist[itemize,2]{label=--}
\setlist[itemize,3]{label=$\circ$}
\setlist[enumerate,1]{label=\arabic*.}
\setlist[enumerate,2]{label=(\alph*)}
\setlist[enumerate,3]{label=\roman*.}

%==============================================================================
% 页眉页脚设置
%==============================================================================
\RequirePackage{fancyhdr}
\pagestyle{fancy}

\fancyhf{}
\fancyhead[C]{%
  \zihao{-5}
  \ptitle%
}
\fancyfoot[C]{%
  \zihao{-5}
  \thepage / \pageref{LastPage}
}

% 封面页和章节首页无页眉
\fancypagestyle{plain}{
  \fancyhf{}
  \fancyfoot[C]{\zihao{-5} \thepage / \pageref{LastPage}}
}

%==============================================================================
% 超链接设置
%==============================================================================
\hypersetup{
  pdfborder={0 0 0},
  colorlinks=false,
  linkcolor=blue,
  citecolor=blue,
  urlcolor=blue,
  filecolor=blue,
  pdfcreator={LaTeX with lualatex - techreport.cls},
  pdfproducer={LuaLaTeX}
}

%==============================================================================
% 断词设置
%==============================================================================
\RequirePackage{hyphenat}

%==============================================================================
% 常用命令定义
%==============================================================================
\providecommand{\strong}[1]{\textbf{#1}}

% 带圈数字
\newcommand{\circlenum}[1]{\textcircled{\scriptsize#1}}

% 定义域命令
\DeclareMathOperator{\dom}{dom}

%==============================================================================
% 封面信息命令（可在 main.tex 中自定义）
%==============================================================================
% 主标题（文档名称）
\newcommand{\ptitle}{}%
\newcommand{\psubtitle}{}%
\newcommand{\pauthor}{}%
\newcommand{\pdate}{}%

%==============================================================================
% 封面命令
%==============================================================================
\newcommand{\makecover}{
  \begin{titlepage}
    \thispagestyle{empty}

    % 主标题
    \vspace{2cm}
    \begin{center}
      \zihao{-1}
      \ptitle%
    \end{center}

    \vspace{0.8cm}

    % 副标题说明 - 放大突出
    \begin{center}
      \zihao{1}
      \textbf{\psubtitle}
    \end{center}

    \vspace{12cm}

    % 编制单位
    \begin{center}
      \zihao{3}
      \pauthor
    \end{center}

    \vspace{1cm}

    % 编制日期
    \begin{center}
      \zihao{3}
      \pdate
    \end{center}

    % % 版本信息
    % \begin{center}
    %   \zihao{5}
    %   （内部资料）
    % \end{center}

    % % 扉页（空白页）
    % \clearpage
    % \thispagestyle{empty}
    % \mbox{}
    \clearpage
  \end{titlepage}
}

%==============================================================================
% 引用文件环境
%==============================================================================
\newenvironment{references}{
  \section*{引用文件}
  \addcontentsline{toc}{section}{引用文件}
  \begin{compactlist}
}{
  \end{compactlist}
}

%==============================================================================
% 紧凑列表
%==============================================================================
\newenvironment{compactlist}{
  \begin{itemize}
    \itemsep=0pt
    \parsep=0.5ex
    \topsep=0pt
  \end{itemize}
}{
  \end{itemize}
}

%==============================================================================
% 结束
%==============================================================================
\endinput
