我正在编写学校资格考试的答案,并希望根据相应的答案对各个部分进行标记。问题是,每年有两次资格考试——一次在一月,一次在八月。有些年份,博士和硕士课程的考试也不同,这增加了复杂性。
标记部分没有问题,我可以写
\section{Ph.D. January 2007}
问题是,我也在使用“定理”环境,我希望定理环境能够反映这些复杂性。例如,假设我的第一个部分是“2004 年 8 月博士学位”,那么我希望有一些序言,例如
{\section{Ph.D. August 2004}
\begin{problem} Whatever
\end{problem}
将输出
Ph.D. August 2004
2004.1 (Aug)(Ph.D.): Whatever
答案1
这是一个可能的解决方案:
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{xstring}
\usepackage{etoolbox}
\newcommand\ExtInf{%
\StrBetween[1,2]{\sectiontitle}{ }{ }[\pmonth]
\StrBefore{\sectiontitle}{ }[\ptitle]
\StrBehind[2]{\sectiontitle}{ }[\pyear]%
}
\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\bfseries,
bodyfont=\normalfont\itshape,
postheadspace=0em,
headpunct=,
headformat=\pyear.\NUMBER~(\pmonth)~(\ptitle):~,
]{mystyle}
\declaretheorem[style=mystyle,name=]{problem}
\makeatletter
\@addtoreset{problem}{section}
\pretocmd{\@sect}{\gdef\sectiontitle{#7}}{}{}
\apptocmd{\@sect}{\ExtInf}{}{}
\makeatother
\begin{document}
\section{Ph.D. August 2004}
\begin{problem}
Test problem.
\end{problem}
\begin{problem}
Test problem.
\end{problem}
\section{M.Sc. September 2010}
\begin{problem}
Test problem.
\end{problem}
\end{document}
一些解释:
这
etoolbox
包用于捕获宏中每个部分的标题\sectiontitle
。这
xstring
包用于从存储在 中的字符串中提取\sectiontitle
相关的子字符串;这些子字符串是:度数、月份和年份,它们分别存储在\ptitle
、\pmonth
和中\pyear
。宏
\ExtInf
包装了这个过程,并且etoolbox
被用来\ExtInf
在每次执行新的操作时调用\section
。每个部分的标题应采用以下格式:
<degree><space><month><space><year>
这
thmtools
包被用作的前端amsthm
;借助该包,problem
定义了类似定理的结构;使用headformat
键,年份、数字、月份和度数的信息将自动包含在所选格式中。
第二个简化版本:
这次不需要提取子字符串;\ExtInf
宏接收三个强制参数:
\ExtInf{<title>}{<month>}{<year>}
将信息存储在宏\ptitle
、\pmonth
和中,并使用宏\pyear
创建相应的信息;然后,在键中使用这些宏为环境标题提供所需的格式:\section
thmtools
headformat
problem
\documentclass{article}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{etoolbox}
\newcommand\ExtInf[3]{%
\gdef\ptitle{#1}
\gdef\pmonth{#2}
\gdef\pyear{#3}
\section{#1~#2~#3}
}
\declaretheoremstyle[
spaceabove=\topsep, spacebelow=\topsep,
headfont=\normalfont\bfseries,
bodyfont=\normalfont\itshape,
postheadspace=0em,
headpunct=,
headformat=\pyear.\NUMBER~(\pmonth)~(\ptitle):~,
]{mystyle}
\declaretheorem[style=mystyle,name=]{problem}
\makeatletter
\@addtoreset{problem}{section}
\makeatother
\begin{document}
\ExtInf{Ph.D.}{August}{2004}
\begin{problem}
Test problem.
\end{problem}
\begin{problem}
Test problem.
\end{problem}
\ExtInf{M.Sc.}{September}{2010}
\begin{problem}
Test problem.
\end{problem}
\end{document}