使用 mdframed 定义一个环境并在其开头设置默认文本

使用 mdframed 定义一个环境并在其开头设置默认文本

我正在为我的学生编写一个脚本,他们可以在其中阅读解释和练习。

因此,我使用 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.13当前练习编号类似的编号方案,章节,请参阅以下 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 为当前部分的数字,只需将每个出现的 替换chaptersection

答案2

以下解决方案使用灵活的tcolorbox包。我还添加了一个包xsim,它可以非常灵活地为学生创建练习(如果您愿意扩展它,甚至可以使用积分等;如果您需要,您还可以使用解决方案环境)。

引用也没有问题,您只需使用标签方法即可。

第1部分

第2部分

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

相关内容