考虑部分的定制锻炼计数器

考虑部分的定制锻炼计数器

我正在尝试获取一个考虑该部分的简单练习计数器。这是我目前拥有的代码:

\documentclass{article}


\usepackage[lastexercise]{exercise} % for exercise environment

\begin{document}

\newcounter{pbone}
\renewcommand*{\thepbone}{%
  \textbf{%
    \thesection.\arabic{pbone}
  }%
}

\begin{Exercise}[counter={pbone}]
 Test
\end{Exercise}

\end{document}

即使我已经正确定义了计数器,并且如果我使用命令\thepbone我会得到正确的数字,但是当我将它与练习环境一起使用时我会得到:

在此处输入图片描述

更新

这个帖子无法帮助我解决问题,因为我需要使用自定义计数器。在我准备的文档中,我不仅将练习环境用于练习,还用于每章末尾的问题。对于练习,我没有提供计数器作为参数,但对于章节末尾的练习,我提供了一个自定义计数器作为参数。

答案1

软件包的内部exercise设计并不完善,需要进行一些修补才能在所有情况下(练习的标题、练习列表中的条目以及任何交叉引用)正确打印自定义计数器。以下是测试文档中的补丁集合。

示例输出

\documentclass{article}

\usepackage{etoolbox}
\usepackage[lastexercise]{exercise}

\newcounter{pbone}[section]
\renewcommand*{\thepbone}{\thesection.\arabic{pbone}}

\renewcommand{\theExercise}{\arabic{Exercise}}
\makeatletter
\patchcmd{\@@@ExeEnv}{\theExercise}%
  {\csname the\@ExerciseCounter\endcsname}{}{Failed}
\patchcmd{\@@@ExeEnv}{\addcontentsline}%
  {\if@ExeStared\else\addcontentsline}{}{Failed}
\patchcmd{\@@@ExeEnv}{\endgroup}{\fi\endgroup}{}{Failed}
\renewcommand{\ExerciseHeaderNB}{\csname the\@ExerciseCounter\endcsname}
\patchcmd{\@getExerciseInfo}{\p@Exercise\theExercise}%
  {\csname p@\@ExerciseCounter\endcsname
  \csname the\@ExerciseCounter\endcsname}{}{Failed}
\patchcmd{\@@@ExeCmd}{\theExercise}%
  {\csname the\@ExerciseCounter\endcsname}{}{Failed}
\makeatother

\begin{document}

\listofexercises

\section{A section}

Now in first section.

\begin{Exercise}
  \label{ex:1}
  Standard counter.
\end{Exercise}

\begin{Exercise}[counter=pbone,label=a]
  \label{ex:2}
 Test with custom number.
\end{Exercise}

\section{Another section}

Now in second section.

\begin{Exercise}[counter=pbone]
  \label{ex:3}
 Test with custom number.
\end{Exercise}

\begin{Exercise}[label=b]
  \label{ex:4}
  Standard exercise.
\end{Exercise}

\begin{Exercise*}
  Test of star.
\end{Exercise*}

\begin{Exercise}[counter=pbone]
  \label{ex:5}
  Test with custom number.
\end{Exercise}

\bigbreak
Testing an exercise list wiht answers.
\bigbreak

\begin{ExerciseList}
  \Exercise Simple
  \Answer Hard
  \Exercise[counter=pbone] Interesting
  \Answer Long
\end{ExerciseList}

First~\ref{ex:1};
second~\ref{ex:2};
third~\ref{ex:3};
forth~\ref{ex:4};
fifth~\ref{ex:5}.

Label \ref{a}; label \ref{b}.

\end{document}

主要问题是,该包定义了\theExercise除了为Exercise计数器生成打印表格之外的其他操作。在大多数情况下,需要的是一个命令,用于为该环境生成计数器的打印表示。该计数器的名称存储在中\@ExerciseCounter,打印表格应通过宏访问,\the...其中...计数器名称为;可以通过构造获取此信息

\csname the\@ExerciseCounter\endcsname

上面的大多数补丁都实现了这一点,\theExercise用上面的代码替换了实例。在另一点上,使用了相关的宏,\p@Exercise并且也对其进行了修补,以适应所选的计数器。

最后,环境的星号形式Exercise*的表现并不像广告中说的那样,它在练习列表中产生了一个条目,我也通过应用的最后两个补丁修复了这个问题\@@@ExeEnv

请注意,我已调整了您的定义,\thepbone使其仅产生相关字符。粗体格式应仅在粗体上下文中使用时应用,而不是在每个引用中应用。

答案2

好的。我的第一个解决方案没有按预期工作。您必须使用\renewcounter包提供的命令并重新定义\theExercise。您不需要另一个计数器。

\documentclass{article}
\usepackage[lastexercise]{exercise} % for exercise environment

\renewcounter{Exercise}[section]
\renewcommand\theExercise{\textbf{\thesection.\arabic{Exercise}}}
\begin{document}

\section{Section 1}

\begin{Exercise}[label=ex:1.1]
Test 1.1
\end{Exercise}

\begin{Exercise}[label=ex:1.2]
Test 1.2
\end{Exercise}

\section{Section 2}

\begin{Exercise}[label=ex:2.1]
Test 2.1
\end{Exercise}

\ref{ex:1.1} \ref{ex:1.2} \ref{ex:2.1}
\end{document}

在此处输入图片描述

相关内容