使用定理环境修改部分标签

使用定理环境修改部分标签

我正在编写学校资格考试的答案,并希望根据相应的答案对各个部分进行标记。问题是,每年有两次资格考试——一次在一月,一次在八月。有些年份,博士和硕士课程的考试也不同,这增加了复杂性。

标记部分没有问题,我可以写

\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创建相应的信息;然后,在键中使用这些宏为环境标题提供所需的格式:\sectionthmtoolsheadformatproblem

\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}

在此处输入图片描述

相关内容