我正在为我的学生编写一个脚本,他们可以在其中阅读解释和练习。
因此,我使用 mdframed 包定义了一个环境来使用彩色框,这些框与分页符一起浮动,如下所示:
\newmdtheoremenv[%
backgroundcolor=black!7,
linecolor=red,
linewidth=1pt,
]{ex}{Excercise}
现在我想设置一个带有 hyperref 的复选框,以便学生可以勾选练习。
该复选框在左边距设置了 pakage marginnote ,其工作方式如下:
\begin{ex}
\marginnote{
\begin{Form}
\CheckBox[width=.6cm]{~}
\end{Form}
}
\lipsum
\end{ex}
我需要的是,我可以使用\begin{ex} ... \end{ex}
并且复选框将自动设置。我不想像上面一样每次都设置复选框。
所以我想要这样的东西:
\newmdtheoremenv[%
backgroundcolor=black!7,
linecolor=red,
linewidth=1pt,
at every beginning do:
\marginnote{
\begin{Form}
\CheckBox[width=.6cm]{~}
\end{Form}
}
]{ex}{Excercise}
准确地说,我想使用 mdframed 定义一个环境,在每次开始时设置一个文本(或者在我的情况下是一个复选框)。
有办法吗?
答案1
以下是我能想到的解决方案。
首先,我定义了新的计数器exercise
,稍后我将使用它来对框进行编号。接下来,我定义了一个新环境,其中包含框的样式、标题的设置方式和复选框。为了使复选框在生成的 PDF 中单独“可勾选”,它们需要一个唯一的name
。因此,我重用了之前定义的计数器。
1. 整个文档中的练习均连续编号
\documentclass[a4paper]{article}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{marginnote}
\usepackage{lipsum}
\usepackage{hyperref}
\newcounter{exercise}
\newenvironment{exercise}
{\refstepcounter{exercise}%
\mdfsetup{%
backgroundcolor=black!7,
linecolor=red,
linewidth=1pt,
frametitle=Exercise~\theexercise%
\marginnote{%
\begin{Form}%
\CheckBox[width=.6cm,name=ex\theexercise]{~}%
\end{Form}%
}%
}%
\begin{mdframed}%
}%
{\end{mdframed}}
\begin{document}
\begin{exercise}
short example entry
\end{exercise}
\begin{exercise}
\lipsum
\end{exercise}
\end{document}
2. 使用当前章节(或部分)编号对练习进行编号
上述代码会在整个文档中对所有练习进行连续编号。如果您喜欢以下编号方案Exercise 3.1
与3
当前练习编号类似的编号方案,章节,请参阅以下 MWE:
\documentclass[a4paper]{report}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{marginnote}
\usepackage{lipsum}
\usepackage{hyperref}
\newcounter{exercise}[chapter]
\makeatletter
\renewcommand{\p@exercise}{\thechapter.}
\makeatother
\newenvironment{exercise}
{\refstepcounter{exercise}%
\mdfsetup{%
backgroundcolor=black!7,
linecolor=red,
linewidth=1pt,
frametitle=Aufgabe~\thechapter.\theexercise%
\marginnote{%
\begin{Form}%
\CheckBox[width=.6cm,name=ex\thechapter\theexercise]{~}%
\end{Form}%
}%
}%
\begin{mdframed}%
}%
{\end{mdframed}}
\begin{document}
\chapter{chapter title}
\begin{exercise}
short example entry
\end{exercise}
\begin{exercise}
\lipsum
\label{ex:Kirchhof}
\end{exercise}
\ref{ex:Kirchhof}
\end{document}
如果你希望练习的编号方案为 2.1,其中 2 为当前部分的数字,只需将每个出现的 替换chapter
为section
。
答案2
以下解决方案使用灵活的tcolorbox
包。我还添加了一个包xsim
,它可以非常灵活地为学生创建练习(如果您愿意扩展它,甚至可以使用积分等;如果您需要,您还可以使用解决方案环境)。
引用也没有问题,您只需使用标签方法即可。
\documentclass[a4paper]{report}
\usepackage[ngerman]{babel}
\usepackage[breakable,skins]{tcolorbox}
\tcbset{exstyle/.style={colframe=red,colback=black!7,sharp corners=all,breakable,title after break={(Aufgabe \thechapter.\theaufgabe\ Fortsetzung)}}}
\usepackage{xsim}
\xsimsetup{solution/print=false}
\usepackage{marginnote}
\usepackage{lipsum}
\usepackage{hyperref}
\DeclareExerciseEnvironmentTemplate{tcolorbox}{%
\tcolorbox[exstyle,title = {\strut\GetExerciseName~\thechapter.\GetExerciseProperty{counter}}]
\IfInsideSolutionF{%
\marginnote{\vskip-3\baselineskip%
\begin{Form}%
\CheckBox[width=.6cm,name=ex\thechapter\theaufgabe]{~}%
\end{Form}%
}%
}
}{\endtcolorbox}
\DeclareExerciseType{aufgabe}{
exercise-env=aufgabe,
solution-env=loesung,
exercise-name={Aufgabe},
solution-name={Lösung zu Aufgabe},
exercise-template=tcolorbox,
solution-template=tcolorbox,
within=chapter,
}
\makeatletter
\renewcommand{\p@aufgabe}{\thechapter.}
\makeatother
\begin{document}
\chapter{chapter title}
\begin{aufgabe}\label{test}
short example entry
\end{aufgabe}
\begin{loesung}
a test
\end{loesung}
\ref{test}
\begin{aufgabe}\label{tetest}
\lipsum
\label{ex:Kirchhof}
\end{aufgabe}
\begin{loesung}
a test
\end{loesung}
\ref{ex:Kirchhof}
\printsolutions[headings=false]
\end{document}