У меня есть набор контрольных работ по математике, которые нужно написать в TeX, сгруппировав их по темам, таким как «Абстрактная алгебра», «Вещественный анализ», «Дифференциальные уравнения» и т. д. Можно ли достичь следующего?
Введите вопросы, которые появляются в вопросниках, в порядке вопросов там, и добавьте какой-нибудь ярлык к каждому вопросу в соответствии с его темой. В выводе вопросы из всех вопросов по одной теме располагаются вместе.
решение1
Возможно, есть лучший способ справиться с этим, но я сделал нечто подобное с ответами на упражнения в своей книге LaTeX, используя расширения, доступные в пакете, verbatim
которые позволили мне объединить вопросы и ответы, даже если ответы будут напечатаны в отдельном разделе в конце каждой главы.
Это код, который я использовал (все это было в файле, .cls
поэтому оно используется @
как буква). Я аннотирую листинг, чтобы было понятнее
Сначала создайте новую запись(вам понадобится по одному для каждой категории, но помните, что доступно только 16 потоков записи, и LaTeX использует некоторые из них самостоятельно).
\newwrite\ans@out
\immediate\openout\ans@out=\jobname.ans
Определите среду ответаЭто основано на verbatimwrite
примере среды из verbatim
пакетадокументация. Строки, начинающиеся с, \immediate\write
используются для добавления дополнительного текста сверх того, что находится во входном файле.
\def\answer{%
\@bsphack
\let\do\@makeother\dospecials
\immediate\write\ans@out{\string\preans}
\immediate\write\ans@out{\string\par\string\noindent
{\string\sc\space Exercise\string~\thequestion.}\quad}%
\immediate\write\ans@out{\string\vadjust{\string\nobreak}\relax}
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\ans@out
{\the\verbatim@line}}%
\verbatim@start}
\def\endanswer{%
\immediate\write\ans@out{}
\@esphack}
Это один из макросов, которые я использовал для форматирования ответов. На самом деле, мне немного стыдно за то, как уродливо размечен мой промежуточно сгенерированный вывод.
\def\preans{\if@nobreak\global\@nobreakfalse\else\bigfilbreak\fi}
Определите команду для фактической печати ответовМы закрываем запись, а затем снова считываем записанный файл.
\def\printanswers{\immediate\closeout\ans@out
\@input{\jobname.ans}
}
Макросы для набора текстаОни менее интересны и приведены здесь только для полноты картины.
\newcounter{question}[chapter]
\def\thequestion{\thechapter-\arabic{question}}
\def\question{\par\refstepcounter{question}\noindent
{\sc Exercise \thequestion.}
\ignorespaces}
\def\endquestion{\par}
После всех этих определений мы могли бы сделать во входном файле что-то вроде этого:
\begin{question}
What \LaTeX\ commands would you type at the beginning of the input file for
an article which had the title ``Birds \& Bees of North
America,'' was written by ``Dr.~H.T. Jones'' and had today's date
printed for the date field?
\end{question}
\begin{answer}
\begin{verbatim}
\documentclass{article}
\title{Birds \& Bees of North America}
\author{Dr.~H.T. Jones}
\begin{document}
\maketitle
...
\end{verbatim}
Note that \& is input as \verb+\&+ and a \verb+~+ is used after
``Dr.''\ to prevent an end-of-sentence space from being printed
there (a \verb*+\ + could have been used as well). Today's date
was supplied by omitting the date field.
\end{answer}
Который производитв точке, где question
и answer
среды появляются игде \printanswers
появляется команда.
В вашем случае вам нужно будет эмулировать answers
среду для каждой из ваших категорий, а затем иметь \printallofit
команду или что-то в этом роде, которая закроет и перечитает все сгенерированные входные файлы.
решение2
biblatex
плюсoscola
делает то, что вы хотите, но кривая обучения высокая. Каждый вопрос будет определен как элемент biblatex с полем ключевого слова для определения класса темы вопроса. oscola
имеет инструменты для построения отдельной таблицы для каждой темы.
Или, если это разовая задача, я бы, скорее всего, сделал так: поместил все вопросы в простой текстовый файл, по одному на строку; перед каждым вопросом поставил бы префикс\item \vphantom{\hphantom{keyword}}
where, который keyword
заменил бы ключевым словом для каждой темы; выполнил бы grep файла, чтобы отправить все вопросы по определенной теме в отдельный файл, а затем включил бы эти выходные файлы в основной документ LaTeX.