Модуль PT4TaskMakerNET: форматирование текста заданий
Общие сведения
В конструкторе учебных заданий PT4TaskMaker предусмотрена возможность форматирования текста заданий, а также
преамбул для группы и ее подгрупп. Форматирование выполняется с помощью набора управляющих последовательностей
(команд),
большинство из которых имеет вид \
символ.
Используя управляющие последовательности, можно выполнять следующие действия по форматированию текста в окне задачника:
- добавлять в текст специальные символы, в том числе символы шрифта Symbol и буквы западноевропейских языков;
- выделять фрагмент текста полужирным шрифтом;
- использовать в тексте нижние и верхние индексы;
- добавлять в текст задания ссылки на другие задания этой же группы, не указывая при этом название группы (что позволяет корректно изменять эти ссылки при включении задания в другие группы);
- добавлять в текст задания элементы, зависящие от текущего языка программирования (в частности, обозначения логических констант).
Все описанные выше действия обеспечивают требуемое форматирование текста задания как в окне задачника, так и в html-описании данного задания. Аналогичное форматирование (в частности, использование нижних и верхних индексов) можно применять и в текстах комментариев, которые выводятся в окне задачника в разделах исходных и результирующих данных.
Кроме того, имеются управляющие последовательности, не влияющие на текст задания в окне задачника, однако обеспечивающие дополнительное форматирование этого текста (и текста комментариев для группы и ее подгрупп) в html-описании задания или группы заданий. Данные управляющие последовательности позволяют:
- выделять имена переменных курсивом;
- использовать более разнообразное выделение фрагментов текста (помимо полужирного начертания можно установить курсивное начертание, выделение моноширинным шрифтом и специальное выделение);
- разбивать текст задания и преамбулы на отдельные абзацы;
- устанавливать для требуемых фрагментов текста режим вывода с центрированием или с отступом;
- обеспечивать вывод фрагментов текста в несколько столбцов, с возможностью установки способа выравнивания для каждого столбца.
Напомним, что для вывода на экран html-страницы с описанием задания или группы заданий достаточно вызвать процедуру Task,
указав в конце ее параметра (имени задания или группы заданий) суффикс #
. Кроме того, html-страницы
с описанием групп заданий можно генерировать с помощью модуля PT4Demo, используя кнопку
в окне этого модуля.
Таблица управляющих последовательностей
Управляющие последовательности, приведенные в таблице, можно использовать в формулировках заданий (параметр S процедуры TaskText), комментариях к исходным и результирующим данным (параметр Cmt в процедурах групп Data и Result), а также в дополнительных описаниях (преамбулах) групп и подгрупп учебных заданий (параметр S в процедуре CommentText).
Управляющие последовательности, использованные в параметрах процедур групп Data и Result, влияют только на представление соответствующих комментариев в окне задачника (см. столбец «Окно задачника»). Управляющие последовательности, использованные в параметре S процедуры CommentText, обеспечивают соответствующее форматирование преамбулы к группе заданий и ее подгруппам в тексте html-страницы с описанием группы заданий (см. столбец «Html-страница»). Управляющие последовательности, использованные в параметре S процедуры TaskText, влияют на вид формулировок заданий как в окне задачника, так и в html-описаниях.
Все последовательности вида \
символ, не указанные в приведенной ниже таблице, игнорируются как при выводе текста в
окне задачника, так при его отображения в виде html-страницы.
В заголовках подгрупп, указываемых в процедуре CreateTask (параметр SubgroupName), а также в тексте краткого описания группы, указываемого в процедуре CreateGroup (параметр GroupDescription), управляющие последовательности не обрабатываются. При указании в этих строках управляющих последовательностей они дословно воспроизводятся и в окне задачника, и в html-описании. Для указания короткого (–) или длинного (—) тире в кратких описаниях и заголовках подгрупп можно использовать двойные и тройные дефисы соответственно: -- и ---. Начиная с версии задачника 4.10, двойные и тройные дефисы в заголовках подгрупп при их отображении в html-описаниях заменяются на короткие и длинные тире.
Дополнительные сведения об использовании управляющих последовательностей
Необходимость в специальных командах для генерации ссылок на другие задания группы объясняется тем, что любое имеющееся задание может быть импортировано в группу с другим именем (с помощью процедуры UseTask), и поэтому все ссылки на другие задания этой группы также потребуется откорректировать, указав в них новое имя группы. Разумеется, в подобной ситуации необходимо переносить в новую группу все задания, содержащие ссылки друг на друга. Следует заметить, что разность между номерами ссылающихся друг на друга заданий не обязана быть такой же, как в исходной группе заданий. Если в новой группе задания находятся на другом «расстоянии» друг от друга, то для указания правильной ссылки достаточно внести соответствующую поправку в параметр процедуры UseTask.
Наличие нескольких видов неразрывных пробелов, не различающихся в тексте заданий и html-страниц, связано с планируемой в дальнейшем возможностью генерации текста заданий в других форматах (в частности, в формате системы TeX, в котором данные виды пробелов различаются). Приведем рекомендации по использованию неразрывных пробелов:
- вокруг символов
=
,<
,>
указывается обычный неразрывный пробел~
; исключением являются фрагменты текста в скобках вида(> 0)
, в которых рекомендуется использовать малый пробел:(>\,0)
; - неразрывный пробел
~
указывается также между текстом и переменной:стороны~{a} и~{b}
; - вокруг символов
+
и–
ставится средний пробел\;
; - символы умножения
\*
и деления/
пробелами не обрамляются; исключением служит ситуация, когда слева и справа от символа деления указываются прописные буквы; в этом случае желательно использовать обрамление малыми пробелами.
Приведем пример оформления формул (данный пример взят из задания Begin39; обратите внимание на выделение переменных с помощью фигурных скобок, а также на команды, обеспечивающие вывод индексов, выделение квадратного корня и центрирование формулы):
TaskText('Найти корни \Iквадратного уравнения\i ' + '{A}\*{x}^2\;+\;{B}\*{x}\;+\;{C}~=~0, заданного', 0, 1); TaskText('своими коэффициентами~{A}, {B}, {C} ' + '(коэффициент~{A} не равен~0), если известно,', 0, 2); TaskText('что дискриминант уравнения положителен. ' + 'Вывести вначале меньший, а затем',0,3); TaskText('больший из найденных корней. Корни квадратного ' + 'уравнения находятся по формуле', 0, 4); TaskText('\[{x}_{1,\,2}~=~(\-{B}\;\+\;\R{D}\r)/(2\*{A}),\] ' + 'где {D}~\= \Iдискриминант\i, ' + 'равный {B}^2\;\-\;4\*{A}\*{C}.', 0, 5);
В результате обработки данной формулировки задания в окне задачника будет выведен текст:
В html-описании этот же текст будет отформатирован следующим образом:
Для указания кавычек в тексте задания следует использовать управляющие последовательности \<
и \>
.
Управляющие последовательности \t
, \f
, \N
, \O
для логических констант, нулевых указателей и объектов генерируют текст, зависящий от
выбранного в данный момент языка программирования.
Обычные пробелы, указанные после управляющих последовательностей \q
, \Q
, \P
, \[
, \(
,
\]
, \)
, \|
и &
, учитываются только в тексте задачника
(и пропускаются в тексте html-страниц).
Режим специального выделения, устанавливаемый парными командами \S
и \s
,
в окне задачника приводит к выделению полужирным шрифтом, а в html-описании
обеспечивает выделение фрагмента текста,
аналогичное выделению, используемому для имени задания в начале его формулировки
(в приведенном выше фрагменте html-описания так выделено имя задания «Begin39»).
Данный режим рекомендуется использовать для выделения заголовков, размещаемых в начале абзаца (например,
если формулировка задания завершается абзацем, содержащим указание, то с помощью специального выделения
целесообразно выделить текст «Указание» в начале этого абзаца).
Команды выделения переменной {
и }
не влияют на ее вид в окне задачника, но
обеспечивают ее выделение курсивом в тексте html-страницы.
В индексах команды выделения переменной не учитываются,
а любые латинские буквы в них автоматически выделяются курсивом.
В односимвольных индексах нельзя указывать управляющие последовательности для вывода специальных символов,
поэтому при необходимости применения в индексах специальных символов следует использовать режим многосимвольных индексов.
Метки индексов не могут быть вложенными.
В индексах не допускается использование меток выделения \I
, \B
, \S
и наоборот,
внутри выделенного текста не допускается указывать индексы.
Выделенные фрагменты не могут содержать меток выделения другого вида. Режим индексов и выделения, заданный в одной процедуре TaskText или CommentText, не переносится на текст, определяемый при последующих вызовах этих процедур. Если в тексте отсутствуют команды завершения текущего режима (индексов или выделения), то режим автоматически завершается при достижении конца текста, определяемого в текущей процедуре TaskText или CommentText.
В команде начала режима выравнивания по столбцам символы r
, l
, c
определяют
способ выравнивания в каждом столбце текста (r
— выравнивание по правому краю,
l
— выравнивание по левому краю, c
— выравнивание по центру).
Их количество должно быть равно числу столбцов. В каждом столбце должен быть хотя бы один непробельный символ
(для пустого столбца достаточно указать малый неразрывный пробел \,
).
Ввиду сложности управляющих последовательностей, связанных с выравниванием по столбцам, приведем пример их использования (пример взят из задания If26):
TaskText('Для данного вещественного~{x} найти значение ' + 'следующей функции~{f},', 0, 1); TaskText('принимающей вещественные значения:', 0, 2); TaskText('\[\Jrcrl&\,&\,& \-{x},& если {x}~\l~0,', 26, 3); TaskText('&{f}({x})&~=~&{x}^2,& если 0~<~{x}~<~2,', 26, 4); TaskText('&\,&\,& 4,& если {x}~\g~2.\j\]', 26, 5);
В результате обработки данной формулировки задания в окне задачника будет выведен текст:
В html-описании этот же текст будет отформатирован следующим образом:
Команду разрыва строки \|
можно использовать как в обычном тексте, так и в режиме выделения с отступом или центрированием
(в режиме выравнивания по столбцам переход на новую строку выполняется автоматически).
Для более наглядного отображения в html-документе текста, выровненного по столбцам, данный текст рекомендуется
дополнительно центрировать (как в приведенном выше примере) или использовать для него режим выравнивания с отступом.
Следует обратить внимание еще на одну особенность формулировок, содержащих выравнивание по столбцам: строки с подобным выравниванием, как правило, не нужно центрировать в окне задачника. В приведенном примере в трех последних вызовах процедуры TaskText в качестве параметра X указывается не нулевое значение (означающее центрирование по горизонтали), а число 26 — значение позиции по горизонтали, начиная с которой требуется вывести указанную строку.
Указанное обстоятельство может затруднить использование для подобных формулировок нового варианта процедуры TaskText, появившегося в конструкторе версии 4.11. В этом варианте указывается единственный строковый параметр, содержащий все строки формулировки, разделенные символами разрыва строки (#13 или #10). При разборе этого параметра из каждой строки формулировки удаляются начальные и конечные пробелы, причем строки формулировки, оказавшиеся в результате пустыми, игнорируются, а все непустые строки выводятся в окне задачника в режиме центрирования. Тем не менее, и этот вариант процедуры TaskText позволяет обеспечить особое выравнивание требуемых строк в окне задачника. Для этого надо добавить некоторое количество вспомогательных начальных или конечных пробелов к строке, требующей специального выравнивания, причем первый начальный или последний конечный пробел надо экранировать символом \, чтобы не допустить его автоматического удаления. Прочие пробелы (следующие за начальным пробелом или предшествующие конечному пробелу) экранировать необязательно. Приведем пример определения формулировки, в котором используется новый вариант процедуры TaskText (следует обратить внимание на конечные пробелы, указанные в последних трех строках; в остальном текст формулировки не отличается от приведенного выше):
TaskText('Для данного вещественного~{x} найти значение следующей функции~{f},'#13 + 'принимающей вещественные значения:'#13 + '\[\Jrcrl&\,&\,& \-{x},& если {x}~\l~0, \ '#13 + '&{f}({x})&~=~&{x}^2,& если 0~<~{x}~<~2, \ '#13 + '&\,&\,& 4,& если {x}~\g~2.\j\] \ ');
Управляющая последовательность \P
предназначена для разделения абзацев.
В тексте, отображаемом в окне задачника, данная команда игнорируется (подобно прочим командам, связанным с разделением на абзацы).
Для нее не предусмотрено парной завершающей команды, поскольку необходимые теги при переходе к новому абзацу
добавляются в текст html-страницы автоматически. Пробелы после команды \P
при генерации html-страницы игнорируются,
однако они учитываются при отображении текста в окне задачника.
Генерация специальных символов
Используя две «универсальные» управляющие последовательности \h
и \H
,
можно включать в текст задания или преамбулы специальные символы,
входящие во вторую половину кодовой таблицы для западноевропейских языков ANSI Latin-1 (команда \h
) или
содержащиеся в Windows-шрифте Symbol (команда \H
).
После имени каждой из этих команд следует указать двузначное шестнадцатеричное число, определяющее
код требуемого символа; при этом шестнадцатеричные цифры A, B, C, D, E, F можно указывать в любом регистре.
Если двухсимвольный текст после команд нельзя преобразовать в шестнадцатеричное число или число не является допустимым,
то команды возвращают символ «?» (знак вопроса).
В случае команды \h
(символы таблицы Latin-1) допустимыми считаются числа из диапазона 128–255, за исключением
кодов неотображаемых символов, например, кода неразрывного пробела 160 (A0) или «мягкого» переноса 173 (AD).
Символы таблицы Ansi Latin-1 с кодами 128–159 имеют в кодировке Unicode другие значения кодов;
при генерации html-описаний для этих символов используются их коды в таблице Unicode.
С помощью команды \H
можно получить только часть символов, определенных в Windows-шрифте Symbol.
Исключены символы, уже присутствующие в таблицах ASCII и ANSI Latin-1 (например, цифры и знаки препинания)
или имеющие идентичное начертание с символами из этих таблиц (например, заглавные греческие буквы, совпадающие по
начертанию с латинскими: A, B, E, H, X и т. д.). Кроме того, исключены символы с кодами 230–239 и 243–254,
представляющие собой фрагменты больших скобок.
Следует заметить, что для части математических символов нельзя обеспечить их
правильное отображение в каждом из трех наиболее популярных веб-браузеров (Microsoft Internet Explorer,
Mozilla Firefox и Opera) без использования средств веб-программирования.
В браузерах Internet Explorer и Firefox можно подключать шрифты Windows, в том числе
шрифт Symbol, однако в Opera это сделать нельзя. С другой стороны, в Opera и Firefox для отображения
всех стандартных математических символов достаточно указать их код в Unicode-кодировке, однако в
стандартных Windows-шрифтах, используемых браузером Internet Explorer, часть символов с требуемыми кодами отсутствует.
При реализации команды \H
для вывода подобных символов в html-документе был выбран вариант,
обеспечивающий их правильное отображение в браузере Internet Explorer (и Mozilla Firefox):
для этого используется Windows-шрифт Symbol. Однако в браузере Opera (и других браузерах, не поддерживающих шрифты Windows)
данные символы будут отображаться неправильно.
Примечание. Для возможности использования Windows-шрифтов в браузере Mozilla Firefox следует установить режим «Разрешить веб-сайтам использовать свои шрифты вместо установленных». Соответствующий флажок находится в окне «Шрифты», которое можно отобразить с помощью следующей последовательности действий: выполнить команду меню «Инструменты | Настройки...», в появившемся окне «Настройки» перейти на вкладку «Содержимое» и в разделе «Шрифты и цвета» нажать кнопку «Дополнительно...».
С некоторыми часто используемыми специальными символами связаны особые управляющие последовательности (см. таблицу управляющих последовательностей, раздел «Символы»). Все подобные символы правильно отображаются во всех перечисленных выше браузерах.
Хотя символ пересечения (∩, код 8745)
имеется в стандартных Windows-шрифтах, прочие символы, связанные с множествами
(объединение, вложение, принадлежность и т. д.), в этих шрифтах отсутствуют.
Для того чтобы все обозначения, связанные с множествами, выглядели в html-документе единообразно,
для отображения символа пересечения (команда \Hc7
)
используется соответствующий символ из шрифта Symbol.
Ниже приводятся таблицы всех символов, которые можно получить с помощью универсальных команд \h
и \H
.
Первая таблица содержит символы, генерируемые командой \h
, а вторая — символы, генерируемые командой \H
.
Команды из второй таблицы, связанные с теми символами, которые будут неверно отображаться в браузере Opera,
выделены полужирным шрифтом.
Таблица 1. Символы, генерируемые командой \h
\h80 € |
\h82 ‚ |
\h83 ƒ |
\h84 „ |
\h85 … |
\h86 † |
\h87 ‡ |
\h88 ˆ |
\h89 ‰ |
|
\h8a Š |
\h8b ‹ |
\h8c Œ |
\h8e Ž |
\h91 ‘ |
\h92 ’ |
\h93 “ |
|||
\h94 ” |
\h95 • |
\h96 – |
\h97 — |
\h98 ˜ |
\h99 ™ |
\h9a š |
\h9b › |
\h9c œ |
|
\h9e ž |
\h9f Ÿ |
\ha1 ¡ |
\ha2 ¢ |
\ha3 £ |
\ha4 ¤ |
\ha5 ¥ |
\ha6 ¦ |
\ha7 § |
|
\ha8 ¨ |
\ha9 © |
\haa ª |
\hab « |
\hac ¬ |
\hae ® |
\haf ¯ |
\hb0 ° |
\hb1 ± |
|
\hb2 ² |
\hb3 ³ |
\hb4 ´ |
\hb5 µ |
\hb6 ¶ |
\hb7 · |
\hb8 ¸ |
\hb9 ¹ |
\hba º |
\hbb » |
\hbc ¼ |
\hbd ½ |
\hbe ¾ |
\hbf ¿ |
\hc0 À |
\hc1 Á |
\hc2 Â |
\hc3 Ã |
\hc4 Ä |
\hc5 Å |
\hc6 Æ |
\hc7 Ç |
\hc8 È |
\hc9 É |
\hca Ê |
\hcb Ë |
\hcc Ì |
\hcd Í |
\hce Î |
\hcf Ï |
\hd0 Ð |
\hd1 Ñ |
\hd2 Ò |
\hd3 Ó |
\hd4 Ô |
\hd5 Õ |
\hd6 Ö |
\hd7 × |
\hd8 Ø |
\hd9 Ù |
\hda Ú |
\hdb Û |
\hdc Ü |
\hdd Ý |
\hde Þ |
\hdf ß |
\he0 à |
\he1 á |
\he2 â |
\he3 ã |
\he4 ä |
\he5 å |
\he6 æ |
\he7 ç |
\he8 è |
\he9 é |
\hea ê |
\heb ë |
\hec ì |
\hed í |
\hee î |
\hef ï |
\hf0 ð |
\hf1 ñ |
\hf2 ò |
\hf3 ó |
\hf4 ô |
\hf5 õ |
\hf6 ö |
\hf7 ÷ |
\hf8 ø |
\hf9 ù |
\hfa ú |
\hfb û |
\hfc ü |
\hfd ý |
\hfe þ |
\hff ÿ |
Таблица 2. Символы, генерируемые командой \H
\H22 " |
\H24 $ |
\H27 ' |
\H2d − |
\H40 @ |
\H44 Δ |
\H46 Φ |
\H47 Γ |
\H4c Λ |
\H50 Θ |
\H51 Θ |
\H53 Σ |
\H56 ς |
\H57 Ω |
\H58 Ξ |
\H59 Ψ |
\H5c \ |
\H5e ^ |
\H61 α |
\H62 β |
\H63 χ |
\H64 δ |
\H65 ε |
\H66 f |
\H67 γ |
\H68 η |
\H69 ι |
\H6a φ |
\H6b κ |
\H6c λ |
\H6d μ |
\H6e ν |
\H70 π |
\H71 θ |
\H72 ρ |
\H73 σ |
\H74 τ |
\H75 υ |
\H76 v |
\H77 ω |
\H78 ξ |
\H79 ψ |
\H7a ζ |
\Ha1 ¡ |
\Ha2 ′ |
\Ha3 ≤ |
\Ha5 ∞ |
\Ha7 ♣ |
\Ha8 ♦ |
\Ha9 ♥ |
\Haa ♠ |
\Hab ↔ |
\Hac ← |
\Had ↑ |
\Hae → |
\Haf ↓ |
\Hb2 ″ |
\Hb3 ≥ |
\Hb5 µ |
\Hb6 ∂ |
\Hb9 ≠ |
\Hba ≡ |
\Hbb ≈ |
\Hbd │ |
\Hbe ─ |
\Hbf ¿ |
\Hc0 א |
\Hc1 Á |
\Hc2 Â |
\Hc3 Ã |
\Hc4 Ä |
\Hc5 Å |
\Hc6 Æ |
\Hc7 Ç |
\Hc8 È |
\Hc9 É |
\Hca Ê |
\Hcb Ë |
\Hcc Ì |
\Hcd Í |
\Hce Î |
\Hcf Ï |
\Hd0 Ð |
\Hd1 Ñ |
\Hd5 ∏ |
\Hd6 √ |
\Hd9 Ù |
\Hda Ú |
\Hdb Û |
\Hdc Ü |
\Hdd Ý |
\Hde Þ |
\Hdf ß |
\He0 ◊ |
\He1 ‹ |
\He5 ∑ |
\Hf1 › |
\Hf2 ∫ |