TeXнический улов во френдленте

Nov 05, 2008 11:23

По роду занятий мне частенько приходится готовить на компьютере (так их проще тиражировать и редактировать) небольшие сборники задач: домашние задания, самостоятельные и контрольные работы, задания к зачётам и экзаменам etc. С подготовкой такого рода документов связана одна небольшая пролемка...
Во-первых, необходимо иметь готовые (и, желательно, подробные) решения. И для себя - чтобы было проще готовиться к занятиям, - и для аспирантов, которым приходится подменять меня во время моих болезней и командировок. Во-вторых, нужно сохранять некоторые из этих решений (контрольных работ и экзаменационных задач) в тайне от студентов. В-третьих, не хотелось бы плодить документы, содержащие один и тот же материал, но в разных видах: в одном с решением, в другом - без, в третьем - только решения (это удобно при проверке домашних работ). Хотя бы потому, что при таком способе организации работы внесение изменений в список задач протребует синхронной правки нескольких документов, что и хлопотно, и является механической работой а, значит, методически неправильно - такую работу должен делать компьютер.
Как получить желаемое, избежав необходимости в рутинной работе? Хотелось бы иметь один документ, содержащий как задачи, так и ответы, и простой способ управления внешним видом готового документа: выводить и задачи и ответы, выводить только задачи или выводить только ответы. Можно сделать базу данных, в одном из полей которой будет храниться решение, в другом - ответ, и формировать готовые документы с помощью SQL-запросов, но хотелось бы обойтись чем-нибудь попроще. Например, LaTeX'ом.
Неделю назад в сообществе ru_tex человек поделился подобной проблемой: ему нужно подготовить сборник тестов. Не могу сказать, что в ответ был рассыпан веер возможностей, но пользователь bust-sskumk предложил вполне себе любопытный вариант. В субботу я немножко "поколдовал" над его предложением и получил своё решение.

В преамбулу документа помещается следующий блок:
%=============================================================================
%Команды, управляющие выводом текста
%=============================================================================
%Управление выводом на печать условий задач и решений
\newcommand{\ShowAnswers}{\def \AnswersShown{1}} %Показывать условия задач.
\newcommand{\HideAnswers}{\def \AnswersShown{0}} %Скрывать условия задач.
\newcommand{\ShowProblems}{\def \ProblemsShown{1}} %Показывать решения.
\newcommand{\HideProblems}{\def \ProblemsShown{0}} %Скрывать решения.
%=============================================================================
%Команды, создающие заголовки
%=============================================================================
\newcounter{classtaskno} %Счётчик задач для работы в классе. Нужен для того, чтобы речатать заголовки разделов.
\setcounter{classtaskno}{0}
\newcounter{hometaskno} %Счётчик задач для домашней работы. Нужен для того, чтобы речатать заголовки разделов.
\setcounter{hometaskno}{0}
\newcounter{corrtaskno} %Счётчик задач для работы над ошибками. Нужен для того, чтобы речатать заголовки разделов.
\setcounter{corrtaskno}{0}
%Стандартный заголовок примера
\newcommand{\primer}[3]{\par \vspace{0.3cm} \noindent {\bf #1} \ {\ifnum\ProblemsShown=1 #2 \par \vspace{0.3cm} \fi}
\ifnum\AnswersShown=1 {\bf Решение:} #3 \fi}
%Задание для работы в классе.
\newcommand{\classtask}[3]{\ifnum\arabic{classtaskno}=0 \vspace{0.5 cm} \subsubsection{Список заданий для работы в классе}
\setcounter{hometaskno}{0} \setcounter{corrtaskno}{0} \par \fi \primer{#1}{#2}{#3} \refstepcounter{classtaskno} \par}
%Задание для домашней работы.
\newcommand{\hometask}[3]{\ifnum\arabic{hometaskno}=0 \vspace{0.5 cm} \subsubsection{Список заданий для домашней работы}
\setcounter{classtaskno}{0} \setcounter{corrtaskno}{0} \par \fi \primer{#1}{#2}{#3} \refstepcounter{hometaskno} \par}
%Задание для отработок пропущенных занятий.
\newcommand{\corrtask}[3]{\ifnum\arabic{corrtaskno}=0 \vspace{0.5 cm} \subsubsection{Список заданий для отработки}
\setcounter{classtaskno}{0} \setcounter{hometaskno}{0} \par \fi \primer{#1}{#2}{#3} \refstepcounter{corrtaskno} \par}
%=============================================================================
%Команды, обеспечивающие печать контрольной работы, управляемую командами Show/Hide
%=============================================================================
%Задание для контрольной работы
\newcommand{\controlworkprob}[2]{\ifnum\ProblemsShown=1 \subsubsection{Контрольная работа по теме <<#1>>} \par
{\begin{enumerate} #2 \end{enumerate}} \fi}
%Ответы на вопросы контрольной работы
\newcommand{\controlworksolu}[2]{\ifnum\AnswersShown=1 \subsubsection{Ответы на вопросы контрольной работы по теме <<#1>>}
\par {\begin{enumerate} #2 \end{enumerate}} \fi}

В теле документа задачи оформляются в виде:
\hometask{1.11.6}{Вычислить все значения корней: $\sqrt[3]{-1+i}$.}{$$ \sqrt[3]{-1+i} = \sqrt[3]{\sqrt{2} \exp \Fbrack{i \frac{3 \pi}{4}+2 i \pi k}} = \sqrt[6]{2} \exp \Fbrack{i \frac{\pi}{4} +i \frac{2}{3} \pi k}, k=0, \pm1, \pm2,\ldots $$}
Кстати, в этом примере команда \Fbrack{} "самодельная" - масштабируемые фигурные скобки:
\newcommand{\Fbrack}[1]{\left \{ #1 \right \}},
Мне когда-то показалось, что так проще их набирать и, самое главное, менять стиль (с фигурных на квадратные или, скажем, круглые) - так что я наопределял таких команд и поместил их в самодельный пакет.

"Пятиминутные" контрольные работы по теме предыдущего занятия (заменяющие у меня на занятиях перекличку), оформляются командами \controlworkprob{Тема}{\item Первый вопрос. \item Второй вопрос etc.} и \controlworksolu{Тема}{\item Ответ на первый вопрос. \item Ответ на второй вопрос etc.}.
Для упрощения моей работы, нет необходимости явно разделять документ на рубрики типа "задания для работы в классе" - LaTeX это делает как бы сам.
Так что теперь, после того, как исходный текст (назову вещи своими именами) подготовлен, можно выводить его на печать, указав в начале документа \ShowProblems для вывода условий задач и вопросов к контрольным работам (или \HideProblems, если условия выводить не нужно) и \ShowAnswers для вывода решений и ответов (соответственно, \HideAnswers, если вывод ответов не нужен.).
Всё легко и просто. Пока меня полученный результат полностью устраивает, а если перестанет - идея понятна и добавить какие-нибудь "навороты" будет проще простого.

latex, компьютеры

Previous post Next post
Up