Научная статья на тему 'ИСПОЛЬЗОВАНИЕ НЕКОТОРЫХ ПРОГРАММНЫХ СРЕДСТВ ДЛЯ ПОДГОТОВКИ ВАРИАНТОВ КОНТРОЛЬНЫХ ЗАДАНИЙ И ВСПОМОГАТЕЛЬНЫХ МАТЕРИАЛОВ: АВТОМАТИЧЕСКОЕ ФОРМИРОВАНИЕ ВХОДНЫХ ФАЙЛОВ И ИХ ОБРАБОТКА'

ИСПОЛЬЗОВАНИЕ НЕКОТОРЫХ ПРОГРАММНЫХ СРЕДСТВ ДЛЯ ПОДГОТОВКИ ВАРИАНТОВ КОНТРОЛЬНЫХ ЗАДАНИЙ И ВСПОМОГАТЕЛЬНЫХ МАТЕРИАЛОВ: АВТОМАТИЧЕСКОЕ ФОРМИРОВАНИЕ ВХОДНЫХ ФАЙЛОВ И ИХ ОБРАБОТКА Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
109
9
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
LATEX / MAPLE / MATLAB / ЯЗЫК СИ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Довбыш Сергей Александрович

Хорошо известно, что использование издательской системы LaTeX позволяет при формировании, например, билетов или вариантов контрольного мероприятия и ответов к ним не копировать каждый раз условия задач и ответы, а заменять их командами, которые их задают; сами же условия или ответы могут считываться из отдельного файла. Эти приёмы широко используются. Однако, при формировании большого числа билетов или вариантов было бы желательно максимально автоматизировать этот процесс, как и получение ответов. Эта задача стала особенно актуальной при проведении контрольных мероприятий в дистанционном обучении, когда, с целью избежать возможного несамостоятельного решения задач учащимися, потребовалось формировать большое число вариантов и распечатывать их в отдельных файлах. На примере систем Maple и Matlab обсуждаются автоматические формирование входных файлов LaTeX по заданному алгоритму и их обработка. Статья предназначена в качестве практического пособия, которое может быть полезно для преподавателей средней и высшей школы.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «ИСПОЛЬЗОВАНИЕ НЕКОТОРЫХ ПРОГРАММНЫХ СРЕДСТВ ДЛЯ ПОДГОТОВКИ ВАРИАНТОВ КОНТРОЛЬНЫХ ЗАДАНИЙ И ВСПОМОГАТЕЛЬНЫХ МАТЕРИАЛОВ: АВТОМАТИЧЕСКОЕ ФОРМИРОВАНИЕ ВХОДНЫХ ФАЙЛОВ И ИХ ОБРАБОТКА»

Заключение

В работе исследовано поведение одномерных непрерывных отображений отрезка в себя. Численным моделированием получен каскад бифуркаций удвоения периода, построена бифуркационная диаграмма для логистического отображения. Проведен теоретический анализ этого отображения. Исследовано влияние шума на каскад бифуркаций удвоения периода.

ССЫЛКИ НА ИСТОЧНИКИ

1. Андронов А.А., Витт А.А., Хайкин С.Э. Теория колебаний. 2-е изд. М.: Физматгиз, 1959. 926с.

2. Igor Belykh, Russell Jeter, Vladimir Belykh. Foot force models of crowd dynamics on a wobbly bridge. Science Advances. Vol.3. no 11. 2017

3. Грибов А.Ф., Краснов И.К. Элементарное введение в теорию одномерных дискретных динамических систем. Modern European Researches. - 2019. - №5. - С. 49-56.

4. Steven Strogatz, «Non-linear Dynamics and Chaos: With applications to Physics, Biology, Chemistry and Engineering», Perseus Books, 2000.

5. May R.M. Simple Mathematical Models with very Complicated Dynamics. Nature 261, 459 (1976)

6. Фейгенбаум М. Универсальность и поведение нелинейных систем. - Успехи физ. Наук, 1983, с. 137-145.

7. Шарковский А.Н., Майстенко Ю.Л., Романенко Е.Ю. Разностные уравнения и их приложения. Наукова думка, 1986, 279с.

Alexander F. Gribov,

Candidate of Physical-Mathematical Sciences, Associate Professor, Bauman Moscow State Technical University, Moscow alexandr-gribov@list. ru Nikolai V.Bezverkhny,

Candidate of Physical-Mathematical Sciences, Associate Professor, Bauman Moscow State Technical University, Moscow [email protected] Igor K. Krasnov,

Candidate of Physical-Mathematical Sciences, Associate Professor, Bauman Moscow State Technical University, Moscow igorkrsnv@yandex. ru

An elementary introduction to chaos and synchronization for schoolchildren on the example of a one-dimensional representation

Abstract. The article considers such concepts of modern mathematics as chaos in deterministic systems and synchronization at an elementary level, clear to high school students and students of non-mathematical (humanitarian) specialties. The work is intended for an initial independent familiarization with a new rapidly developing mathematical discipline - chaotic dynamics.

Key words: one-dimensional mapping, trajectory, fixed point, chaos, Lyapunov exponents, synchronization.

ИСПОЛЬЗОВАНИЕ НЕКОТОРЫХ ПРОГРАММНЫХ СРЕДСТВ ДЛЯ ПОДГОТОВКИ ВАРИАНТОВ КОНТРОЛЬНЫХ ЗАДАНИЙ И ВСПОМОГАТЕЛЬНЫХ МАТЕРИАЛОВ: АВТОМАТИЧЕСКОЕ ФОРМИРОВАНИЕ ВХОДНЫХ ФАЙЛОВ И ИХ ОБРАБОТКА

Аннотация

Хорошо известно, что использование издательской системы LaTeX позволяет при формировании, например, билетов или вариантов контрольного мероприятия и ответов к ним не копировать каждый раз условия задач и ответы, а заменять их командами, которые их задают; сами же условия или ответы могут считываться из отдельного файла. Эти приёмы широко используются. Однако, при формировании большого

числа билетов или вариантов было бы желательно максимально автоматизировать этот процесс, как и получение ответов. Эта задача стала особенно актуальной при проведении контрольных мероприятий в дистанционном обучении, когда, с целью избежать возможного несамостоятельного решения задач учащимися, потребовалось формировать большое число вариантов и распечатывать их в отдельных файлах. На примере систем Maple и Matlab обсуждаются автоматические формирование входных файлов LaTeX по заданному алгоритму и их обработка. Статья предназначена в качестве практического пособия, которое может быть полезно для преподавателей средней и высшей школы.

Ключевые слова

LaTeX, Maple, Matlab, язык Си

АВТОР

Довбыш Сергей Александрович,

кандидат физико-математических наук, доцент ФГБОУ ВО «Московский государственный технический университет

им. Н. Э. Баумана», доцент СУНЦ (факультет) — школа-интернат имени А.Н. Колмогорова ФГБОУ ВО «Московский государственный университет имени М.В.Ломоносова»,

г. Москва [email protected]

Введение

Хорошо известны достоинства настольной издательской системы LaTeX, которая позволяет подготовить в автоматическом режиме оригинал-макет самого высокого качества, правильно размещая и масштабируя текст и формулы на странице, индексы и пределы в формулах, и предусматривает множество дополнительных возможностей и сопутствующих им настроек, задание стилей, создание новых команд и т.д. Немаловажным является и тот факт, что используемые в этой системе шрифты имеют хорошие начертания, так что генерируемые формулы получаются визуально более красивыми, чем, например, в Microsoft Word. Наконец, при работе с этой системой обычно не возникает проблем с непереносимостью исходных файлов на другие компьютеры, поскольку эти файлы являются текстовыми и могут быть, в принципе, подготовлены и изменены в любом тестовом редакторе; возможные же проблемы с переносимостью, которые иногда возникают, устраняются редактированием команд в преамбуле (начале) файла. По этой же причине исходные файлы имеют сравнительно малый объём и удобны для пересылки по электронной почте. Использование LaTeX^ стало стандартом при подготовке математических рукописей. Следует отметить, однако, что уже давно имеются специализированные пакеты LaTeX^, предназначенные и для совершенно других целей, например, для печати химических формул и диаграмм молекул или нотного стана или для набора и вывода текста на многих языках. А обсуждаемые в статье вопросы (см. аннотацию) могут сделать актуальным использование LaTeX^ и для подготовки контрольных мероприятий даже по тем гуманитарным предметам, где всегда с успехом применялась только русифицированная версия Microsoft Word.

Система LaTeX находится в постоянной разработке, её первая версия называлась LaTeX2.09, а современная носит название LaTeX2s. Однако стандартные средства системы LaTeX2s созданы уже давно и в качестве учебников, где они подробно описаны,

можно порекомендовать, например, книгу автора этой системы [1], прекрасное пособие [2], а также [3] и [4]. Этих стандартных средств вполне достаточно для подготовки почти всех материалов, используемых в учебных целях (коль скоро речь не идёт о, например, сложной графике и очень громоздких таблицах). Богатая библиотека пакетов (в количестве более 150), обеспечивающих дополнительные возможности, представлена в книге [5].

Использование стандартных средств LaTeX^ очень удобно при формировании билетов или вариантов контрольного мероприятия и ответов к ним и эти приёмы хорошо известны и широко используются. Однако может быть актуален вопрос об автоматической генерации входных файлов LaTeX^. Например, может оказаться затруднительной подготовка большого числа вариантов каждой задачи. И в этих условиях, при невозможности контроля за самостоятельностью решения задач учащимися (прежде всего, при дистанционном обучении), выходом из положения может быть автоматическое перемешивание в билетах нескольких имеющихся вариантов каждой задачи, в соответствии с заданным алгоритмом. Дополнительно можно предусмотреть и изменение порядка следования задач в разных билетах.

В связи с этим возникает ещё одна проблема. Если каждый билет должен быть напечатан в отдельном файле (чтобы учащийся не мог просмотреть все билеты и найти, где встречаются те же варианты задач), то надо либо формировать один выходной файл и затем разбивать его на отдельные файлы, каждый из которых будет содержать ровно один билет, либо сразу формировать много выходных файлов.

Ещё одной проблемой может оказаться автоматическая генерация ответов к заданиям (избавляющая преподавателя от кропотливой ручной работы) с их последующим выводом.

В настоящей работе автор хотел бы поделиться личным опытом, большую часть которого он приобрёл во время недавнего периода дистанционного преподавания. В данной, первой части статьи обсуждаются вопросы, связанные с автоматическим формированием входных файлов LaTeX^ и их обработкой (т.е. трансляцией и последующей чисткой рабочей директории) при условии, что сами задания билетов уже сформированы. Вторая часть статьи будет посвящена вопросам автоматического формирования заданий билетов, исходя из имеющегося банка вариантов задач, и обсуждению удобного представления банка задач на основе возможностей системы LaTeX.

Уточнение обсуждаемых вопросов и анализ математических пакетов

Как было сказано, требуется предусмотреть автоматическое перемешивание в билетах нескольких имеющихся вариантов каждой задачи, как и порядка следования задач, в соответствии с заданным алгоритмом. Здесь могут быть только два подхода: либо это перемешивание осуществляется средствами самого LaTeX^, либо соответствующий входной файл LaTeX^ формируется средствами какой-то внешней программы, в соответствии с заданным алгоритмом. Отметим, что этот входной файл не обязан содержать сами условия задач, а только команды, которые задают эти условия и определены в отдельном файле, где записаны условия. Первый вариант, когда перемешивание осуществляется средствами самой системы LaTeX, представляется малоподходящим по следующей причине. LaTeX - это не отдельная самостоятельная издательская система, а надстройка над издательской системой TeX или Plain TeX, созданной в 1979 г. Дональдом Кнутом, полное описание которой автор дал в книге [6]. Для нашего анализа существенно, что хотя Plain TeX и располагает возможностями для простейших вычислений (см. [7]), но они сводятся к арифметическим операциям над длинами и целыми числами, что, собственно говоря, и нужно для вычисления местоположения объектов на плоскости листа. Естественно, дальнейшее развитие

ТеХ'а не коснулось расширения круга возможных математических операций. Второй же вариант, когда перемешивание осуществляется внешней программой, представляется подходящим.

Внешняя программа, формирующая входной файл LaTeX^, должна быть написана на языке, располагающем определёнными вычислительными возможностями для реализации (весьма простого) алгоритма перестановки вариантов и порядка следования задач и предусматривающем возможность форматного вывода в файл. Эти средства имеются, например, в языке Си и производных от него языках, они хорошо известны и описаны в пособиях по этим языкам (см., например, книгу [8] создателя языка C, где описан его стандарт ANSI C, или несколько последующих её переизданий). Однако, эти языки не располагают возможностью символьных вычислений, т.е. преобразований формул, которые могут потребоваться, например, при автоматизированном решении задач и выводе полученных ответов. Эти возможности реализованы в специализированных системах компьютерной алгебры (или символьных вычислений), среди которых, пожалуй, наиболее известными и разработанными являются Mathematica и Maple. Определённые возможности имеются и в известном пакете прикладных программ MATLAB, благодаря пакету Symbolic Math Tools, базирующемуся, опять-таки, на системе Maple. Во многих системах компьютерной алгебры имеются команды для вывода формул в формате LaTeX^, в MATLAB и Maple этой цели сложит команда с именем latex.

По указанным причинам ниже речь пойдёт, главным образом, о системах Maple и MATLAB. Эти системы располагают командами для чтения из файлов и записи в них, которые основаны на аналогичных командах стандарта языка C, а часто имеют и такой же вид. Между тем в учебной литературе по этим системам (в отличие от языка C) часто вообще ничего не говорится или говорится крайне мало о средствах работы с файлами, поскольку основное внимание уделяется описанию возможностей решения широкого круга прикладных и чисто математических задач. (По этой причине автор не может указать походящий для нашей цели учебник, но берётся изложить в настоящей статье необходимый минимум материала.) К счастью, оба этих пакета снабжены справочной системой, где описаны все имеющиеся команды.

Впрочем, язык C (или какой-либо другой, не располагающий возможностью символьных вычислений) может быть точно так же использован для формирования билетов и ответов к ним, если условия всех вариантов задач и готовые ответы к ним заранее записаны в отдельном файле, а не создаются в процессе генерации входных файлов LaTeX^. Действительно, как уже говорилось, в эти входные файлы надо записывать не сами условия задач и ответы, а команды, ссылающиеся на них.

В связи с обсуждаемыми вопросами возникает ещё одна проблема. Если каждый билет должен быть напечатан в отдельном файле (чтобы учащийся не мог просмотреть все билеты и найти, где встречаются те же варианты задач), то надо либо формировать один выходной файл и затем разбивать его на отдельные файлы, каждый из которых будет содержать ровно один билет, либо сразу формировать много выходных файлов.

При первом подходе можно, например, сформировать, используя LaTeX, один выходной pdf-файл так, что каждый билет будет размещён на отдельной странице, а затем разбить этот файл на отдельные страницы. При отсутствии в наличии Adobe Acrobar Professional, программа, осуществляющая такое постраничное разбиение, легко может быть найдена и доступна online в Интернете (введите запрос: «разбиение pdf на страницы»). Следует отметить, что TeX не располагает возможностью делать одновременно вывод печатного материала в несколько файлов, поэтому при трансляции одного входного файла LaTeX^ получится только один выходной файл. Значит,

при втором подходе требуется сгенерировать много входных файлов LaTeX^ - по одному на каждый билет.

В свою очередь, наличие большого числа входных файлов, подлежащих трансляции в LaTeX^, приводит к вопросу об автоматизации этого процесса. К этому примыкает и вопрос о возможности автоматической чистки рабочей директории от созданных при трансляции вспомогательных и протокольных файлов.

Автоматическая генерация входных файлов LaTeX^

В этом разделе мы вкратце опишем команды, генерирующие входные файлы LaTeX^, что позволит читателю без больших усилий применить эти команды для его собственных целей. Также охарактеризуем возникающие здесь проблемы и пути их решения. (Подчеркнём, что мы говорим о минимальном наборе команд, позволяющих достигнуть поставленной задачи, а на самом деле средств работы с файлами в рассматриваемых нами системах гораздо больше, например, возможно форматное чтение из файла.) Попутно будут затронуты некоторые вопросы и нюансы, о которых в учебниках по MATLAB и Maple не говорится, но которые выясняются экспериментированием с системой и знание которых позволит читателю избежать ошибок, тем более, что понять причину этих ошибок бывает не очень просто. Предполагается, что читатель владеет основами языка MATLAB или Maple, так что мы будем обсуждать именно вопросы, касающиеся некоторых приёмов работы с файлами, а не программирование или решение математических задач - эти аспекты как раз хорошо отражены в обильной учебной литературе.

Прежде чем начать работать с файлом, его надо открыть. Для этой цели в языке C служит команда

fp=fopen(filename, mode)

где filename - имя файла, а mode - режим работы с файлом, который может принимать значения "r" (read - открытие уже существующего файла для чтения), "w" (write - создание нового файла для записи, при наличии же файла с таким именем его содержимое будет уничтожено) и "а" (append - добавление, т. е. запись информации в конец уже существующего файла или создание нового файла при его отсутствии), fp - указатель или идентификатор файла, который будет применяться далее во всех командах работы с этим файлом. В языке C для работы с файлами надо подключать библиотеку <stdio.h> и описывать указатели декларациями вида

FILE *fp;

На многих платформах различаются текстовые и бинарные файлы. В языке C по умолчанию открывается текстовый файл. Если необходимо открыть бинарный файл, то в строку режима необходимо добавить букву "b", например, написать "wb". Строковая константа — это нуль или более символов, заключенных в двойные кавычки, т.е. в качестве mode могут выступать строковые константы указанного специального вида. Имя файла filename также является строковой константой и может содержать путь к файлу (написание пути зависит от используемой платформы).

Точно такая же команда для открытия файла применяется и в MATLAB, с той разницей, что теперь строковые константы могут заключаться и в двойные кавычки и в апострофы (одинарные кавычки), помимо основных вариантов 'r', 'w' и 'a' для mode теперь имеются ещё и некоторые дополнительные, а по умолчанию открывается бинарный файл, так что для открытия текстового надо добавить в описание режима

букву 't', например, написать 'wt'. Кстати, в MATLAB почти всегда неважно, использовать двойные кавычки или апострофы в качестве ограничителей строчных констант, но всё же, как мы увидим, есть две ситуации, где это становится существенным.

Наконец, в Maple эта команда принимает вид

fp:=fopen(filename, mode) либо fp:=fopen(filename, mode,type)

т.е., как обычно, в качестве оператора присваивания используется не знак равенства, а двоеточие с равенством, при этом строковые константы заключаются в двойные кавычки, но для режима mode предусмотрены варианты READ, WRITE и APPEND, и также есть возможность указания в необязательном аргументе type типа файла - TEXT или BINARY (текстовый или бинарный), по умолчанию подразумевается тип TEXT.

Далее, для форматной записи в файл применяется команда

fprintf(fp,format,arg1,...,argn)

где arg1,...,argn - необязательные аргументы, а строковая константа format задаёт выводимый текст и, при наличии аргументов, включает в себя спецификаторы, определяющие формат вывода этих аргументов. Спецификаторы следуют друг за другом в том же порядке, как и соответствующие им аргументы. Текст, включаемый в строку format и без изменений переносимый в файл, может содержать все символы, присутствующие на клавиатуре, кроме нескольких специальных символов, что позволяет использовать его для составления пояснений к выводимым аргументам. К этим специальным символам относятся знак процента %, бэкслэш \, двойные кавычки " и апостроф ', ниже будет сказано о том, как их можно вывести в файл. Спецификаторы почти одинаковы в C и в MATLAB, а Maple дополнены, главным образом, алгебраическими форматами (задающими вывод алгебраических выражений в том виде, как они вводятся в Maple). Спецификаторы всегда начинаются с спецсимвола % и, в простейшем случае, содержат ещё одну следующую за ним букву, самые важные варианты которой перечислены в следующей таблице вместе с указанием типа объекта, выводимого в файл:

d десятичное целое число

c одиночный символ

s строка символов

f десятичное число с фиксированной точкой

e, E десятичное число с плавающей точкой и одной цифрой перед точкой

Кроме того, есть возможность уточнять вид выводимого объекта, например количество записываемых в файл символов или цифр после десятичной точки. Однако, приведённых сведений уже вполне достаточно как для понимания встречающихся ниже примеров, так и, по крайней мере, на первых порах для написания собственных программ. Также строка format может включать в себя некоторые команды, задающие вывод указанных выше специальных видимых символов, а также и невидимых, определяющих перемещение каретки в файле. Из команд первого типа укажем команду вывода бэкслэша - двойной бэкслэш \\ и команду вывода знака процента % -двойной знак %%, а из команд второго типа - команду \n перехода на новую строку. (Кстати, в Maple, кроме последней команды, не предусмотрено других команд, определяющих перемещение каретки, а в языке C и MATLAB они имеются.) Все эти команды, кроме %%, состоят из бэкслэша и следующего за ним символа и называются

эскейп-последовательностями или эскейп-символами (в языке C и MATLAB предусмотрена также возможность вывода любого символа через задание его кода эскейп-последовательностью, в которой после бэкслэша идут три символа). Появление таких записей в строке format будет трактоваться как соответствующая команда и может привести к ошибке. В других случаях одинарный бэкслэш может просто игнорироваться при выводе. Поэтому, для записи бэкслэша в файл в строке формата всегда следует писать двойной бэкслэш. Остаётся сказать о выводе спецсимволов «двойные кавычки» и «апостроф». В языке C и Maple, где строковые константы заключаются в двойные кавычки, апостроф ' уже не играет роль спецсимвола и его можно непосредственно писать в строку, но для него предусмотрен и эскейп-символ Для вывода же двойной кавычки " используется эскейп-символ \". В MATLAB ситуация оказалась хитрее. Для вывода двойной кавычки в строке надо заключить последнюю в апострофы, а саму кавычку либо записать непосредственно, либо как эскейп-символ \". Точно так же, для вывода апострофа надо заключить строку в двойные кавычки, а сам апостроф либо записать непосредственно, либо как эскейп-символ \'. Попытка же записать апостроф в строке, ограниченной апострофами, или двойную кавычку в строке, ограниченной двойными кавычками, приводит к ошибке, даже если использовать для них указанные эскейп-символы.

Наконец, для закрытия файла после окончания его использования во всех трёх системах применяется команда fclose(fp). Отметим, кстати, что программа может одновременно работать с несколькими разными файлами и содержать много описанных выше команд (конечно, при условии, что никогда в команде открытия файла не пишется идентификатор, принадлежащий какому-то открытому в этот момент файлу, и не производится попытка повторного открытия уже открытого и ещё не закрытого на этот момент файла).

Имеет смысл сказать о ещё нескольких особенностях работы команд fprintf, чтобы понять, как будет выглядеть сформированный этими командами файл. Если встречаются несколько команд fprintf, работающих с одним файлом, то каждая из них начинает запись не с новой линии, а помещает её сразу после записи, сделанной предыдущей командой. Это остаётся верно и в том случае, если между двумя командами записи файл был закрыт, а потом опять открыт на добавление. Для перехода же на новую строку следует использовать в строке формата команду \n. Далее, форматный вывод на монитор отождествляется с выводом в файл, идентификатор fp которого задаётся как stdout для языка C, default для Maple и 1 для MATLAB. При этом, конечно, не надо открывать и закрывать этот "файл" и, в случае языка C, описывать идентификатор файла. Но обычно в этом случае используются более короткие эквивалентные записи команды fprintf, без указания на этот специальный идентификатор и с заменой, в случае C и Maple, имени команды fprintf на printf:

printf(format,arg1,...,argn) для языка C и Maple

fprintf(format,arg1,...,argn) для MATLAB

Посылать запись не в файл, а на монитор весьма удобно при отладке программы. Сказанное выше о том, как команды делают записи, остаётся верно с одним исключением: каждая команда printf в Maple будет начинать запись с новой линии, если она содержится на верхнем уровне, т.е. не внутри процедуры (подпрограммы).

Для наших целей (например, создания имён файлов для записи) будет полезна операция конкатенации двух строк, т.е. создание новой строки, полученной приписыванием второй строки в конец первой. В языке C, как и в MATLAB этой цели служит команда strcat(s1,s2) (при этом в C надо подключать библиотеку <string.h>), а в Maple - команда cat(s1,s2), где si и s2 - заданные строковые константы или переменные.

При этом в MATLAB и Maple указанные команды могут применяться к любому числу аргументов. (Если значения всех аргументов команды strcat в MATLAB - строки, заключённые в апострофы, то эта команда вернёт в качестве значения строку, также заключённую в апострофы; если же хотя бы у одного аргумента значение будет строкой, заключённой в двойные кавычки, то таковым будет и значение, возвращаемое командой.) Кроме того, в языке C и в Maple записанные рядом (разделённые только пробелами) строковые константы (но не переменные!) автоматически конкатенируются, и это же происходит в MATLAB со строковыми константами, заключёнными в апострофы и помещёнными внутрь квадратных скобок (результатом будет строка, также заключённая в апострофы).

Выше говорилось, что имя файла filename в команде открытия файла является строковой константой. Возникает важный вопрос: можно ли в качестве filename использовать строковую переменную (значение которой и будет именем файла), а не константу? Поскольку язык C компилирует программу перед её выполнением, то для этого потребуется оформить вызов всех команд работы с файлом (от его открытия и до закрытия) в виде одной подпрограммы (см. похожие примеры в §7.5 и §7.6 книги [9]). В случае же пакетов MATLAB и Maple (которые не компилируют программу, а интерпретируют отдельно каждую входную команду) такой проблемы не возникает -здесь аргумент filename может быть строковой переменной.

Совершенно аналогичным образом обстоит дело и с форматом format в команде записи в файл, про который также было сказано, что он является строковой константой, - в пакетах MATLAB и Maple в качестве формата можно использовать строковую переменную. По этой причине в команде fprintf и для MATLAB и для Maple строка формата и аргумент, являющийся строковой переменной или константой, в определённой мере уравнены в правах. Можно, например, выводить строковую переменную как аргумент (используя формат "%s"), а можно как формат (без аргументов). (Конечно, это не совсем так, если выводимая строка содержит служебные символы. Например, нужна аккуратность при выводе в файл символа % через строку формата, поскольку этот символ трактуется как признак спецификации; для такого вывода этого символа надо написать в строке формата двойной символ %%, в то время как через аргумент этот символ выводится без изменений. Точно так же MATLAB поступает и с бэкслэшем, см. чуть ниже.) Можно использовать операцию конкатенации для формирования строки формата или аргумента-строки. Эти приёмы весьма удобны и примеры их использования встретятся ниже. Однако следует подчеркнуть, что MATLAB и Maple по-разному трактуют бэкслэши в строковых константах. А именно, если MATLAB никак не преобразует строковую константу (в отличие от строки формата), в записи которой присутствует бэкслэш, то Maple поступает с ней как и со строкой формата, т.е. трактует бэкслэш и следующий за ним символ как команду, в частности, двойной бэкслэш преобразуется в одинарный. Последнее обстоятельство следует иметь в виду, если требуется вывести в файл формулы в нотации LaTeX^, поскольку там командные последовательности, изображающие стандартные функции, начинаются с бэкслэша. Следовательно, при выводе формул посредством команды fprintf в системе Maple нужно каждый бэкслэш заменить на двойной бэкслэш, что довольно затруднительно. В качестве альтернативы следует использовать непосредственный вывод формул в файл командой latex. Что же касается вывода формул в системе MATLAB, то этот вывод следует делать через аргумент (а не формат) команды fprintf. Все эти наблюдения пригодятся чуть ниже при построении программ для модельных примеров.

В заключение коснёмся команды latex, предусмотренной в пакетах MATLAB и Maple и обеспечивающей вывод формул в нотации LaTeX^ (но без окружающих долларов или других ограничителей для формул). Команда latex для вывода на монитор имеет вид

latex(expr)

где expr раскрывается в выводимое математическое выражение. В MATLAB предусмотрен только вывод на монитор, чего достаточно, поскольку вывод в файл может быть осуществлён через команду fprintf обсуждаемым ниже способом, а в Maple возможен также вывод в файл командами

latex(expr, filename) и latex(expr, filename, 'append')

которые аналогичны описанным выше командам форматной записи с режимами работы WRITE и APPEND, соответственно. В первом случае файл для записи будет создан (как обычно, с уничтожением прежнего содержимого, если файл с таким именем уже существовал), а во втором - будет производиться запись в существующий файл либо, при его отсутствии, - во вновь созданный. Эти команды закрывают файл после произведённой ими записи. Сказанное выше о том, как команды fprintf и printf в Maple делают записи, остаётся верно и для latex, но с одним уточнением: после выполнения команды latex всегда происходит переход на новую линию. Естественно, попытка записи командой latex в файл, который открыт в данный момент, приведёт к ошибке. Некоторые важные моменты, связанные с использованием команды latex, мы затронем сейчас при обсуждении примеров.

Итак, проиллюстрируем простую возможность генерации входного файла LaTeX^ средствами пакета Maple. Зададим список (т.е. объект типа list) функций, которые надо внести в таблицу:

f_list:=[xA2+sin (3*x)+2*sqrt(x),xA3+cos(x),2*xA2+log(x)];

который отобразится следующим образом на мониторе:

f_list := [x2 + sin(3 x) + 2 -Jx, x3 + cos(x), 2 x2 + ln(x)] и применим к этому списку программу my_file:=fopen("the_test.tex",WRITE); fprintf(my_file,"\\begin{tabular}{|l|c|} \n"): for n from 1 to 3 do f:=f_list[n]:

fprintf(my_file," %d & $",n): close(my_file);

latex(f,"the_test.tex ",'append'); my_file:=fopen("the_test.tex ",APPEND); if n=3 then fmt:="$ \n": else fmt:="$ \\\\ \n": fi: fprintf(my_file,fmt): od:

fprintf(my_file,"\\end{tabular} \n"): close(my_file);

В этом иллюстративном примере команда f:=f_list[n]: присваивает на n-ом шаге

цикла переменной f значение, равное n-ному элементу в списке f_list. Значение

переменной f на каждом шаге могло бы быть сформировано по некоторому заданному алгоритму, а не извлекаться из списка функций, как в нашем примере. В результате выполнения программы будет сформирован файл с именем the_test.tex, в котором записано следующее:

\begin{tabular}{|l|c|}

1 & ${x}A{2}+\sin \left( 3\,x \right) +2\,\sqrt {x}

$ \\

2 & ${x]A{3]+\cos \left( x \right)

$ \\

3 & $2\,{x]A{2]+\ln \left( x \right)

$

\end{tabular}

Заметим, что в командах вывода слова \\begin и \\end должны быть написаны с двойным бэкслэшем, причём независимо от того, встречаются они в строке формата или в аргументе команды fprintf (см. выше). Кстати, здесь видны типичные недостатки работы команды latex - в полученных формулах, записанных в формате LaTeX, много практически лишних символов: фигурные скобки около величин, возводимых в степень и самих степеней, даже если и те и другие состоят из одного символа, сопровождение всех круглых скобок парами ограничителей \left и \right и простановка мелких отступов после всех коэффициентов. Также выглядят неудачными переходы на новые строки в выходном файле. Причина в том, что, как указано выше, после выполнения команды latex всегда происходит переход на новую линию. Отметим также, что каждый раз перед применением команды latex приходится закрывать файл, а после её применения - опять открывать его; поскольку эта команда не будет вести запись в файл, если он в данный момент открыт. Но, в принципе, отмеченные недостатки носят непринципиальный характер, они относятся скорее только к внешнему виду входного файла LaTeX^ и не вызывают проблем при трансляции файла LaTeX^.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Интересно отметить, что никакие другие манипуляции с командой latex здесь невозможны. Дело в том, что хотя эта команда языка Maple и выводит запись формулы в формате LaTeX, то не возвращает её в качестве значения, вернее говоря, возвращает в качестве значения NULL - пустую последовательность символов. Поэтому, нельзя, например, преобразовать запись формулы в строковую переменную, чтобы потом вывести её содержимое в файл командой fprintf.

В качестве альтернативы можно представить записи функций в виде строковых констант с входными текстами LaTeX^:

g_list:=["xA2+\\sin (3x)+2\\sqrt x","xA3+\\cos x","2xA2+\\ln x"];

что даст на мониторе

glist = [ "xA2+\sin (3x)+2\sqrt x" , "x^3+\cos x", "2xA2+\ln x" ]

но этот способ не будет годиться, если функции должны вычисляться в результате символьных преобразований. Соответственно, будет немного упрощена программа:

my_file:=fopen("the_test.tex",WRITE); fprintf(my_file,"\\begin{tabular}{|l|c|} \n"): for n from 1 to 3 do g:=g_list[n]:

fprintf(my_file," %d & $%s$",n,g):

if n=3 then fmt:=" \n": else fmt:=" \\\\ \n": fi:

fprintf(my_file,fmt):

od:

fprintf(my_file,"\\end{tabular} \n"): fclose(my_file);

Теперь отпадает необходимость повторного открытия и закрытия файлов, запись функций осуществляется командой форматной записи fprintf. (Заметим, что такой вывод формул непосредственно в файл можно осуществлять и обсуждавшимися выше средствами языка C.) Сгенерированный файл примет красивый вид:

\begin{tabular}{|l|c|}

1 & $xA2+\sin (3x)+2\sqrt x$ \\

2 & $xA3+\cos x$ \\

3 & $2xA2+\ln x$

\end{tabular}

Вместо двух команд fprintf, расположенных в теле цикла (между ограничителями do и od) можно было написать на месте второй из них одну команду

fprintf(my_file," %d & $%s$%s",n,g,fmt):

Здесь уже строковая переменная fmt рассматривается не как задающая формат, а как содержащая выводимую строковую константу. Возможны и другие модификации с использованием упомянутой команды конкатенации cat.

Ещё одно усовершенствование, которое может быть полезно во многих случаях, такое - при подключении пакета array в LaTeX^ в преамбуле таблицы можно заменить символ c на >{$}c<{$}, и, соответственно, в формате команды fprintf внутри цикла убрать два доллара, которые будут окружать формулу.

Эти программы можно переписать с Maple на язык MATLAB. Начнём с первой программы. В отличие от системы Maple, в MATLAB команда latex допускает вывод только на монитор, но не в файл, а, с другой стороны, она возвращает в качестве своего значения созданную ею запись формулы в нотации LaTeX^ в виде строки. Это строковое значение можно уже выводить в файл через команду форматной записи (что было невозможно в Maple). Команда latex в более поздних версиях MATLAB действует несколько разумнее, чем её двойник в Maple, т.е. не выставляет фигурные скобки около величин, возводимых в степень или самих степеней, если таковые состоят из одного символа, но в остальном она страдает теми же недостатками. При этом символ мелкого отступа \, , который проставляется после всех коэффициентов, равно как и начинающиеся с бэкслэша записи всех стандартных функций делают невозможным вывод формулы через строку формата команды fprintf, но не препятствуют её выводу через аргумент этой команды (см. выше).

Зададим матрицу, состоящую из одной строки, элементы которой - рассматриваемые функции:

syms x

f_list=[xA2+sin(3*x)+2*sqrt(x),xA3+cos(x),2*xA2+log(x)]

и применим к ней следующую программу, написанную на основе сделанных выше наблюдений:

fp=fopen ("the_test.tex ","wt") fprintf(fp,'\\begin{tabular}{|l|c|} \n'); for n = 1:3; f=f_list(n);

fprintf(fp, " %d & $%s$",n,latex(f));

if n==3 fmt=" \n"; else fmt=" \\\\ \n"; end;

fprintf(fp, fmt);

end

fprintf(fp,"\\end{tabular} \n"); fclose(fp)

Интересное усовершенствование: вместо двух команд fprintf, расположенных в теле цикла, можно было бы написать на месте второй из них две команды

strcat(" %d & $%s$",fmt); fprintf(fp,ans,n,latex(f));

первая из которых вычисляет конкатенацию форматов исходных команд, а вторая использует полученный результат в качестве своего формата.

Теперь перепишем на MATLAB вторую программу, в которой формулы заранее заданы в виде строковых констант:

g_list=["xA2+\sin (3x)+2\sqrt x","xA3+\cos x","2xA2+\ln x"]

(где обязательно заключать сроковые константы в двойные кавычки, а не апострофы, иначе они конкатенируются, как было отмечено выше; также напомним, что бэкслэши в формулах дублировать не надо, если они выводятся через аргумент команды fprintf системы MATLAB) и далее следует:

my_file=fopen("the_test.tex","wt"); fprintf(my_file, '\\begin{tabular}{|l|c|} \n'); for n=1:3; g=g_list(n);

fprintf(my_file, ' %d & $%s$',n,g);

if n==3 fmt=' \n'; else fmt=' \\\\ \n'; end;

fprintf(my_file, fmt);

end;

fprintf(my_file, Wend{tabular} \n'); fclose(my_file);

где, опять-таки, два оператора fprintf в теле цикла можно заменить на один, как было отмечено выше.

Наконец, осталось сказать о том, как сгенерировать много входных файлов La-TeX^, каждый из которых будет содержать ровно один билет. Для наших целей потребуется предусмотреть открытие одной командой fopen, расположенной в цикле, файлов с разными именами, задаваемыми строковой переменной (а не константой) filename, значение которой будет разным на разных шагах цикла. Как уже было указано, в случае использования языков MATLAB и Maple это допустимо, а в случае языка C надо оформлять подпрограмму. Итак, на каждой итерации цикла будет формироваться один билет. Например, если значение параметра цикла n совпадает с номером билета, который формируется на данной итерации цикла, а выходной файл для этого билета должен иметь имя bilet-«n».tex, где «n» означает значение переменной n (т.е. при изменении n от, скажем, 1 до 20 это будут файлы с именами bilet-1.tex, bilet-2.tex,..., bilet-20.tex), то имя файла может быть задано командой

filename:=cat("bilet-",n,".tex"); # в Maple

filename:=strcat("bilet-",string(n),".tex"); % в MATLAB

где название системы записано в комментарии.

Здесь использовано то обстоятельство, что в Maple команды конкатенации корректно работают, если значениями каких-то из их аргументов будут простые имена,

т.е. последовательности букв и цифр, а в MATLAB это уже не так и поэтому предварительно необходимо посредством команды string преобразовать число «n» в строку.

Автоматическая трансляция большого числа файлов в пакете LaTeX и чистка рабочей директории

Ранее был уже упомянут следующий вопрос, связанный с обсуждёнными выше, хотя и менее принципиальный: можно ли автоматизировать процесс трансляции в пакете LaTeX всех созданных входных файлов? Если, например, у вас сформировано 50 файлов, то потребуется немало минут «совершенно тупой» ручной работы по их трансляции, которую было бы желательно переложить на компьютер. Заодно было бы хорошо и почистить в автоматическом режиме рабочую директорию от созданных при трансляции log-, aux- и, возможно, других (в зависимости от использованной реализации LaTeX^ и поставленных целей) вспомогательных и протокольных файлов.

На самом деле этот вопрос оказывается тесно связан с материалом предыдущего раздела. Идея достаточно проста: необходимо сгенерировать вместе с входными файлами LaTeX^ и пакетный файл, который будет содержать команды трансляции этих входных файлов и последующего удаления вспомогательных и протокольных файлов. Если кликнуть такой файл, то система сама выполнит всю эту работу.

Например, одной из популярных компьютерных программ верстки в LaTeXe является программа pdfLaTeX (содержащая некоторые усовершенствования типографских возможностей ТеХ'а), которая включена в большинство современных сборок LaTeX^. Её особенностью является то, что при трансляции в качестве выходных она выдаёт сразу pdf-файлы (минуя dvi- и, возможно, ps-файлы), не говоря о генерируемых в любом случае log- и аих-файлах (и, при наличии соответствующих команд, некоторых других файлов, вроде 1^х-файла для составления предметного указателя, -необходимости во всём этом при составлении билетов и ответов к ним, конечно, нет). Пусть, например, требуется оттранслировать файлы с именами bilet-1.tex, bilet-2.tex,..., bilet-20.tex, генерируемые, как описано в предыдущем разделе, программой на языке C, MATLAB или Maple. В результате трансляции появятся выходные файлы с теми же самыми именами и расширением pdf, а также и файлы с расширениями log и aux - мусор, который следовало бы затем удалить из директории. В системе Windows, которую мы и будем иметь в виду, для имён пакетных файлов используется расширение bat, а сам нужный нам файл должен иметь следующий вид (где многоточия означают не выведенную на страницу часть файла): @echo off

pdflatex.exe bilet-1 del bilet-l.aux del bilet-1 .log pdflatex.exe bilet-2 del bilet-2.aux del bilet-2.log

pdflatex.exe bilet-20 del bilet-20.aux del bilet-20.log

Здесь @echo off - команда, отключающая режим вывода команд на экран, pdflatex.exe - команда вызова программы pdfLaTeX (написанная без указания пути, поскольку при инсталляции пакета был установлен доступ к этой программе из любой директории), а del - команда удаления файла. Из предыдущего раздела становится ясно, как сгенерировать такой пакетный файл одновременно с генерацией файлов

LaTeX, а именно: вначале, ещё до входа в цикл, где происходит формирование билетов, этот пакетный файл открывается на запись и в него записывается строка @echo off (напомним, кстати, что символ @ не является специальным и поэтому без изменений выводится в файл командой форматной записи), затем каждый раз одновременно с формированием файла bilet-«n».tex, в пакетный файл пишутся две строки

del bilet-«n».aux del bilet-«n».log

наконец после выхода из цикла этот файл закрывается.

Заключение

Обсуждена проблема автоматизированного формирования билетов контрольных мероприятий и ответов к ним в виде входных файлов системы LaTeX. На основе анализа возможностей этой системы и некоторых математических пакетов сделан вывод о целесообразности: 1) формирования отдельного входного файла для каждого билета, 2) использования для этой цели системы символьных вычислений, например, MATLAB или Maple, или, при определённых условиях, языка C или производных от него. Подробно описаны средства систем MATLAB и Maple, позволяющие сгенерировать такие входные файлы (но почти не отражённые в учебной литературе). Предложен способ для автоматической трансляции всех входных файлов в пакете LaTeX и последующей чистки рабочей директории.

ССЫЛКИ НА ИСТОЧНИКИ

1. Lamport L. LaTeX: A Document Preparation System, User's Guide and Reference Manual. 2nd ed. — Reading: Massachusetts: Addison-Wesley Publishing Company, Inc., 1994. — 273 с.

2. Львовский С. М. Набор и вёрстка в системе LaTeX. 3-е изд., испр. и доп. — М.: МЦНМО, 2003. — 448 с.

3. Гуссенс М., Миттельбах Ф., Самарин А. Путеводитель по пакету LaTeX и его расширению LaTeX2£ / Пер. с англ. О.А. Маховой и др. под ред. И.А. Маховой. — М.: «Мир», 1999. — 606 с. - (Библиотека издательских технологий.)

4. Котельников И.А., Чеботаев П.З. LaTeX2e по-русски. — 3-е издание, перераб. и доп.— Новосибирск: Сибирский. хронограф, 2004. — 496 с.; 4-ое стер. изд. — СПб.: «Корона-Век», 2011. — 496 с.

5. Гуссенс М. Указ. соч.

6. Кнут Д.Е. Все про TeX / Пер.с англ.и подгот. ориг.-макета М.В. Лисиной под ред. С.В. Клименко, С.Н. Соколова. - Протвино: Изд-во АО RDTEX, 1993. - 592 с.; 2-е русск. издание: Перевод с англ. Л.Ф. Козаченко. Под редакцией Ю.В. Козаченко. - М. и др.: Изд. дом «Вильямс», 2003. — 560 с.

7. Кнут Д.Е. Указ. соч.

8. Керниган Б., Ритчи Д. Язык программирования Си / Пер. с англ. Вик.С. Штаркмана / Под ред. и с предисловием Вс.С. Штаркмана. - 2-е изд., перераб. и доп. — Москва: Финансы и статистика, 1992. — 272 с.

9. Керниган Б. Указ. соч.

Sergei A. Dovbysh,

Candidate of Physical-Mathematical Sciences, Associate Professor, Bauman Moscow State Technical University, Associate Professor, M.V. Lomonosov Moscow State University, Moscow, Russia sdovbysh@yandex. ru

On using some software for preparing variants of tests and auxiliary materials: automatic generation of input files and their processing

Abstract. It is well known that the use of the LaTeX publishing system makes it possible, for example, when compiling variants of a control event and answers to them, not to copy the conditions of problems and answers every time, but to replace them with commands that set them; the conditions or answers themselves can be read from a separate file. These techniques are widely used. However, when generating a large number of variants or options, it would be desirable to automate this process as much as possible, as well as receiving answers. This task has become especially relevant when conducting control activities in distance learning, when, in order to avoid possible non-independent solving tasks by students, it is necessary to compile a large number of variants and print them in separate files. On the example of the Maple and Matlab systems, the automatic generation of LaTeX input files according to a given algorithm and their processing are discussed. The article may be useful as a practical guide for teachers of secondary and high schools.

Keywords: LaTeX, Maple, Matlab, C language.

i Надоели баннеры? Вы всегда можете отключить рекламу.