Files
ouc_latex_template/教材/elegantbook.cls
T
laoyang a4bfcac82a 新增《教材》LaTeX 模板,从 sre 教材抽取版式骨架 #25
源:D:\Yongquan\code\sre =《软件需求工程导论》完整教材
(13 章 + 5 附录,78 万字节,265 页 PDF,elegantbook 文档类)

## 新增文件

   教材/ouctextbook.sty    版式配置
   教材/elegantbook.cls    本地化过的文档类(改过字体)
   教材/教材.tex           示例正文(1 章 + 附录 + 参考文献)
   教材/reference.bib      参考文献库(虚构条目)
   教材/README.md          用法 + 踩坑记录

## 核心约束:字体的共用性

用户明确要求「注意字体的共用性」。原教材用 elegantbook 的
chinesefont=founder 档,加载方正四大字体:

   FZShuSong-Z01 / FZHei-B01 / FZKai-Z03 / FZFangSong-Z02

这些是**商业字体,不能随仓库分发**(#17 定下的规矩)。

### elegantbook 三档字体全都不通用

| 选项 | 实际字体 | 问题 |
|---|---|---|
| founder(默认) | 方正四大字体 | 商业字体,换机器就废 |
| ctexfont | 系统字体(Win=SimSun,macOS=PingFang) | 三平台三种样子 |
| nofont | 不设 | 不配置就报错 |

### 只写 nofont 还不够 —— cls 自身还硬编码字体

elegantbook.cls 第 176/184 行:

   \setmainfont{TeXGyreTermesX}[...]
   \setsansfont{texgyreheros}[...]

这两款在精简 TeX Live 上都没有,报 9 个错误连发:

   ! Package fontspec Error: The font "texgyreheros-regular" cannot be found

**实测:在 \documentclass 之后用 \setsansfont 覆盖无效** ——
类加载时字体族已注册失败,后面重新指定救不回来。

⇒ 所以本模板必须带一份**本地化的 cls**,改三处(都留了"本地化"注释):

| 位置 | 改动 |
|---|---|
| ~176 行 | TeXGyreTermesX → texgyretermes + Path=../fonts/tex-gyre-termes/ |
| ~184 行 | texgyreheros → OUCSans + Path=../fonts/ouc-sans/ |
| \maketitle | example-image → \ouc@coverblank |

这是本模板与仓库其他模板的**唯一结构性差异**:别的模板只要
\input{../fonts.tex},本模板还要那份改过字体的 cls。

## 踩到的三个坑

### 1. 封面不写 \cover{} 会插一张 "Image" 占位图

cls 第 1288~1300 行:
   \ifcsname @cover\endcsname ... \else
     \includegraphics[width=\linewidth]{example-image}   ← mwe 的灰底占位图

首页顶着 "Image" 两个大字。已把 else 分支换成空盒子。

### 2. 占位盒宽度不能是 0(这个坑耗了最久)

第一版 \rule{0pt}{0pt}(0 宽),立刻冒出:

   Overfull \hbox (5.00002pt too wide) in paragraph at lines 44--44

试过全部无效,溢出量死钉在 5.00002pt 不动:
  改 \hspace{2em} / \hspace{2.5em}     无效
  改 minipage 的 0.67/0.27\linewidth   无效
  改 tabular 列间距 @{}l@{}            无效
  改 \colorbox 的 \makebox[\hsize]     无效

根因:0 宽空盒让 \linewidth 在 titlepage 里与 \textwidth 差 5pt,
后续并排的 \parbox{0.8\textwidth} + 两个 minipage 整体超宽。

✅ 正解:给占位盒满宽
   \newcommand{\ouc@coverblank}{%
     \rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
实测 0 Overfull。

### 3. 封面色带改不动(一行 \colorlet 的位置问题)

cls 第 345 行 `\colorlet{coverlinecolor}{second}` 在**类加载末尾**执行,
把 coverlinecolor 绑到 second 色(black 模式下就是黑)。

⇒ 导言区写 \colorlet 会被覆盖,实测色带仍是纯黑。
必须用 \AtBeginDocument 排到它后面。

## build.sh 补了 bibtex 支持

原来只跑两遍 xelatex,教材的参考文献出不来。
新增:目录下有 .bib(排除 *-blx.bib 这种中间产物)就插一次 bibtex,
再补一遍 xelatex,最后跑统计那一遍。

## 验证

   8 页  error 0  Overfull 0  Underfull 0
   封面色带 RGB(32,178,170) 青绿,实测 fill=(0.125,0.698,0.667)
   封面无 example-image 占位

字体(PDF 内嵌实测,全部来自仓库):
   OUCSerif-Regular / -Bold        中文正文
   OUCKai-Regular                  中文斜体(楷体代)
   TeXGyreTermes-Regular/-Bold/-Italic   西文
   LMMono10-Regular                \texttt 等宽(TeX Live 自带)

→ **无方正、无 SimSun/SimHei、无 Times New Roman**

全库 16/16 通过(新增第 16 项,已加入 verify_all.sh)。

⚠️ Windows 端本机未能编译:TeX Live 写字体缓存
(C:\texlive\2022\texmf-var)被安全策略拦截,属环境限制非模板问题。
模板只依赖 TeX Live 标准宏包与发行版自带字体;原教材本身就是在
Windows + TeX Live 2022 上编出来的。

## .gitignore 补充

新增 *-blx.bib、*.run.xml(biblatex 中间产物)、*/.preview/(预览图)。

## 与原教材的差异

| 项 | 原教材 | 本模板 | 原因 |
|---|---|---|---|
| 封面图 | cover.jpg | 无(纯色带) | 模板不附图片 |
| 字体 | 方正四大字体 | 仓库开源字体 | 商业字体不能分发 |
| 西文无衬线 | texgyreheros | OUC Sans | 仓库没有 Hero |
| 正文 | 13 章 265 页 | 1 章示例 | 只抽骨架 |
2026-11-01 08:06:22 +08:00

1489 lines
50 KiB
OpenEdge ABL
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
%%%%%%%%%%%%%%%%%%%%%%
%% start of file `elegantbook.cls'.
%% Copyright 2013-2022 ElegantLaTeX (elegantlatex2e@gmail.com)
%%
%% This work may be distributed and/or modified freely
%% available at https://github.com/ElegantLaTeX/ElegantBook
%
%%%%%%%%%%%%%%%%%%%%%
% % !Mode:: "TeX:UTF-8"
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{elegantbook}[2022/12/31 v4.5 ElegantBook document class]
%%%
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\SetupKeyvalOptions{family=ELEGANT, prefix=ELEGANT@, setkeys=\kvsetkeys}
\newcommand{\ekv}[1]{\kvsetkeys{ELEGANT}{#1}}
% ----- Colors -----
\DeclareStringOption[blue]{color}
\DeclareStringOption[en]{lang}
\DeclareStringOption[answer]{result}
\DeclareStringOption[fancy]{mode}
\DeclareStringOption[normal]{device}
\DeclareStringOption[cm]{math}
\DeclareStringOption[marginfalse]{marginpar}
\DeclareStringOption[onecol]{toc}
\DeclareStringOption{scheme}
% ----- backward compatibility
\DeclareVoidOption{green}{\ekv{color=green}}
\DeclareVoidOption{cyan}{\ekv{color=cyan}}
\DeclareVoidOption{blue}{\ekv{color=blue}}
\DeclareVoidOption{gray}{\ekv{color=gray}}
\DeclareVoidOption{black}{\ekv{color=black}}
\DeclareVoidOption{nocolor}{\ekv{color=none}}
\DeclareVoidOption{chinese}{\ekv{scheme=chinese}}
\DeclareStringOption[ctexfont]{chinesefont}
\DeclareVoidOption{ctexfont}{\ekv{chinesefont=ctexfont}}
\DeclareVoidOption{founder}{\ekv{chinesefont=founder}}
\DeclareVoidOption{nofont}{\ekv{chinesefont=nofont}}
\DeclareVoidOption{en}{\ekv{lang=en}}
\DeclareVoidOption{cn}{\ekv{lang=cn}}
\DeclareVoidOption{it}{\ekv{lang=it}}
\DeclareVoidOption{fr}{\ekv{lang=fr}}
\DeclareVoidOption{nl}{\ekv{lang=nl}}
\DeclareVoidOption{hu}{\ekv{lang=hu}}
\DeclareVoidOption{de}{\ekv{lang=de}}
\DeclareVoidOption{mn}{\ekv{lang=mn}}
\DeclareVoidOption{pt}{\ekv{lang=pt}}
\DeclareVoidOption{jp}{\ekv{lang=jp}}
\DeclareVoidOption{fancy}{\ekv{mode=fancy}}
\DeclareVoidOption{simple}{\ekv{mode=simple}}
\DeclareBoolOption[false]{usesamecnt}
\DeclareVoidOption{answer}{\ekv{result=answer}}
\DeclareVoidOption{noanswer}{\ekv{result=noanswer}}
\DeclareVoidOption{normal}{\ekv{device=normal}}
\DeclareVoidOption{pad}{\ekv{device=pad}}
\DeclareStringOption[numeric-comp]{citestyle}
\DeclareStringOption[numeric]{bibstyle}
\DeclareVoidOption{newtx}{\ekv{math=newtx}}
\DeclareVoidOption{mtpro2}{\ekv{math=mtpro2}}
\DeclareVoidOption{cm}{\ekv{math=cm}}
\DeclareVoidOption{margintrue}{\ekv{marginpar=margintrue}}
\DeclareVoidOption{marginfalse}{\ekv{marginpar=marginfalse}}
\DeclareVoidOption{onecol}{\ekv{toc=onecol}}
\DeclareVoidOption{twocol}{\ekv{toc=twocol}}
\DeclareStringOption[chapter]{thmcnt}
\DeclareVoidOption{chapter}{\ekv{thmcnt=chapter}}
\DeclareVoidOption{section}{\ekv{thmcnt=section}}
\DeclareStringOption[bibtex]{bibend}
\DeclareVoidOption{biber}{\ekv{bibend=biber}}
\DeclareVoidOption{bibtex}{\ekv{bibend=bibtex}}
% ----- Math option -----
\newcommand\mailto[1]{\href{mailto:#1}{\nolinkurl{#1}}}
% ----- Title Style -----
\DeclareStringOption[hang]{titlestyle}[hang]
% ----- backward compatibility
\DeclareVoidOption{hang}{\ekv{titlestyle=hang}}
\DeclareVoidOption{display}{\ekv{titlestyle=display}}
% ----- Default Options -----
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{book}}
\ProcessKeyvalOptions*\relax
% \ProcessOptions*\relax
\LoadClass[a4paper,oneside]{book}
\RequirePackage{setspace}
\RequirePackage{csquotes}
\RequirePackage{hyperref}
\hypersetup{
breaklinks,
unicode,
linktoc=all,
bookmarksnumbered=true,
bookmarksopen=true,
pdfkeywords={ElegantBook},
colorlinks,
linkcolor=winered,
citecolor=winered,
urlcolor=winered,
plainpages=false,
pdfstartview=FitH,
pdfborder={0 0 0},
linktocpage
}
\newif\ifELEGANT@Hy@later
\@ifpackagelater{hyperref}{2022/05/16}
{\ELEGANT@Hy@latertrue}
{\ELEGANT@Hy@laterfalse}
%% device settings
\RequirePackage{geometry}
\ifdefstring{\ELEGANT@device}{normal}{
\geometry{
a4paper,
top=25.4mm, bottom=25.4mm,
left=20mm, right=20mm,
headheight=2.17cm,
headsep=4mm,
footskip=12mm
}
\ifdefstring{\ELEGANT@marginpar}{margintrue}{
\geometry{
marginparwidth=5cm, marginparsep=5mm,
left=2cm,right=7cm}}{\relax}}{
\relax}
\ifdefstring{\ELEGANT@device}{pad}{
\geometry{
paperwidth=7.5in,
paperheight=10in,
margin=16mm,
headheight=2.17cm,
footskip=4mm
}}{\relax}
\RequirePackage{indentfirst,comment}
% fontsetting
\ifdefstring{\ELEGANT@math}{mtpro2}{
\let\Bbbk\relax
\RequirePackage[lite]{mtpro2}
}{\relax}
\setcounter{tocdepth}{1}
\renewcommand{\baselinestretch}{1.2}
\PassOptionsToPackage{no-math}{fontspec}
\PassOptionsToPackage{quiet}{fontspec}
\RequirePackage{iftex}
\ifpdftex
\RequirePackage{newtxtext}
\RequirePackage[scaled=.90]{helvet}
\else
\RequirePackage[no-math]{fontspec}
% ===== 本地化:改用仓库自带字体(原版用 TeXGyreTermesX / texgyreheros)=====
\setmainfont{texgyretermes}[
UprightFont = *-regular ,
BoldFont = *-bold ,
ItalicFont = *-italic ,
BoldItalicFont = *-bolditalic ,
Extension = .otf ,
Path = ../fonts/tex-gyre-termes/ ,
Scale = 1.0]
\setsansfont{OUCSans}[
UprightFont = *-Regular ,
BoldFont = *-Bold ,
Extension = .otf ,
Path = ../fonts/ouc-sans/ ,
Scale = 1.0]
\fi
\ifdefstring{\ELEGANT@lang}{cn}{
\ifdefstring{\ELEGANT@chinesefont}{founder}{
\RequirePackage[UTF8, scheme=plain, fontset=none]{ctex}
\setCJKmainfont[BoldFont={FZHei-B01},ItalicFont={FZKai-Z03}]{FZShuSong-Z01}
\setCJKsansfont[BoldFont={FZHei-B01}]{FZKai-Z03}
\setCJKmonofont[BoldFont={FZHei-B01}]{FZFangSong-Z02}
\setCJKfamilyfont{zhsong}{FZShuSong-Z01}
\setCJKfamilyfont{zhhei}{FZHei-B01}
\setCJKfamilyfont{zhkai}[BoldFont={FZHei-B01}]{FZKai-Z03}
\setCJKfamilyfont{zhfs}[BoldFont={FZHei-B01}]{FZFangSong-Z02}
\newcommand*{\songti}{\CJKfamily{zhsong}}
\newcommand*{\heiti}{\CJKfamily{zhhei}}
\newcommand*{\kaishu}{\CJKfamily{zhkai}}
\newcommand*{\fangsong}{\CJKfamily{zhfs}}}{\relax}
\ifdefstring{\ELEGANT@chinesefont}{nofont}{
\RequirePackage[UTF8,scheme=plain,fontset=none]{ctex}
\xeCJKsetup{AutoFakeBold=true}
}{\relax}
\ifdefstring{\ELEGANT@chinesefont}{ctexfont}{
\RequirePackage[UTF8,scheme=plain]{ctex}
\xeCJKsetup{AutoFakeBold=true}
}{\relax}
\AfterEndPreamble{
\setlength\parindent{2\ccwd}}
}{\relax}
\ifcsname heiti\endcsname
\newcommand{\cbfseries}{\heiti}
\else
\newcommand{\cbfseries}{\bfseries}
\fi
\ifcsname kaishu\endcsname
\newcommand{\citshape}{\kaishu}
\else
\newcommand{\citshape}{\itshape}
\fi
\ifcsname kaishu\endcsname
\newcommand{\cnormal}{\kaishu}
\else
\newcommand{\cnormal}{\normalfont}
\fi
\ifcsname fangsong\endcsname
\newcommand{\cfs}{\fangsong}
\else
\newcommand{\cfs}{\normalfont}
\fi
\RequirePackage{anyfontsize}
\ifdefstring{\ELEGANT@math}{newtx}{
\let\oldencodingdefault\encodingdefault
\let\oldrmdefault\rmdefault
\let\oldsfdefault\sfdefault
\let\oldttdefault\ttdefault
\def\encodingdefault{T1}
\renewcommand{\rmdefault}{ntxtlf}
\renewcommand{\sfdefault}{qhv}
\renewcommand{\ttdefault}{ntxtt}
\RequirePackage{newtxmath}
\let\encodingdefault\oldencodingdefault
\let\rmdefault\oldrmdefault
\let\sfdefault\oldsfdefault
\let\ttdefault\oldttdefault
\let\Bbbk\relax
\RequirePackage{esint}
%%% use yhmath pkg, uncomment following code
% \let\oldwidering\widering
% \let\widering\undefined
% \RequirePackage{yhmath}
% \let\widering\oldwidering
%%% use esvect pkg, uncomment following code
% \RequirePackage{esvect}
\DeclareSymbolFont{CMlargesymbols}{OMX}{cmex}{m}{n}
\let\sumop\relax\let\prodop\relax
\DeclareMathSymbol{\sumop}{\mathop}{CMlargesymbols}{"50}
\DeclareMathSymbol{\prodop}{\mathop}{CMlargesymbols}{"51}
}{\relax}
% ----- Handle Colors -----
%% 章节以及页脚图形
\RequirePackage[table]{xcolor}
\ifdefstring{\ELEGANT@color}{green}{
\definecolor{structurecolor}{RGB}{0,120,2}%
\definecolor{main}{RGB}{0,120,2}%
\definecolor{second}{RGB}{230,90,7}%
\definecolor{third}{RGB}{0,160,152}%
}{\relax}
\ifdefstring{\ELEGANT@color}{cyan}{
\definecolor{structurecolor}{RGB}{31,186,190}%
\definecolor{main}{RGB}{59,180,5}%
\definecolor{second}{RGB}{175,153,8}%
\definecolor{third}{RGB}{244,105,102}%
}{\relax}
\ifdefstring{\ELEGANT@color}{blue}{
\definecolor{structurecolor}{RGB}{60,113,183}
\definecolor{main}{RGB}{0,166,82}%
\definecolor{second}{RGB}{255,134,24}%
\definecolor{third}{RGB}{0,174,247}%
}{\relax}
\ifdefstring{\ELEGANT@color}{gray}{
\definecolor{structurecolor}{RGB}{150,150,150}
\definecolor{main}{RGB}{150,150,150}%
\definecolor{second}{RGB}{150,150,150}%
\definecolor{third}{RGB}{150,150,150}%
}{\relax}
\ifdefstring{\ELEGANT@color}{black}{
\definecolor{structurecolor}{RGB}{0,0,0}
\definecolor{main}{RGB}{0,0,0}%
\definecolor{second}{RGB}{0,0,0}%
\definecolor{third}{RGB}{0,0,0}%
}{\relax}
%green color
\definecolor{structure1}{RGB}{0,120,2}%
\definecolor{main1}{RGB}{0,120,2}%
\definecolor{second1}{RGB}{230,90,7}%
\definecolor{third1}{RGB}{0,160,152}%
%cyan color
\definecolor{structure2}{RGB}{31,186,190}%
\definecolor{main2}{RGB}{59,180,5}%
\definecolor{second2}{RGB}{175,153,8}%
\definecolor{third2}{RGB}{244,105,102}%
%blue color
\definecolor{structure3}{RGB}{60,113,183}
\definecolor{main3}{RGB}{0,166,82}%
\definecolor{second3}{RGB}{255,134,24}%
\definecolor{third3}{RGB}{0,174,247}%
% gray color
\definecolor{structure4}{RGB}{150,150,150}
\definecolor{main4}{RGB}{150,150,150}%
\definecolor{second4}{RGB}{150,150,150}%
\definecolor{third4}{RGB}{150,150,150}%
% black color
\definecolor{structure5}{RGB}{0,0,0}
\definecolor{main5}{RGB}{0,0,0}%
\definecolor{second5}{RGB}{0,0,0}%
\definecolor{third5}{RGB}{0,0,0}%
% corlor definition
\definecolor{winered}{rgb}{0.5,0,0}
\definecolor{bule}{RGB}{18,29,57}
\colorlet{coverlinecolor}{second}
% ----- Title Style -----
\ifdefstring{\ELEGANT@titlestyle}{hang}{\def\style{hang}}{\relax}
\ifdefstring{\ELEGANT@titlestyle}{display}{\def\style{display}}{\relax}
% reference:
% https://tex.stackexchange.com/questions/58506/how-to-make-a-new-command-similar-to-author
% https://pastebin.com/C8W4axzV
\newcommand\email[1]{\href{mailto:#1}{\nolinkurl{#1}}}
\global\let\@title\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\newcommand{\subtitle}[1]{\gdef\@subtitle{#1}}
\newcommand{\institute}[1]{\gdef\@institute{#1}}
\newcommand{\version}[1]{\gdef\@version{#1}}
\newcommand{\extrainfo}[1]{\gdef\@extrainfo{#1}}
\RequirePackage{mwe}
\newcommand{\logo}[1]{\gdef\@logo{#1}}
\newcommand{\cover}[1]{\gdef\@cover{#1}}
\newcommand{\question}[1]{{\par\citshape #1}\\[0.2ex]}
\RequirePackage{enumerate}
% list/itemize/enumerate setting
\RequirePackage[shortlabels,inline]{enumitem}
\setlist{nolistsep}
\RequirePackage[labelfont={bf,color=structurecolor}]{caption}
\captionsetup[table]{skip=3pt}
\captionsetup[figure]{skip=3pt}
\AtBeginDocument{
\setlength{\abovedisplayskip}{3pt}
\setlength{\belowdisplayskip}{3pt}
\RequirePackage[flushmargin,stable]{footmisc}
\setlength{\footnotesep}{12pt}
}
\RequirePackage{graphicx}
%\RequirePackage{enumerate}
\RequirePackage{amsmath,mathrsfs,amsfonts,amssymb}
% \providecommand\qed{}
% \renewcommand{\qed}{\hfill\ensuremath{\square}}
\RequirePackage{booktabs}
\RequirePackage{multicol,multirow}
\RequirePackage{fancyvrb}
\RequirePackage{makecell,lipsum,hologo}
%%中文结构名字
%% 章节设置
\RequirePackage[center,pagestyles]{titlesec}
\RequirePackage[title,titletoc,header]{appendix}
\RequirePackage[
backend=\ELEGANT@bibend,
citestyle=\ELEGANT@citestyle,
bibstyle=\ELEGANT@bibstyle]{biblatex}
\ifdefstring{\ELEGANT@lang}{cn}{
\renewcommand{\baselinestretch}{1.3}
\renewcommand{\contentsname}{目录}
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\partname}{\color{structurecolor}}
\renewcommand{\thepart}{第\zhnumber{\arabic{part}}部分}
\renewcommand{\listfigurename}{插图目录}
\renewcommand{\listtablename}{表格目录}
\renewcommand{\bibname}{参考文献}
\newcommand{\ebibname}{参考文献}
\renewcommand{\appendixname}{附录}
\renewcommand{\appendixtocname}{附录}
\renewcommand{\indexname}{索\hspace{2em}引}
\newcommand\figref[1]{\textbf{图}~\ref{#1}}
\newcommand\tabref[1]{\textbf{表}~\ref{#1}}
\newcommand{\authorname}{\citshape 作者:}
\newcommand{\institutename}{\citshape 组织:}
\newcommand{\datename}{\citshape 时间:}
\newcommand{\versionname}{\citshape 版本:}
\newcommand{\notename}{笔记}
\renewcommand*{\proofname}{证明}
\newcommand{\definitionname}{定义}
\newcommand{\theoremname}{定理}
\newcommand{\axiomname}{公理}
\newcommand{\postulatename}{公设}
\newcommand{\lemmaname}{引理}
\newcommand{\propositionname}{命题}
\newcommand{\corollaryname}{推论}
\newcommand{\examplename}{例题} %
\newcommand{\instancename}{示例} %
\newcommand{\problemname}{问题} % 问题
\newcommand{\exercisename}{练习} % 练习=习题
\newcommand{\remarkname}{注}
\newcommand{\assumptionname}{假设}
\newcommand{\conclusionname}{结论}
\newcommand{\solutionname}{解}
\newcommand{\propertyname}{性质}
\newcommand{\introductionname}{内容提要}
\newcommand\bioinfo[2]{\gdef\@bioinfo{{\citshape #1}:#2}}
\newcommand{\updatename}{更新:}
\newcommand{\historyname}{版本更新历史}
\newcommand{\beforechap}{第}
\newcommand{\afterchap}{章}
}{\relax}
\ifdefstring{\ELEGANT@lang}{en}{
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Figure}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Table}~\ref{#1}}
\renewcommand{\chaptername}{Chapter}
\renewcommand{\partname}{\color{structurecolor} Part}
\newcommand{\authorname}{\textbf{Author: }}
\newcommand{\institutename}{\textbf{Institute: }}
\newcommand{\datename}{\textbf{Date: }}
\newcommand{\versionname}{\textbf{Version: }}
\newcommand{\notename}{Note}
\newcommand{\proofname}{Proof}
\newcommand{\problemname}{Problem}
\newcommand{\definitionname}{Definition}
\newcommand{\theoremname}{Theorem}
\newcommand{\axiomname}{Axiom}
\newcommand{\postulatename}{Postulate}
\newcommand{\lemmaname}{Lemma}
\newcommand{\propositionname}{Proposition}
\newcommand{\corollaryname}{Corollary}
\newcommand{\examplename}{Example}
\newcommand{\exercisename}{Exercise}
\newcommand{\remarkname}{Remark}
\newcommand{\assumptionname}{Assumption}
\newcommand{\conclusionname}{Conclusion}
\newcommand{\solutionname}{Solution}
\newcommand{\propertyname}{Property}
\newcommand{\introductionname}{Introduction}
\renewcommand{\appendixname}{Appendix}
\newcommand{\ebibname}{Bibliography}
% \newcommand{\problemsetname}{Exercise}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Updates:}
\newcommand{\historyname}{Version History}
}{\relax}
\ifdefstring{\ELEGANT@lang}{it}{
% \RequirePackage[utf8]{inputenc}
\RequirePackage[italian]{babel}
% \RequirePackage[T1]{fontenc}
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Figura}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Tabella}~\ref{#1}}
\renewcommand{\chaptername}{Chapter}
\newcommand{\authorname}{\textbf{Autore: }}
\newcommand{\institutename}{\textbf{Istituto: }}
\newcommand{\datename}{\textbf{Data: }}
\newcommand{\versionname}{\textbf{Versione: }}
\newcommand{\notename}{Nota}
\newcommand{\proofname}{Dimostrazione}
\newcommand{\problemname}{Problema}
\newcommand{\definitionname}{Definizione}
\newcommand{\theoremname}{Teorema}
\newcommand{\axiomname}{Assioma}
\newcommand{\postulatename}{Postulato}
\newcommand{\lemmaname}{Lemma}
\newcommand{\propositionname}{Proposizione}
\newcommand{\corollaryname}{Corollario}
\newcommand{\examplename}{Esempio}
\newcommand{\exercisename}{Esercizio}
\newcommand{\remarkname}{Commento}
\newcommand{\assumptionname}{Assunto}
\newcommand{\conclusionname}{Conclusione}
\newcommand{\solutionname}{Soluzione}
\newcommand{\propertyname}{Proprietà}
\newcommand{\introductionname}{Introduzione}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Aggiornamenti:}
\newcommand{\ebibname}{Bibliografia}
\newcommand{\historyname}{Cronologia delle versioni}
}{\relax}
\ifdefstring{\ELEGANT@lang}{fr}{
\RequirePackage[utf8]{inputenc}
\RequirePackage[T1]{fontenc}
\RequirePackage[french]{babel}
\setlength\parindent{2em}
\renewcommand\figref[1]{\textbf{Figure}\ref{#1}}
\renewcommand\tabref[1]{\textbf{Tableau}\ref{#1}}
\renewcommand{\chaptername}{Chapitre}
\renewcommand{\authorname}{\textbf{Auteur: }}
\renewcommand{\institutename}{\textbf{Institut: }}
\renewcommand{\datename}{\textbf{Date: }}
\renewcommand{\versionname}{\textbf{Version: }}
\renewcommand{\notename}{Note}
\renewcommand{\proofname}{Démonstration}
\renewcommand{\problemname}{Problème}
\renewcommand{\definitionname}{Définition}
\renewcommand{\theoremname}{Théorème}
\renewcommand{\axiomname}{Axiôme}
\renewcommand{\postulatename}{Postulat}
\renewcommand{\lemmaname}{Lemme}
\renewcommand{\propositionname}{Proposition}
\renewcommand{\corollaryname}{Corollaire}
\renewcommand{\examplename}{Exemple}
\renewcommand{\exercisename}{Exercice}
\renewcommand{\remarkname}{Remarque}
\renewcommand{\assumptionname}{Supposition}
\renewcommand{\conclusionname}{Conclusion}
\renewcommand{\solutionname}{Solution}
\renewcommand{\propertyname}{Propriété}
\renewcommand{\introductionname}{Introduction}
\renewcommand{\problemsetname}{Exercice}
\renewcommand{\updatename}{Mises à jour:}
\newcommand{\ebibname}{Bibliographie}
\renewcommand{\historyname}{Historique des versions}
}{\relax}
\ifdefstring{\ELEGANT@lang}{nl}{
\RequirePackage[dutch]{babel}
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Figuur}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Tabel}~\ref{#1}}
\renewcommand{\chaptername}{Hoofdstuk}
\newcommand{\authorname}{\textbf{Auteur: }}
\newcommand{\institutename}{\textbf{Instituut: }}
\newcommand{\datename}{\textbf{Datum: }}
\newcommand{\versionname}{\textbf{Versie: }}
\newcommand{\notename}{Opmerking}
\newcommand{\proofname}{Bewijs}
\newcommand{\problemname}{Probleem}
\newcommand{\definitionname}{Definitie}
\newcommand{\theoremname}{Stelling}
\newcommand{\axiomname}{Uitgangspunt}
\newcommand{\postulatename}{Hypothese}
\newcommand{\lemmaname}{Lemma}
\newcommand{\propositionname}{Voorstel}
\newcommand{\corollaryname}{Gevolgtrekking}
\newcommand{\examplename}{Voorbeeld}
\newcommand{\exercisename}{Oefening}
\newcommand{\remarkname}{Commentaar}
\newcommand{\assumptionname}{Veronderstelling}
\newcommand{\conclusionname}{Besluit}
\newcommand{\solutionname}{Oplossing}
\newcommand{\propertyname}{Eigenschap}
\newcommand{\introductionname}{Introductie}
\newcommand{\problemsetname}{Probleemcomplex}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Update:}
\newcommand{\ebibname}{Bibliographie}
\newcommand{\historyname}{Versie Geschiedenis}
}{\relax}
\ifdefstring{\ELEGANT@lang}{hu}{
\RequirePackage[magyar]{babel}
\setlength\parindent{2em}
\newcommand\figref[1]{\ref{#1}~\textbf{Ábra}}
\newcommand\tabref[1]{\ref{#1}~\textbf{Táblázat}}
\renewcommand{\chaptername}{Fejezet}
\newcommand{\authorname}{\textbf{Szerző: }}
\newcommand{\institutename}{\textbf{Intézmény: }}
\newcommand{\datename}{\textbf{Dátum: }}
\newcommand{\versionname}{\textbf{Verziószám: }}
\newcommand{\notename}{Jegyzet}
\newcommand{\proofname}{Bizonyítás}
\newcommand{\problemname}{Probléma}
\newcommand{\definitionname}{Definíció}
\newcommand{\theoremname}{Tétel}
\newcommand{\axiomname}{Axióma}
\newcommand{\postulatename}{Követelmény}
\newcommand{\lemmaname}{Lemma}
\newcommand{\propositionname}{Előzmény}
\newcommand{\corollaryname}{Következmény}
\newcommand{\examplename}{Példa}
\newcommand{\exercisename}{Feladat}
\newcommand{\remarkname}{Megjegyzés}
\newcommand{\assumptionname}{Sejtés}
\newcommand{\conclusionname}{Összefoglalás}
\newcommand{\solutionname}{Megoldás}
\newcommand{\propertyname}{Tulajdonság}
\newcommand{\introductionname}{Bevezetés}
\newcommand{\problemsetname}{Feladatok}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Frissítve:}
\newcommand{\ebibname}{Bibliográfia}
\newcommand{\historyname}{Korábbi verziók}
}{\relax}
\ifdefstring{\ELEGANT@lang}{de}{
\setlength\parindent{2em}
\renewcommand{\contentsname}{Inhaltsverzeichnis}
\newcommand\figref[1]{\textbf{Figur}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Tabelle}~\ref{#1}}
\renewcommand{\partname}{\color{structurecolor} Teil}
\renewcommand{\listfigurename}{Abbildungsverzeichnis}
\renewcommand{\listtablename}{Tabellenverzeichnis}
\renewcommand{\bibname}{Bibliographie}
\renewcommand{\appendixname}{Anhang}
\renewcommand{\chaptername}{Kapitel}
\newcommand{\authorname}{\textbf{Autor: }}
\newcommand{\institutename}{\textbf{Institut: }}
\newcommand{\datename}{\textbf{Datum: }}
\newcommand{\versionname}{\textbf{Version: }}
\newcommand{\notename}{Notiz}
\newcommand{\proofname}{Beweis}
\newcommand{\problemname}{Problem}
\newcommand{\definitionname}{Definition}
\newcommand{\theoremname}{Theorem}
\newcommand{\axiomname}{Axiom}
\newcommand{\postulatename}{Postulat}
\newcommand{\lemmaname}{Lemma}
\newcommand{\propositionname}{Behauptung}
\newcommand{\corollaryname}{Corollary}
\newcommand{\examplename}{Beispiel}
\newcommand{\instancename}{Beispiel} %
\newcommand{\exercisename}{\"{U}bung}
\newcommand{\remarkname}{Anmerkung}
\newcommand{\assumptionname}{Annahme}
\newcommand{\conclusionname}{Abschluss}
\newcommand{\solutionname}{Aufl\"{o}sung}
\newcommand{\propertyname}{Property}
\newcommand{\introductionname}{Einleitung}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Updates:}
\renewcommand{\ebibname}{Bibliographie}
\newcommand{\historyname}{Version der Geschichte}
}{\relax}
\ifdefstring{\ELEGANT@lang}{es}{
\RequirePackage[spanish]{babel}
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Figura}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Tabla}~\ref{#1}}
\renewcommand{\spanishchaptername}{Capítulo}
\newcommand{\authorname}{\textbf{Autor: }}
\newcommand{\institutename}{\textbf{Instituto: }}
\newcommand{\datename}{\textbf{Fecha: }}
\newcommand{\versionname}{\textbf{Versión: }}
\newcommand{\notename}{Nota}
\newcommand{\proofname}{Demostración}
\newcommand{\problemname}{Problema}
\newcommand{\definitionname}{Definición}
\newcommand{\theoremname}{Teorema}
\newcommand{\axiomname}{Axioma}
\newcommand{\postulatename}{Postulado}
\newcommand{\lemmaname}{Lema}
\newcommand{\propositionname}{Proposición}
\newcommand{\corollaryname}{Corolario}
\newcommand{\examplename}{Ejemplo}
\newcommand{\exercisename}{Ejercicio}
\newcommand{\remarkname}{Comentario}
\newcommand{\assumptionname}{Asunto}
\newcommand{\conclusionname}{Conclusión}
\newcommand{\solutionname}{Solución}
\newcommand{\propertyname}{Propiedad}
\newcommand{\introductionname}{Introducción}
\newcommand{\problemsetname}{Ejercicio}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Actualización:}
\newcommand{\ebibname}{Bibliografía}
\newcommand{\historyname}{Historial de versiones}
}{\relax}
\ifdefstring{\ELEGANT@lang}{mn}{
\RequirePackage[mongolian]{babel}
\RequirePackage[utf8]{inputenc}
\RequirePackage[T2A]{fontenc}
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Зураг}\ref{#1}}
\newcommand\tabref[1]{\textbf{Хүснэгт}\ref{#1}}
\renewcommand{\chaptername}{Бүлэг}
\newcommand{\authorname}{\textbf{Зохиогч: }}
\newcommand{\institutename}{\textbf{Сургууль: }}
\newcommand{\datename}{\textbf{Огноо: }}
\newcommand{\versionname}{\textbf{Хувилбар: }}
\newcommand{\notename}{Тэмдэглэл}
\newcommand{\proofname}{Баталгаа}
\newcommand{\problemname}{Бодлого}
\newcommand{\definitionname}{Тодорхойлолт}
\newcommand{\theoremname}{Томьёо}
\newcommand{\axiomname}{Аксиом}
\newcommand{\postulatename}{Постулат}
\newcommand{\lemmaname}{Лемма}
\newcommand{\propositionname}{Таамаглал}
\newcommand{\corollaryname}{Үр дүн}
\newcommand{\examplename}{Жишээ}
\newcommand{\exercisename}{Дасгал}
\newcommand{\remarkname}{Тайлбар}
\newcommand{\assumptionname}{Урьдчилсан нөхцөл}
\newcommand{\conclusionname}{Дүгнэлт}
\newcommand{\solutionname}{Хариулт}
\newcommand{\propertyname}{Шинж чанар}
\newcommand{\introductionname}{Удиртгал}
\newcommand{\problemsetname}{Бодлогууд}
\newcommand\bioinfo[2]{\gdef@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Шинэчлэлтүүд:}
\newcommand{\ebibname}{Ном зүй}
\newcommand{\historyname}{Хувилбарын түүх}
}{\relax}
\ifdefstring{\ELEGANT@lang}{pt}{
\RequirePackage[portuguese]{babel}
\setlength\parindent{2em}
\newcommand\figref[1]{\textbf{Figura}~\ref{#1}}
\newcommand\tabref[1]{\textbf{Tabela}~\ref{#1}}
\renewcommand{\chaptername}{Capítulo}
\newcommand{\authorname}{\textbf{Autor: }}
\newcommand{\institutename}{\textbf{Instituição: }}
\newcommand{\datename}{\textbf{Data: }}
\newcommand{\versionname}{\textbf{Versão: }}
\newcommand{\notename}{Observação}
\newcommand{\proofname}{Demostração}
\newcommand{\problemname}{Problema}
\newcommand{\definitionname}{Definição}
\newcommand{\theoremname}{Teorema}
\newcommand{\axiomname}{Axioma}
\newcommand{\postulatename}{Postulado}
\newcommand{\lemmaname}{Lema}
\newcommand{\propositionname}{Proposição}
\newcommand{\corollaryname}{Corolário}
\newcommand{\examplename}{Exemplo}
\newcommand{\exercisename}{Exercício}
\newcommand{\remarkname}{Comentário}
\newcommand{\assumptionname}{Assunto}
\newcommand{\conclusionname}{Conclusão}
\newcommand{\solutionname}{Soluções}
\newcommand{\propertyname}{Propiedade}
\newcommand{\introductionname}{Introdução}
\newcommand{\problemsetname}{Questão}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{Atualização: }
\newcommand{\ebibname}{Bibliografia}
\newcommand{\historyname}{Histórico de versões}
}{\relax}
\ifdefstring{\ELEGANT@lang}{jp}{
\RequirePackage{luatexja}
\setlength\parindent{2em}
\renewcommand{\contentsname}{目次}
\newcommand\figref[1]{\textbf{図}~\ref{#1}}
\newcommand\tabref[1]{\textbf{表}~\ref{#1}}
\renewcommand{\partname}{\color{structurecolor}}
\renewcommand{\listfigurename}{イラストカタログ}
\renewcommand{\listtablename}{表カタログ}
\renewcommand{\bibname}{参考文献}
\renewcommand{\appendixname}{付録}
\renewcommand{\chaptername}{第 \thechapter 章}
\newcommand{\authorname}{\textbf{著者:}}
\newcommand{\institutename}{\textbf{組織団体:}}
\newcommand{\datename}{\textbf{日付:}}
\newcommand{\versionname}{\textbf{\citshape バージョン:}}
\newcommand{\notename}{ノート}
\newcommand{\proofname}{証明}
\newcommand{\problemname}{問題}
\newcommand{\definitionname}{定義}
\newcommand{\theoremname}{定理}
\newcommand{\axiomname}{公理}
\newcommand{\postulatename}{公準}
\newcommand{\lemmaname}{補題}
\newcommand{\propositionname}{命題}
\newcommand{\corollaryname}{系}
\newcommand{\examplename}{例題}
\newcommand{\instancename}{例}
\newcommand{\exercisename}{練習}
\newcommand{\remarkname}{注}
\newcommand{\assumptionname}{仮設}
\newcommand{\conclusionname}{結論}
\newcommand{\solutionname}{解答}
\newcommand{\propertyname}{性質}
\newcommand{\introductionname}{内容概要}
\newcommand\bioinfo[2]{\gdef\@bioinfo{\textbf{#1}: #2}}
\newcommand{\updatename}{更新:}
\newcommand{\ebibname}{参考文献}
\newcommand{\historyname}{バージョン更新履歴}
}{\relax}
\graphicspath{{./figure/}{./figures/}{./image/}{./images/}{./graphics/}{./graphic/}{./pictures/}{./picture/}}
\RequirePackage{tikz} %% load tikz without tikz
\usetikzlibrary{backgrounds,calc,shadows,positioning,fit}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=1pt] (char) {#1};}}
% https://tex.stackexchange.com/questions/7032/good-way-to-make-textcircled-numbers
\newcommand*{\eitemi}{\tikz \draw [baseline, ball color=structurecolor,draw=none] circle (2pt);}
\newcommand*{\eitemii}{\tikz \draw [baseline, fill=structurecolor,draw=none,circular drop shadow] circle (2pt);}
\newcommand*{\eitemiii}{\tikz \draw [baseline, fill=structurecolor,draw=none] circle (2pt);}
\setlist[enumerate,1]{label=\color{structurecolor}\arabic*.}
\setlist[enumerate,2]{label=\color{structurecolor}(\alph*).}
\setlist[enumerate,3]{label=\color{structurecolor}\Roman*.}
\setlist[enumerate,4]{label=\color{structurecolor}\Alph*.}
\setlist[itemize,1]{label={\eitemi}}
\setlist[itemize,2]{label={\eitemii}}
\setlist[itemize,3]{label={\eitemiii}}
\RequirePackage{apptools}
% appendix chapter:
\ifdefstring{\ELEGANT@lang}{cn}{
\ifdefstring{\ELEGANT@scheme}{chinese}{
\newcommand{\xchaptertitle}{第\zhnumber{\arabic{chapter}}章} }{
\newcommand{\xchaptertitle}{第 \thechapter{} 章}}
% Hyperref 2022/05/16's changelog.txt said
% * nameref is loaded always and earlier (issue#235)
\AtBeginDocument{
\ifELEGANT@Hy@later
\patchcmd{\NR@chapter}%
{\numberline{\thechapter}}{\numberline{\xchaptertitle}}%
{}{\fail}
\else
\patchcmd{\Hy@org@chapter}%
{\numberline{\thechapter}}{\numberline{\xchaptertitle}}%
{}{\fail}
\fi
}
}
{\newcommand{\xchaptertitle}{\chaptername~\thechapter~}}
\setcounter{secnumdepth}{5}
\titleformat{\chapter}[\style]{\bfseries}{
\filcenter\LARGE\enspace\bfseries{\color{structurecolor} \IfAppendix{\appendixname\;\thechapter\;}{\xchaptertitle\;}}}{1pt}{
\LARGE\bfseries\color{structurecolor}\filcenter}[]
\titleformat{\section}[hang]{\bfseries}{
\Large\bfseries{\color{structurecolor}\thesection}\enspace}{1pt}{%
\color{structurecolor}\Large\bfseries\filright}
\titleformat{\subsection}[hang]{\bfseries}{
\large\bfseries\color{structurecolor}\thesubsection\enspace}{1pt}{%
\color{structurecolor}\large\bfseries\filright}
\titleformat{\subsubsection}[hang]{\bfseries}{
\large\bfseries\color{structurecolor}\thesubsubsection\enspace}{1pt}{%
\color{structurecolor}\large\bfseries\filright}
\titlespacing{\chapter}{0pt}{-20pt}{1.3\baselineskip}
%\titlespacing{\subsection}{0pt}{0.5\baselineskip}{-\baselineskip}
%%define the
%%definition theorem postulate axiom corollary lemma proposition
%%and proof environment
\RequirePackage{pifont,manfnt,bbding}
\RequirePackage[many]{tcolorbox}
% \newlength{\normalparindent}
% \setlength{\normalparindent}{\parindent}
\newcommand{\ELEGANT@tmp@tl}{}
\ifELEGANT@usesamecnt
\newcounter{ELEGANT@samecnt}
\counterwithin{ELEGANT@samecnt}{\ELEGANT@thmcnt}
\tcbset{
new/usesamecnt/.style = {use counter = ELEGANT@samecnt}
}
\else
\tcbset{
new/usesamecnt/.style = {}
}
\fi
\ifdefstring{\ELEGANT@mode}{fancy}{
\tcbset{
common/.style={
fontupper=\citshape,
lower separated=false,
% before upper={\setlength{\parindent}{\normalparindent}},
coltitle=white,
colback=gray!5,
boxrule=0.5pt,
fonttitle=\bfseries,
enhanced,
breakable,
top=8pt,
before skip=8pt,
attach boxed title to top left={
yshift=-0.11in,
xshift=0.15in},
boxed title style={
boxrule=0pt,
colframe=white,
arc=0pt,
outer arc=0pt},
separator sign={.},},
defstyle/.style={
common,
colframe=main,
colback=main!5,
colbacktitle=main,
overlay unbroken and last={
\node[anchor=south east, outer sep=0pt] at (\linewidth-width,0) {
\textcolor{main}{$\clubsuit$}};}},
thmstyle/.style={
common,
colframe=second,
colback=second!5,
colbacktitle=second,
overlay unbroken and last={
\node[anchor=south east, outer sep=0pt] at (\linewidth-width,0) {
\textcolor{second}{$\heartsuit$}};}},
prostyle/.style={
common,
colframe=third,
colback=third!5,
colbacktitle=third,
overlay unbroken and last={
\node[anchor=south east, outer sep=0pt] at (\linewidth-width,0) {
\textcolor{third}{$\spadesuit$}};}},
ELEGANT@title/.code n args={2}
{
\tcbset
{
title=
{
\csname #1name\endcsname~%
\ifdef{\thetcbcounter}{\thetcbcounter}{}%
\ifblank{#2}{}{\ (#2)}
}
}
},
ELEGANT@label/.code n args={2}
{
\ifblank{#2}
{}{\tcbset{label={#1:#2}}}
}
}
% define an internal control sequence \ELEGANT@newtheorem for fancy mode's newtheorem
% #1 is the environment name, #2 is the prefix of label, #3 is the style
% style: thmstyle, defstyle, prostyle
% e.g. \ELEGANT@newtheorem{theorem}{thm}{thmstyle}
% will define two environments: numbered ``theorem'' and no-numbered ``theorem*''
% WARNING FOR MULTILINGUAL: this cs will automatically find \theoremname's definition,
% WARNING FOR MULTILINGUAL: it should be defined in language settings.
\NewDocumentCommand \ELEGANT@newtheorem { m m m O{} }{
\ifcsundef{#1name}{%
\ClassError{elegantbook}{%
\ #1name undefined, \MessageBreak
Please check in language setting
}{}
}{\relax}
\expandafter\ifblank\expandafter{#4}{
\tcbset{
new/usecnt/.style={}
}
}{
\tcbset{
new/usecnt/.style= {use counter from = #4}
}
}
\DeclareTColorBox[auto counter,number within=\ELEGANT@thmcnt,usesamecnt,usecnt]{#1}{ g o t\label g }{
common,#3,
IfValueTF={##1}
{ELEGANT@title={#1}{##1}}
{
IfValueTF={##2}
{ELEGANT@title={#1}{##2}}
{ELEGANT@title={#1}{}}
},
IfValueT={##4}
{
IfBooleanTF={##3}
{label={##4}}
{ELEGANT@label={#2}{##4}}
}
}
\DeclareTColorBox{#1*}{ g o }{
common,#3,
IfValueTF={##1}
{ELEGANT@title={#1}{##1}}
{
IfValueTF={##2}
{ELEGANT@title={#1}{##2}}
{ELEGANT@title={#1}{}}
},
}
}
% define several environment
% we define headers like \definitionname before
\ELEGANT@newtheorem{theorem}{thm}{thmstyle}
\ELEGANT@newtheorem{definition}{def}{defstyle}
\ELEGANT@newtheorem{postulate}{pos}{thmstyle}
\ELEGANT@newtheorem{axiom}{axi}{thmstyle}
\ELEGANT@newtheorem{corollary}{cor}{thmstyle}
\ELEGANT@newtheorem{lemma}{lem}{thmstyle}
\ELEGANT@newtheorem{proposition}{pro}{prostyle}
}{\relax}
\ifdefstring{\ELEGANT@mode}{simple}{
\let\openbox\relax
\RequirePackage{amsthm}
\let\proof\relax
% \let\proofname\relax
\let\endproof\relax
% declare new theorem styles: defstyle, thmstyle, prostyle
\newtheoremstyle{defstyle}{3pt}{3pt}{\citshape}{-3pt}{
\bfseries\color{main}}{}{0.5em}{\thmname{#1} \thmnumber{#2} \thmnote{(#3)}}
\newtheoremstyle{thmstyle}{3pt}{3pt}{\citshape}{-3pt}{
\bfseries\color{second}}{}{0.5em}{\thmname{#1} \thmnumber{#2} \thmnote{(#3)}}
\newtheoremstyle{prostyle}{3pt}{3pt}{\citshape}{-3pt}{
\bfseries\color{third}}{}{0.5em}{\thmname{#1} \thmnumber{#2} \thmnote{(#3)}}
% define an internal control sequence \ELEGANT@newtheorem for simple mode's newtheorem
% #1 is the environment name, #2 is the style
% style: thmstyle, defstyle, prostyle
% e.g. \ELEGANT@newtheorem{theorem}{thmstyle}
% will define two environments: numbered ``theorem'' and no-numbered ``theorem*''
% WARNING FOR MULTILINGUAL: this cs will automatically find \theoremname's definition,
% WARNING FOR MULTILINGUAL: it should be defined in language settings.
\NewDocumentCommand \ELEGANT@newtheorem { m m O{} } {
\theoremstyle{#2}
\ifELEGANT@usesamecnt
\newtheorem{#1}[ELEGANT@samecnt]{\csname #1name\endcsname}
\else
\ifblank{#3}{
\newtheorem{#1}{\csname #1name\endcsname}[\ELEGANT@thmcnt]
}{
\newtheorem{#1}[#3]{\csname #1name\endcsname}
}
\fi
\newtheorem*{#1*}{\csname #1name\endcsname}
}
% define several environment
% we define headers like \definitionname before
\ELEGANT@newtheorem{theorem}{thmstyle}
\ELEGANT@newtheorem{definition}{defstyle}
\ELEGANT@newtheorem{postulate}{thmstyle}
\ELEGANT@newtheorem{axiom}{thmstyle}
\ELEGANT@newtheorem{corollary}{thmstyle}
\ELEGANT@newtheorem{lemma}{thmstyle}
\ELEGANT@newtheorem{proposition}{prostyle}
}{\relax}
% define an user control sequence \elegantnewtheorem
% #1 is the evironment, #2 is the theorem header
% #3 is the style #4 is the prefix for fancy mode
% style: thmstyle, defstyle, prostyle
% if #4 is given in simple mode, an error will be raised
% if #4 isn't given in fancy mode, the prefix will be set equal to #1,
% and a warning will be raised
\newcommand{\ELEGANT@newtheorem@warning}{}
\newcommand{\ELEGANT@newtheorem@error}{}
\newcommand{\ELEGANT@usesamecnt@warning}{}
\NewDocumentCommand\elegantnewtheorem{ m m m g O{} }
{
\renewcommand{\ELEGANT@usesamecnt@warning}{
\ClassWarning{elegantbook}{%
[#5] won't make sence with option \MessageBreak
`usesamecnt'.
}
}
\renewcommand{\ELEGANT@newtheorem@warning}{
\ClassWarning{elegantbook}{%
Because you didn't provide a prefix, \MessageBreak
we use #1 as the default prefix. \MessageBreak
You have to use \MessageBreak
\ref{#1:label} to refer a \MessageBreak
\begin{#1}{name}{label} environment. \MessageBreak
}
}
\renewcommand{\ELEGANT@newtheorem@error}{
\ClassError{elegantbook}{%
You can't set a prefix in mode ``simple''.\MessageBreak
Just use \MessageBreak
\elegantnewtheorem{#1}{#2}{#3}
}{%
We are using ``amsthm'' package to \MessageBreak
generate theorem-like theorem. \MessageBreak
The 4th parameter ``prefix'' isn't allowed.
}
}
\ifELEGANT@usesamecnt
\ifblank{#5}{}{\ELEGANT@usesamecnt@warning}
\else
\renewcommand{\ELEGANT@tmp@tl}{#5}
\fi
\expandafter\def\csname #1name\endcsname{#2}
\ifdefstring{\ELEGANT@mode}{simple}{%
\IfValueTF{#4}
{\ELEGANT@newtheorem@error}
{\ELEGANT@newtheorem{#1}{#3}[\ELEGANT@tmp@tl]}
}{\relax}
\ifdefstring{\ELEGANT@mode}{fancy}{%
\IfValueTF{#4}
{
\def\ELEGANT@temp@prefix{#4}
\ifdefempty{\ELEGANT@temp@prefix}
{
\ELEGANT@newtheorem{#1}{#1}{#3}[\ELEGANT@tmp@tl]
\ELEGANT@newtheorem@warning
}
{\ELEGANT@newtheorem{#1}{#4}{#3}[\ELEGANT@tmp@tl]}
}
{
\ELEGANT@newtheorem{#1}{#1}{#3}[\ELEGANT@tmp@tl]
\ELEGANT@newtheorem@warning
}
}{\relax}
}
% main(green-def): example exercise problem solution
% second(orange-thm): proof note remark
% third(blue-prop): assumptions property conclusion custom
%% Example with counter
\newcounter{exam}[chapter]
\setcounter{exam}{0}
\renewcommand{\theexam}{\thechapter.\arabic{exam}}
\newenvironment{example}[1][]{
\refstepcounter{exam}
\par\noindent\textbf{\color{main}{\examplename} \theexam #1 }\rmfamily}{
\par\ignorespacesafterend}
%% Exercise with counter
\newcounter{exer}[chapter]
\setcounter{exer}{0}
\renewcommand{\theexer}{\thechapter.\arabic{exer}}
\newenvironment{exercise}[1][]{
\refstepcounter{exer}
\par\noindent\makebox[-3pt][r]{
\scriptsize\color{red!90}\HandPencilLeft\quad}
\textbf{\color{main}{\exercisename} \theexer #1 }\rmfamily}{
\par\ignorespacesafterend}
%% Problem with counter
\newcounter{prob}[chapter]
\setcounter{prob}{0}
\renewcommand{\theprob}{\thechapter.\arabic{prob}}
\newenvironment{problem}[1][]{
\refstepcounter{prob}
\par\noindent\textbf{\color{main}{\problemname} \theprob #1 }\rmfamily}{
\par\ignorespacesafterend}
\newenvironment{note}{
\par\noindent\makebox[-3pt][r]{
\scriptsize\color{red!90}\textdbend\quad}
\textbf{\color{second}\notename} \citshape}{\par}
\newenvironment{proof}{
\par\noindent\textbf{\color{second}\proofname\;}
\color{black!90}\cfs}{
% \hfill$\Box$\quad
\par}
\newenvironment{solution}{\par\noindent\textbf{\color{main}\solutionname} \citshape}{\par}
\newenvironment{remark}{\noindent\textbf{\color{second}\remarkname}}{\par}
\newenvironment{assumption}{\par\noindent\textbf{\color{third}\assumptionname} \citshape}{\par}
\newenvironment{conclusion}{\par\noindent\textbf{\color{third}\conclusionname} \citshape}{\par}
\newenvironment{property}{\par\noindent\textbf{\color{third}\propertyname} \citshape}{\par}
\newenvironment{custom}[1]{\par\noindent\textbf{\color{third} #1} \citshape}{\par}
\RequirePackage{multicol}
\tcbset{
introductionsty/.style={
enhanced,
breakable,
colback=structurecolor!10,
colframe=structurecolor,
fonttitle=\bfseries,
colbacktitle=structurecolor,
fontupper=\citshape,
attach boxed title to top center={yshift=-3mm,yshifttext=-1mm},
boxrule=0pt,
toprule=0.5pt,
bottomrule=0.5pt,
top=8pt,
before skip=8pt,
sharp corners
},
}
\newenvironment{introduction}[1][\introductionname]{
\begin{tcolorbox}[introductionsty,title={#1}]
\begin{multicols}{2}
\begin{itemize}[label=\textcolor{structurecolor}{\upshape\scriptsize\SquareShadowBottomRight}]}{
\end{itemize}
\end{multicols}
\end{tcolorbox}}
\RequirePackage{adforn}
\newenvironment{problemset}[1][\xchaptertitle~\exercisename]{
\vspace*{10pt}
\begin{center}
\phantomsection\addcontentsline{toc}{section}{\texorpdfstring{\xchaptertitle~\exercisename}{\exercisename}}
% \markboth{#1}{\rightmark}
\markright{#1}
\textcolor{structurecolor}{\Large\bfseries\adftripleflourishleft~#1~\adftripleflourishright}
\end{center}
\begin{enumerate}}{
\end{enumerate}}
\def\relsec{\endgroup start}
\def\endrelsec{end\begingroup\def \@currenvir {relsec}}
\ifdefstring{\ELEGANT@result}{noanswer}{
\AtBeginDocument{
\excludecomment{solution}
\excludecomment{proof}
\excludecomment{inline}
}
}{\relax}
%页眉页脚
\RequirePackage{fancyhdr}
\fancyhf{}
\fancyfoot[c]{\color{structurecolor}\small\thepage}
\if@twoside
\fancyhead[EL]{\color{structurecolor}\cnormal\leftmark}
\fancyhead[OR]{\color{structurecolor}\cnormal\rightmark}
\else
\fancyhead[R]{\color{structurecolor}\cnormal\rightmark}
\fi
\renewcommand{\headrule}{\color{structurecolor}\hrule width\textwidth}
\pagestyle{fancy}
\renewcommand{\headrulewidth}{1pt}
% \renewcommand{\headrule}{}
\fancypagestyle{plain}{\renewcommand{\headrulewidth}{0pt}\fancyhf{}\renewcommand{\headrule}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\, #1}{}}
\renewcommand{\chaptermark}[1]{\markboth{\xchaptertitle\, #1}{}}
\newcommand{\ouc@coverblank}{\rule{0pt}{0pt}\hspace{\linewidth}\rule{0pt}{0pt}}
\renewcommand*{\maketitle}{%
\hypersetup{pageanchor=false}
\pagenumbering{Alph}
\begin{titlepage}
\newgeometry{margin = 0in}
\parindent=0pt
\ifdefstring{\ELEGANT@device}{normal}{
\ifcsname @cover\endcsname
\includegraphics[width=\linewidth]{\@cover}
\else
\ouc@coverblank
\fi
}{\relax}
\ifdefstring{\ELEGANT@device}{pad}{
\ifcsname @cover\endcsname
\includegraphics[trim=0 26bp 0 26bp,clip=true, width=\linewidth]{\@cover}
\else
\ouc@coverblank
\fi
}{\relax}
\setlength{\fboxsep}{0pt}
% 本地化:色带宽度用 \hsize 而不是 \linewidth。
% \newgeometry{margin=0in} 之后 \linewidth 的更新时机与 \makebox 的
% 宽度计算有时序差,导致实测 Overfull 5pt(原版有封面图时被图宽度
% 掩盖,换成占位空盒后暴露出来)。
\colorbox{coverlinecolor}{\makebox[\linewidth][c]{\shortstack[c]{\vspace{0.5in}}}}
\vfill
\vskip-2ex
\hspace{2em}
\parbox{0.8\textwidth}{
\bfseries\Huge
\ifcsname @title\endcsname \@title \fi
\par}
\vfill
\vspace{-1.0cm}
\setstretch{2.5}
\hspace{2.5em}
\begin{minipage}[c]{0.67\textwidth}
{\color{darkgray}\bfseries\Large
\ifcsname @subtitle\endcsname\@subtitle\\[2ex]\fi}
\color{gray}\normalsize
{\renewcommand{\arraystretch}{0.618}
\begin{tabular}{l}
% \ifcsname @author\endcsname \authorname \@author\\\fi
\ifx\@author\empty\else\authorname\cnormal\@author\\ \fi
\ifcsname @institute\endcsname \institutename \cnormal\@institute\\ \fi
% \ifcsname @date\endcsname \@date\\\fi
\ifx\@date\empty\else\datename\cnormal\@date \\ \fi
\ifcsname @version\endcsname \cnormal\versionname\@version\\ \fi
\ifcsname @bioinfo\endcsname \cnormal\@bioinfo\\ \fi
\end{tabular}}
\end{minipage}
\begin{minipage}[c]{0.27\textwidth}
\begin{tikzpicture}[remember picture,overlay]
\begin{pgfonlayer}{background}
\node[opacity=0.8,
anchor=south east,
outer sep=0pt,
inner sep=0pt] at ($(current page.south east) +(-0.8in,1.5in)$) {
\ifcsname @logo\endcsname\includegraphics[width=4.2cm]{\@logo}\fi};
\end{pgfonlayer}
\end{tikzpicture}
\end{minipage}
\vfill
\begin{center}
\setstretch{1.3}
\parbox[t]{0.7\textwidth}{\centering \citshape
\ifcsname @extrainfo\endcsname\@extrainfo\fi}
\end{center}
\vfill
\end{titlepage}
\restoregeometry
\thispagestyle{empty}}
\newcommand{\dollar}{\mbox{\textdollar}}
\RequirePackage{listings}
\renewcommand{\ttdefault}{cmtt}
\lstdefinestyle{mystyle}{
basicstyle=%
\ttfamily
\lst@ifdisplaystyle\small\fi
}
\lstset{basicstyle=\ttfamily,style=mystyle,breaklines=true}
\definecolor{lightgrey}{rgb}{0.9,0.9,0.9}
\definecolor{frenchplum}{RGB}{190,20,83}
\lstset{language=[LaTeX]TeX,
texcsstyle=*\color{winered},
numbers=none,
mathescape=false,
breaklines=true,
keywordstyle=\color{winered},
commentstyle=\color{gray},
emph={elegantpaper,fontenc,fontspec,xeCJK,citestyle,FiraMono,xunicode,figure,fig,image,img,table,itemize,enumerate,ctex,microtype,description,times,booktabs,tabular,PDFLaTeX,XeLaTeX,type1cm,BibTeX,device,color,mode,lang,amsthm,tcolorbox,titlestyle,cite,ctex,listings,base,math,scheme,toc,esint,chinesefont,amsmath,bibstyle,natbib,pgfornament,addbibresource,printbibliography},
emphstyle={\color{frenchplum}},
morekeywords={DeclareSymbolFont,SetSymbolFont,toprule,midrule,bottomrule,institute,version,includegraphics,setmainfont,setsansfont,setmonofont ,setCJKmainfont,setCJKsansfont,setCJKmonofont,RequirePackage,figref,tabref,email,maketitle,keywords,definecolor,extrainfo,logo,cover,subtitle,appendix,chapter,section,hypersetup,mainmatter,frontmatter,tableofcontents,elegantpar,heiti,kaishu,lstset,pagecolor,zhnumber,marginpar,part,equote,marginnote,bioinfo,datechange,listofchange,lvert,lastpage,songti,heiti,fangsong,setCJKfamilyfont,textbf,elegantnewtheorem,thmcnt,colorlet,usesamecnt},
frame=single,
tabsize=2,
rulecolor=\color{structurecolor},
framerule=0.2pt,
columns=flexible,
% backgroundcolor=\color{lightgrey}
}
\newcommand\bmmax{0}
\RequirePackage{bm}
% add the list of change history
\newcommand{\dateinfoline}[2]{
\noindent\makebox[0pt][r]{%
\makebox[-3em][r]{%
\small
\textbf{\textcolor{structurecolor}{#1}}}\;\;}%
{\citshape\updatename\ignorespaces#2}}
\newcommand{\datechange}[2]{%
\noindent{\makebox[\textwidth][r]{\color{structurecolor}\rule{1.15\textwidth}{.4pt}}}
\dateinfoline{#1}{#2}
\addcontentsline{dates}{section}{#1 -- #2}}
\newcommand{\listofchanges}{%
\begingroup
\renewcommand{\contentsname}{\historyname}
\let\old@starttoc\@starttoc
\def\@starttoc##1{
\old@starttoc{dates}}
\tableofcontents%
\endgroup}
% https://tex.stackexchange.com/questions/472931/list-of-all-dates-in-a-document
\newenvironment{change}{
\begin{enumerate}[label=\small\protect\circled{\arabic*}]}{
\end{enumerate}}
\renewcommand\tableofcontents{%
\hypersetup{linktoc=all, linkcolor=black}
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\ifdefstring{\ELEGANT@toc}{twocol}{
\setlength{\columnsep}{2em}
\begin{multicols}{2}%
\@starttoc{toc}
\end{multicols}}{
\@starttoc{toc}}
\if@restonecol\twocolumn\fi
\hypersetup{linkcolor=winered}}
\renewcommand*{\cleardoublepage}{\clearpage\if@twoside \ifodd\c@page\else
\hbox{}%
\thispagestyle{empty}%
\newpage%
\if@twocolumn\hbox{}\newpage\fi\fi\fi}
% https://tex.stackexchange.com/questions/56839/chaptername-is-used-even-for-appendix-chapters-in-toc
\RequirePackage{calc}
\RequirePackage[titles]{tocloft}
\ifdefstring{\ELEGANT@lang}{cn}{
% \renewcommand{\cftchappresnum}{\beforechap\space}
% \renewcommand{\cftchapaftersnum}{\space\afterchap}
% \setlength{\cftchapnumwidth}{\widthof{\textbf{附录~十一}}}
\renewcommand{\numberline}[1]{%
\@cftbsnum #1\@cftasnum~\@cftasnumb ~%
}
\g@addto@macro\appendix{%
% recover \thechapter in the \NR@chapter's \numberline
\ifELEGANT@Hy@later
\patchcmd{\NR@chapter}%
{\numberline{\xchaptertitle}}{\numberline{\thechapter}}%
{}{\fail}
\else
\patchcmd{\Hy@org@chapter}%
{\numberline{\xchaptertitle}}{\numberline{\thechapter}}%
{}{\fail}
\fi
\addtocontents{toc}{%
\protect\renewcommand{\protect\cftchappresnum}{\appendixname\space}%
\protect\renewcommand{\protect\cftchapaftersnum}{}%
}%
}
}{
\renewcommand{\cftchappresnum}{\chaptername\space}
\renewcommand{\cftchapaftersnum}{\space}
\setlength{\cftchapnumwidth}{\widthof{\textbf{Appendix~9}}}
\g@addto@macro\appendix{%
\addtocontents{toc}{%
\protect\renewcommand{\protect\cftchappresnum}{\appendixname\space}%
\protect\renewcommand{\protect\cftchapaftersnum}{}%
\setlength{\cftchapnumwidth}{\widthof{\textbf{Appendix~999}}}
}%
}
}
% restore the tt default family to lmodern tt family
\renewcommand\ttdefault{lmtt}