Полнофункциональный пример использования пакета answers. Позволяет создать сборник задач любого размера. Ответ/решение к задаче набирается вместе с ней, потом все ответы/решения собираются в конце сборника. Почему-то у меня пакет именован myanswers.sty, хотя в нем самом заявлено название answers.sty - уже не помню, дело было лет 6 назад.
- \documentclass[a4paper]{book}
- \usepackage[cp1251]{inputenc}
- \usepackage[T2A]{fontenc}
- \usepackage{amssymb}
- \usepackage{latexsym}
- \usepackage{amsmath,theorem}
- \usepackage{indentfirst}
- \usepackage[english,russian]{babel}
- \usepackage{multicol}
- \theorembodyfont{\upshape}
- \newcounter{var}
- \newcounter{z}[var]
- \def\z{\addtocounter{z}{1}{\hskip15pt\bf\arabic{z}.\hskip10pt}}
- \def\vs{\vskip4mm plus 10mm}
- \usepackage{myanswers}
- \usepackage{ifthen}
- \usepackage[russian]{varioref}
- \usepackage{endnotes}
-
- \Newassociation{ans}{otvet}{answers}
- \Newassociation{hint}{ukazanie}{hints}
-
- \newtheorem{ex}{}
- \renewcommand{\theex}{\arabic{ex}.}
-
- \newtheorem{subex}{}
- \newtheorem{alphedex}{}
- \makeatletter
- \@addtoreset{subex}{ex}
- \@addtoreset{alphedex}{ex}
- \makeatother
- \renewcommand{\thesubex}{\arabic{ex}.\arabic{subex}.}
- \renewcommand{\thealphedex}{\alph{alphedex})}
-
-
- \begin{document}
- \Opensolutionfile{answers}[answers]
- \Opensolutionfile{hints}[hints]
-
- % \Writetofile{answers}{\protect\section{Ответы}}
- % \Writetofile{hints}{\protect\section{Указания и решения}}
-
- \Writetofile{answers}{\protect\chapter*{Ответы}}
- \Writetofile{hints}{\protect\chapter*{Указания и решения}}
-
-
- \tableofcontents
- \newpage
-
- \chapter*{Предисловие}\addcontentsline{toc}{chapter}{Предисловие}
- В данном примере мы покажем, как создать полноценый сборник задач
- с ответами и указаниями и решениями задач. Задачи нумеруются
- последовательно, и предусмотрена возможность создавать "подзадачи"
- как самостоятельные (subex) (например, \ref{sqrt}), так и
- "буквенные варианты" в рамках общей "родительской задачи" (см.
- задачи \ref{ln}\ref{ln1} и \ref{ln}\ref{ln2}).
- \chapter{Интегральное исчисление}
-
- \section{Задачи начального уровня}
-
- Найти интегралы:
- \begin{ex}\label{fst}
- $\displaystyle \int \frac{1}{x^2-1}\,dx$.
- \begin{ans}
- $\frac{1}{2}\ln\left|\frac{x-1}{x+1}\right|$.
- \end{ans}
- \end{ex}
-
- \begin{ex}
- $\displaystyle\int x^3+\displaystyle\frac{1}{x^3}\,dx$.
- \begin{ans}
- $\frac{1}{2}x^2-\cos x+\sin x$.
- \end{ans}
- \end{ex}
-
- \begin{subex}\label{sqrt}
- $\displaystyle\int x\sqrt[5]{x^2}+\frac{2}{3x}\,dx$.
- \begin{ans}
- 13.
- \end{ans}
- \end{subex}
-
- \begin{subex}
- $\displaystyle\int \sin 2x,dx$.
- \begin{ans}
- $-\frac{1}{2}\cos 2x$.
- \end{ans}
- \end{subex}
-
- \begin{subex}
- $\displaystyle\int \frac{1}{\cos^2 3x}\,dx$.
-
- \begin{ans}
- $\frac{1}{3}\tg 3x$.
- \end{ans}
- \end{subex}
-
- \begin{ex}
- $\displaystyle \int \frac{1}{x^2+2}\,dx$.
- \begin{ans}
- $\frac{1}{\sqrt{2}}\arctg\frac{x}{\sqrt{2}}$.
- \end{ans}
- \end{ex}
-
-
- \begin{ex}\label{ln}
- \begin{alphedex}\label{ln1}%\Writetofile{answers}{\textbf{\theex}}
-
- $\int \frac{1}{x}\,dx$
- \begin{ans}
- $\ln(x)+C$
- \end{ans}
- \end{alphedex}
-
- \begin{alphedex}\label{ln2}
- $\int \frac{1}{2x}\,dx$
- \begin{ans}
- $1/2\ln(x)+C$
- \end{ans}
- \end{alphedex}
- \end{ex}
-
- \section{Сложные задачи}
- \begin{ex}
- $\displaystyle \int \frac{1}{x^4+1}\,dx$
- \begin{hint}
- Выделить полный квадрат в знаменателе
- \end{hint}
- \begin{ans}
- $\frac{1}{4\sqrt 2}\ln\frac{x^2+x\sqrt 2+1}{x^2-x\sqrt
- 2+1}+\frac{1}{2\sqrt 2}\arctg\frac{x\sqrt 2}{1-x^2}$.
- \end{ans}
- \end{ex}
-
-
- \chapter{Дифференциальные уравнения}
- \begin{ex}
- Население города Н. в 1998г составляло 1 млн. жителей, а прирост -
- 40000. Найти население в 2001г, считая, что скорость прироста
- пропорциональна количеству жителей.
- \begin{ans}
- $\approx1127497$ человек.
- \end{ans}
- \begin{hint}
- Обозначим $f(t)$ число жителей, тогда по условию $f(1998)=10^6$.
- Годовой прирост -- это разность между $f(t)$ и $f(1998)$. По
- условию задачи, скорость прироста пропорциональна текущему
- количеству жителей. Скорость прироста -- это его первая
- производная по времени, $(f(t)-f(1998))'=f'(t)$. Таким образом,
- получаем следующую задачу Коши для обыкновенного диф уравнения:
- $$
- f'(t)=kf(t)
- $$
- $$
- f(1998)=10^6
- $$
- + дополнительное условие
- $$
- f'(1998)=40000
- $$
- $k$ -- коэфф. пропорциональности. Это
- уравнение с разделяющимися переменными, интегрируя, получим:
- $$
- \ln(f(t))=kt+C
- $$
-
- Подробно:
- $$
- {d(f(t))\over dt}=kf(t)
- $$
- $$
- {df(t)\over f(t)}=k\,dt
- $$
-
- $$
- \int{df(t)\over f(t)}=\int k\,dt
- $$
-
- $$
- \ln(f(t))=kt+C
- $$
- Модуль под логарифмом не ставим, т.к. $f(t)>0$ по смыслу задачи.
- Используя начальное условие, получим
- $$
- \ln(10^6)=1998k+C,
- $$
- $$
- C=6\ln 10-1998k
- $$
- $$
- \ln f(t)=kt+6\ln10-1998k=k(t-1998)+6\ln10
- $$
- $$
- f(t)=e^{k(t-1998)+6\ln10}=10^6 e^{k(t-1998)}
- $$
-
-
- Для нахождения $k$ используем условие: в 1998 прирост был 40000:
- $$f'(t)=10^6ke^{k(t-1998)}$$
- $$
- f'(1998)=10^6k=40000 \Rightarrow k=0.04 \Rightarrow
- $$$$
- f(t)=10^6e^{0.04(t-1998)}.
- $$
- Найдём $f(2001)=10^6e^{0.04\cdot3}=1127496.852$, значит, население
- будет $\approx1127497$ человек.
- \end{hint}
- \end{ex}
-
- \begin{ex}
- Найти линию, пересекающую под углом $\alpha$ меридианы пароболоида
- вращения.
- \begin{ans}
- Смотри задачу 1567 в задачнике Гюнтера и Кузьмина :)
- \end{ans}
- \end{ex}
- \Closesolutionfile{answers}
- \Closesolutionfile{hints}
-
- \addcontentsline{toc}{chapter}{Ответы}
- \input{answers}
-
- \addcontentsline{toc}{chapter}{Указания и решения}
- \input{hints}
-
- \end{document}
-
Сам пакет myanswers.sty
Код:
%%
%% This is file `answers.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% answers.dtx (with options: `answers')
%%
%% Copyright (C) 1990,1994 Mike Piff, University of Sheffield, England
%%
%% You are not allowed to change this file.
%%
%% You are NOT ALLOWED to distribute this file alone. You are NOT
%% ALLOWED to take money for the distribution or use of this
%% file except for a nominal charge for copying etc.
%%
%% Please address any problems to:
%%
%% M.Piff@shef.ac.uk
%%
%% For updates, contact your nearest CTAN site.
%%
\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\newif\ifanswerfiles \answerfilestrue
\DeclareOption{nosolutionfiles}{\answerfilesfalse
\typeout{No answer files being produced}}%
\ProcessOptions
\RequirePackage{verbatim}
\newcommand{\solutionpoint}{.}
\newcommand{\solutionextension}{tex}
\newenvironment{Filesave}[1]{%
\@bsphack
\def\verbatim@processline{}%
\Iffileundefined{#1}{}{%
\Ifopen{#1}{%
\def\verbatim@processline{%
\Ifanswerfiles{%
\immediate\write\@nameuse{#1@file}%
{\the\verbatim@line}%
}{}%
}%
}{}%
}%
\let\do\@makeother\dospecials
\catcode`\^^M\active \catcode`\^^I=12\relax
\verbatim@start
}{\@esphack}
\newcommand{\Writetofile}[2]{%
\@bsphack
\Iffileundefined{#1}{}{%
\Ifopen{#1}{%
{%
\let\protect\string
\Ifanswerfiles{%
\immediate\write\@nameuse{#1@file}{#2}%
}{}%
}%
}{}%
}%
\@esphack
}
\newcommand{\Ifopen}[3]{%
\csname if#1open\endcsname#2\else#3\fi}%
\newcommand{\Iffileundefined}[3]{%
\csname ifx\expandafter\endcsname
\csname #1@file\endcsname\relax
#2\else#3\fi}
\newcommand{\Ifanswerfiles}[2]{%
\ifanswerfiles #1\else #2\fi}
\def\Opensolutionfile#1{%
\@ifnextchar[{\define@filename{#1}}%
{\define@filename{#1}[#1]}}%
\def\define@filename#1[#2]{%
\global\@namedef{#1@filename}{#2\solutionpoint\solutionextension}%
\Ifanswerfiles{%
\typeout{Output from handle #1 going
to #2.\solutionextension}%
}{}%
\Iffileundefined{#1}{%
\expandafter\newwrite\csname #1@file\endcsname
\csname newif\expandafter\endcsname
\csname if#1open\endcsname
\global\csname #1openfalse\endcsname
\expandafter\ifx\csname Open#1hook\endcsname\relax
\global\@namedef{Open#1hook}##1{}%
\fi
\expandafter\ifx\csname Close#1hook\endcsname\relax
\global\@namedef{Close#1hook}##1{}%
\fi
}{}%
\let\Tmp\relax
\Ifopen{#1}{\typeout{File #1 already open}}{%
\Ifanswerfiles{%
\immediate\openout\@nameuse{#1@file}=%
\@nameuse{#1@filename}%
}{}%
\global\csname#1opentrue\endcsname
\def\Tmp{\@nameuse{Open#1hook}{#1}}%
}%
\Tmp
}
\def\Closesolutionfile#1{%
\let\Tmp\relax
\Iffileundefined{#1}{}{%
\Ifopen{#1}{%
\Ifanswerfiles{%
\immediate\closeout\@nameuse{#1@file}%
}{}%
\global\csname #1openfalse\endcsname
\def\Tmp{\@nameuse{Close#1hook}{#1}}%
}{}%
}%
\Tmp
}
\def\Readsolutionfile#1{%
\Ifanswerfiles{%
\Iffileundefined{#1}{}{%
\Ifopen{#1}{%
\typeout{WARNING: attempt to read open file #1}%
}{%
\edef\Tmp{%
\noexpand\InputIfFileExists
{\@nameuse{#1@filename}}{}%
{\noexpand\message{File
\@nameuse{#1@filename}%
\space not found}}%
}%
\Tmp
}%
}%
}{}%
}
\newcommand{\Newassociation}[3]{%
\newsolution{#2}%
\expandafter\ifx\csname #3opentrue\endcsname\relax
\expandafter\newif\csname if#3open\endcsname
\fi
\newenvironment{#1}{%
\Ifanswerfiles{%
\let\Tmp\relax
\Iffileundefined{#3}{}{%
\Ifopen{#3}{%
\immediate\write\@nameuse{#3@file}%
{\string\begin{#2}\@nameuse{#2params}}%
\def\Tmp{\Filesave{#3}}%
}{}%
}%
}{%
\edef\Tmp{\noexpand\begin{#2}\@nameuse{#2params}}%
}%
\csname pre#1\endcsname
\Tmp
}%
{%
\Ifanswerfiles{%
\Iffileundefined{#3}{}{%
\Ifopen{#3}{%
\endFilesave%
\immediate\write\@nameuse{#3@file}%
{\string\end{#2}}%
\csname post#1\endcsname
}{}%
}%
}{%
\end{#2}%
}%
}%
}
%\newcommand{\newsolution}[1]{%
% \@ifundefined{#1}{%
% \global\@namedef{#1params}{{\Currentlabel}}%
% \newenvironment{#1}[1]%
% {%
% \csname pre#1\endcsname
% \trivlist
% \item[\hskip\itemsep{\@nameuse{#1label}{##1}}]}%
% {\csname post#1\endcsname\endtrivlist}%
% \global\@namedef{#1label}##1{\solutionstyle{##1}}%
% }{\typeout{WARNING: environment #1 already in use}}%
%}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\newsolution}[1]{%
\@ifundefined{#1}{%
\global\@namedef{#1params}{{\Currentlabel}}%
\newenvironment{#1}[1]%
{%
\csname pre#1\endcsname
{\@nameuse{#1label}{##1}}}%
{\csname post#1\endcsname}%
\global\@namedef{#1label}##1{\solutionstyle{##1}}%
}{\typeout{WARNING: environment #1 already in use}}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\solutionstyle}[1]{\textbf{#1}}
\newcommand{\Currentlabel}{\@currentlabel}
\endinput
%%
%% End of file `answers.sty'.