![考虑部分的定制锻炼计数器](https://linux22.com/image/344877/%E8%80%83%E8%99%91%E9%83%A8%E5%88%86%E7%9A%84%E5%AE%9A%E5%88%B6%E9%94%BB%E7%82%BC%E8%AE%A1%E6%95%B0%E5%99%A8.png)
我正在尝试获取一个考虑该部分的简单练习计数器。这是我目前拥有的代码:
\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}