%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% progartcn - Yet Another LaTeX Template for Programming or Technical Articles or Tutorials
%% WisdomFusion@gmail.com
%% July, 2018
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{progartcn}[July, 2018 Yet Another LaTeX Template for Technical Articles or Tutorials]
\LoadClass[a4paper]{ctexart}

\RequirePackage{xunicode}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% colors
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage[dvipsnames]{xcolor}

% primary
\definecolor{colorPrimary}{HTML}{007bff}
\definecolor{colorPrimaryBorder}{HTML}{b8daff}
\definecolor{colorPrimaryBackground}{HTML}{cce5ff}
\definecolor{colorPrimaryText}{HTML}{004085}

% secondary
\definecolor{colorSecondary}{HTML}{6c757d}
\definecolor{colorSecondaryBorder}{HTML}{d6d8db}
\definecolor{colorSecondaryBackground}{HTML}{e2e3e5}
\definecolor{colorSecondaryText}{HTML}{383d41}

% success
\definecolor{colorSuccess}{HTML}{28a745}
\definecolor{colorSuccessBorder}{HTML}{c3e6cb}
\definecolor{colorSuccessBackground}{HTML}{d4edda}
\definecolor{colorSuccessText}{HTML}{155724}

% info
\definecolor{colorInfo}{HTML}{17a2b8}
\definecolor{colorInfoBorder}{HTML}{bee5eb}
\definecolor{colorInfoBackground}{HTML}{d1ecf1}
\definecolor{colorInfoText}{HTML}{0c5460}

% danger
\definecolor{colorDanger}{HTML}{dc3545}
\definecolor{colorDangerBorder}{HTML}{f5c6cb}
\definecolor{colorDangerBackground}{HTML}{f8d7da}
\definecolor{colorDangerText}{HTML}{721c24}

% warning
\definecolor{colorWarning}{HTML}{ffc107}
\definecolor{colorWarningBorder}{HTML}{ffeeba}
\definecolor{colorWarningBackground}{HTML}{fff3cd}
\definecolor{colorWarningText}{HTML}{856404}

% light
\definecolor{colorLight}{HTML}{f8f9fa}
\definecolor{colorLightBorder}{HTML}{fdfdfe}
\definecolor{colorLightBackground}{HTML}{fefefe}
\definecolor{colorLightText}{HTML}{818182}

% dark
\definecolor{colorDark}{HTML}{343a40}
\definecolor{colorDarkBorder}{HTML}{c6c8ca}
\definecolor{colorDarkBackground}{HTML}{d6d8d9}
\definecolor{colorDarkText}{HTML}{1b1e21}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% hyperref settings
%% 超链接设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{hyperref}
\hypersetup{
  bookmarksnumbered,
  colorlinks,
  linkcolor={black},
  citecolor={black},
  urlcolor={black}
}

\RequirePackage[open,openlevel=0,atend]{bookmark}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% graphicx settings
%% 图片设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{graphicx}
\RequirePackage{graphbox}
\RequirePackage{wrapfig}
\graphicspath{{./figs/}{./figure/}{./figures/}{./image/}{./images/}{./graphics/}{./graphic/}{./pictures/}{./picture/}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% geometry settings
%% 页面设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{geometry}
\geometry{
  textwidth=138mm,
  textheight=215mm,
  left=22mm,
  %% or
  %% inner=23mm,
  right=22mm,
  %% or
  %% outer=18mm,
  top=22mm, bottom=22mm,
  headheight=5.17cm,
  headsep=4mm,
  footskip=12mm,
  heightrounded,
}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% fonts settings
%% 字体设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{fontspec}
%% \usepackage{ebgaramond}

%% 开明式：句末点号用占一个汉字宽度，标号和句内点号占半个汉字宽度
%\punctstyle{kaiming}

\setmainfont{Minion Pro}
\setsansfont{Myriad Pro}
\setmonofont{Courier Std}

\setCJKmainfont[AutoFakeBold,ItalicFont={仿宋}, BoldItalicFont={仿宋}]{仿宋}
\setCJKsansfont[AutoFakeBold, ItalicFont={宋体}, BoldItalicFont={宋体}]{宋体}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

\setCJKfamilyfont{fzss}{方正书宋_GBK}
\newcommand{\fzss}{\CJKfamily{fzss}}

\setCJKfamilyfont{fzxbs}{方正小标宋_GBK}
\newcommand{\fzxbs}{\CJKfamily{fzxbs}}

\setCJKfamilyfont{fzhei}{方正黑体_GBK}
\newcommand{\fzhei}{\CJKfamily{fzhei}}

\setCJKfamilyfont{fzkai}{方正楷体_GBK.ttf}
\newcommand{\fzkai}{\CJKfamily{fzkai}}

\setCJKfamilyfont{fzfs}{方正仿宋_GBK}
\newcommand{\fzfs}{\CJKfamily{fzfs}}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% titlesec
%% 标题设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{titlesec}
\RequirePackage{zhnumber}


%% \renewcommand\abstractname{Summary}
\renewenvironment{abstract}{\noindent\rule{\textwidth}{.5pt}\\[2ex] \centering\begin{minipage}{.97\textwidth}{\zihao{-4}\sffamily\bfseries\abstractname}\\}
{\par\noindent\end{minipage}\\[2ex] \rule{\textwidth}{.5pt}}

%% section
\titleformat{\section}
[hang]
{\sffamily}
{\centering\zihao{4}\bfseries\thesection\enspace}
{3pt}
{\zihao{4}\bfseries}

%% subsection
\titleformat{\subsection}
[hang]
{\sffamily}
{\zihao{-4}\bfseries\thesubsection\enspace}
{2pt}
{\zihao{-4}\bfseries\filright}

%% subsubsection
\titleformat{\subsubsection}
[hang]
{\sffamily}
{\zihao{-4}\bfseries\thesubsubsection\enspace}
{2pt}
{\zihao{-4}\bfseries\filright}

\titlespacing{\section}{0pt}{2.5ex plus 1ex minus .2ex}{1.3ex plus .2ex}
%\titlespacing{\section}{0pt}{\parskip}{-\parskip}
\titlespacing{\subsection}{0pt}{\parskip}{-\parskip}
\titlespacing{\subsubsection}{0pt}{\parskip}{-\parskip}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% boxes
%% 信息框
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage[many]{tcolorbox}
\RequirePackage{fontawesome}

%% 带标题的文本框
\newtcolorbox{titledBox}[1]{%
  tikznode boxed title,
  enhanced,
  arc=3pt,
  interior style={white},
  attach boxed title to top center = {yshift=-\tcboxedtitleheight/2},
  fonttitle=\normalfont,
  colbacktitle=white,coltitle=black,
  boxed title style={size=normal,colframe=white,boxrule=0pt},
  boxrule=.5pt,
  left=5pt, right=5pt, top=5pt, bottom=0pt,
  boxsep=5pt,
  title={#1},
  halign=left,
  fontupper=\fzkai
}


%% Note
\newtcolorbox{noteBox}{%
  enhanced,
  arc=2pt,
  boxrule=.5pt,
  left=5pt, right=5pt, top=0pt, bottom=0pt,
  boxsep=5pt,
  colframe=colorInfoBorder,
  colback=colorInfoBackground,
  colbacktitle=colorInfoBackground,
  coltext=colorInfoText,
  title={\textcolor{colorInfoText}{\faStickyNoteO\hspace{.5em}\bfseries{\textsc{Note}}}},
  titlerule=0pt,
  halign=left,
  fontupper=\fzkai
}

%% Important
\newtcolorbox{importantBox}{%
  enhanced,
  arc=2pt,
  boxrule=.5pt,
  left=5pt, right=5pt, top=0pt, bottom=0pt,
  boxsep=5pt,
  colframe=colorWarningBorder,
  colback=colorWarningBackground,
  colbacktitle=colorWarningBackground,
  coltext=colorWarningText,
  title={\textcolor{colorWarningText}{\faExclamationCircle\hspace{.5em}\bfseries{\textsc{Important}}}},
  titlerule=0pt,
  halign=left,
  fontupper=\fzkai
}

%% Tip
\newtcolorbox{tipBox}{%
  enhanced,
  arc=2pt,
  boxrule=.5pt,
  left=5pt, right=5pt, top=0pt, bottom=0pt,
  boxsep=5pt,
  colframe=colorSuccessBorder,
  colback=colorSuccessBackground,
  colbacktitle=colorSuccessBackground,
  coltext=colorSuccessText,
  title={\textcolor{colorSuccessText}{\faCheckCircle\hspace{.5em}\bfseries{\textsc{Tip}}}},
  titlerule=0pt,
  halign=left,
  fontupper=\fzkai
}

%% Warning
\newtcolorbox{warningBox}{%
  enhanced,
  arc=2pt,
  boxrule=.5pt,
  left=5pt, right=5pt, top=0pt, bottom=0pt,
  boxsep=5pt,
  colframe=colorDangerBorder,
  colback=colorDangerBackground,
  colbacktitle=colorDangerBackground,
  coltext=colorDangerText,
  title={\textcolor{colorDangerText}{\faExclamationTriangle\hspace{.5em}\bfseries{\textsc{Warning}}}},
  titlerule=0pt,
  halign=left,
  fontupper=\fzkai
}


%% verbatim 环境无法直接在新环境中使用
%% 换用 \VerbatimEnvironment \begin{Verbatim}
\RequirePackage{fancyvrb}

%% 命令行
\newenvironment{shellBox}
{%
  \VerbatimEnvironment
  \begin{tcolorbox}[
    enhanced,
    arc=2pt,
    boxrule=.5pt,
    left=5pt, right=5pt, top=0pt, bottom=0pt,
    boxsep=5pt,
    colframe=colorSecondaryBorder,
    colback=colorSecondaryBackground,
    coltext=colorSecondaryText,
    title={},
    fontupper=\linespread{1.2}
  ]%
    \begin{Verbatim}
}
{%
    \end{Verbatim}
  \end{tcolorbox}
}

%% 命令行
\newenvironment{invertedShellBox}
{%
  \VerbatimEnvironment
  \begin{tcolorbox}[
    enhanced,
    arc=2pt,
    boxrule=.5pt,
    left=5pt, right=5pt, top=0pt, bottom=0pt,
    boxsep=5pt,
    colframe=colorSecondary,
    colback=colorSecondary,
    coltext=white,
    title={},
    fontupper=\linespread{1.2}
  ]%
    \begin{Verbatim}
}
{%
    \end{Verbatim}
  \end{tcolorbox}
}




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% code listings
%% 代码块设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{listings,verbatim}

\lstdefinelanguage{JavaScript}{
  keywords={do, if, in, for, let, new, try, var, case, else, enum, eval, null, this, true, void, with, await, break, catch, class, const, false, super, throw, while, yield, delete, export, import, public, return, static, switch, typeof, default, extends, finally, package, private, continue, debugger, function, arguments, interface, protected, implements, instanceof},
  sensitive=true,
  comment=[l]{//},
  morecomment=[s]{/*}{*/},
  morestring=[b]',
  morestring=[b]"
}

\lstdefinelanguage{TypeScript}{
  keywords={abstract, break, case, catch, class, const, continue, debugger, default, delete, do, else, enum, export, extends, false, finally, for, function, if, import, in, instanceof, new, null, return, super, switch, this, throw, true, try, typeof, var, void, while, with, as, implements, interface, let, package, private, protected, public, static, yield, any, boolean, constructor, declare, get, module, require, number, set, string, symbol, type, from, of},
  sensitive=true,
  comment=[l]{//},
  morecomment=[s]{/*}{*/},
  morestring=[b]',
  morestring=[b]"
}

\lstdefinelanguage{golang}{
  keywords={break, default, func, interface, select, case, defer, go, map, struct, chan, else, goto, package, switch, const, fallthrough, if, range, type, continue, for, import, return, var},
  sensitive=true,
  comment=[l]{//},
  morecomment=[s]{/*}{*/},
  morestring=[b]',
  morestring=[b]"
}

\lstdefinestyle{mystyle}{
  % Basic design
  basicstyle=\linespread{1.2}\ttfamily,
  frame=tb,
  framesep=5pt,
  framerule=.5pt,
  framexleftmargin=10pt,
  rulecolor=\color{black},
  abovecaptionskip=0pt,
  belowcaptionskip=5pt,
  aboveskip=5pt,
  backgroundcolor=\color{black!5!white},
  % Code design
  keywordstyle=\color{colorPrimary},
  commentstyle=\color{colorSuccess},
  stringstyle=\color{colorSecondary},
  numberstyle=\small\color{gray},
  breakatwhitespace=false,
  breaklines=true,
  captionpos=t,
  keepspaces=true,
  % Line numbers
  numbers=none,
  numbersep=15pt,
  xleftmargin=10pt,
  stepnumber=1,
  firstnumber=1,
  numberfirstline=true,
  % Code
  tabsize=4,
  showspaces=false,
  showstringspaces=false,
  showtabs=false,
  breaklines=true,
}
\lstset{style=mystyle}

%% 命令行
\lstdefinestyle{bashInputStyle}{
  backgroundcolor=\color{colorInfoBackground},
  basicstyle=\linespread{1.2}\ttfamily\color{colorDark},
  keepspaces=true,
  numbers=none,
  numbersep=10pt,
  frame=l,
  framerule=2pt,
  framesep=5pt,
  framexleftmargin=3pt,
  framextopmargin=-5pt,
  xleftmargin=10pt,
  rulecolor=\color{colorInfo},
  % Code
  tabsize=4,
  showspaces=false,
  showstringspaces=false,
  showtabs=false,
  breaklines=true,
}

%% 命令行输出
\lstdefinestyle{bashOutputStyle}{
  backgroundcolor=\color{black!5!white},
  basicstyle=\linespread{1.2}\ttfamily\color{colorDark},
  keepspaces=true,
  numbers=none,
  numbersep=10pt,
  frame=l,
  framerule=2pt,
  framesep=5pt,
  framexleftmargin=3pt,
  framextopmargin=-5pt,
  xleftmargin=10pt,
  rulecolor=\color{colorSecondary},
  % Code
  tabsize=4,
  showspaces=false,
  showstringspaces=false,
  showtabs=false,
  breaklines=true,
}

%% 代码列表标题
\RequirePackage{caption}
\DeclareCaptionFormat{codecaptionformat}{%
  %%\colorbox{black!20}{
  %%  \parbox{\textwidth}{#1#2\ttfamily#3}
  %%}
  \parbox{\textwidth}{\textcolor{violet}\faCode~\textcolor{violet}{#1#2}\hspace{.5em}\fzkai #3}
}
\captionsetup[lstlisting]{format=codecaptionformat}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Chinese names
%% 中文名称
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\lstlistingname}{CODE}
\renewcommand{\abstractname}{摘要}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% global settings
%% 以下是全局格式设定
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 添加首行缩进，两个字符
\RequirePackage{indentfirst}
\setlength{\parindent}{2em}

%% 行距
\linespread{1.5}

%% captions
\RequirePackage[singlelinecheck=false]{caption}
\DeclareCaptionFont{kai}{\fzkai}
\captionsetup[table]{belowskip=0pt,aboveskip=5pt,labelfont=kai,textfont=kai}
\captionsetup[figure]{belowskip=0pt,aboveskip=5pt,format=hang,labelfont=kai,textfont=kai}
