Найдено на: http://www.i-rs.ru/article/articleprint/429/-1/51/
|
Главная
OpenOffice.org
Статьи и переводы
Конкурс на лучшую статью
Конкурсные работы (53)
Офисные Технологии (12)
Сложная разметка и хитрости в OpenOffice.org Math
|
Я – студент. Использую OpenOffice.org уже не первый год как основной офисный пакет. Поскольку я учусь на технической специальности, для меня важно иметь под рукой необходимый инструментарий для создания технических документов. Одним из таких инструментов, привлекших меня, был как раз OpenOffice.org Math – редактор формул OpenOffice.org.
Потратив пару дней на освоение и чтение кое-какой документации, я понял, что, несмотря на трудности при освоении OOo Math, потраченное время с лихвой окупится в дальнейшем при наборе формул.
Но на одном удобстве метода далеко не уедешь. Необходимо было научиться вводить не только простые, но и сложные формулы, наборы формул, выровненные особым образом, «многоэтажные» формулы и т.д. Помимо этого передо мной (и не только передо мной) вставал стандартный вопрос: «А как это сделать?» Предлагаю Вашему вниманию ряд решений для создания сложных формул.
Поскольку речь пойдёт именно о сложной разметке, я буду предполагать, что человек, читающий статью, освоил основы работы с OpenOffice.org Math (например, прочитал 16-ю главу Руководства по Writer), в противном случае читатель может не разобраться в статье.
Хочу также выразить благодарность участникам форума http://community.i-rs.ru
Системы уравнений и неравенств
Про запись систем упоминается в 16-й главе Руководства по Writer. Например:
Примечание: далее по тексту заголовок таблицы буду опускать
Разберём этот код.
left lbrace – открывающаяся масштабируемая фигурная скобка.
right none – указывает, что закрывающей скобки не требуется.
alignl – устанавливает выравнивание строк по левому краю
# - переход на новую строку
Хочу обратить внимание, что команды left и right не могут использоваться отдельно друг от друга. Кроме того, использование # как символа перехода на новую строку вне блока stack может вызвать ошибку.
Скобки можно комбинировать. Например: left [ right rbrace. Пример использования: преобразование записи из совокупности неравенств в промежуток на числовой оси.
Системы уравнений и неравенств с условиями
Иногда к уравнениям требуется дописать условие. Например, y = 0 при x > 3. Часто вместо слова при ставят запятую. Запишем пример системы уравнений с условиями
Однако подобная запись не всегда будет смотреться эстетично. Например:
Требуется реализовать такую запись, чтобы условия были друг под другом и выровнены по их левому краю. В таком случае лучше использовать команду matrix
Разберём этот код.
left lbrace – открывающаяся масштабируемая фигурная скобка.
right none – указывает, что закрывающей скобки не требуется.
alignl – устанавливает выравнивание строк по левому краю
# - следующий элемент строки (т.е. переход на следующий столбец в текущей строке)
## - переход на новую строку
При такой записи также можно опустить запятые после уравнений.
В качестве примера запишем кусочно-непрерывную функцию.
Выравнивание в дробях
Если Вы будете записывать системы уравнений, содержащие дроби, вы наверняка столкнётесь с проблемой выравнивания числителя и знаменателя дроби. Дело в том, что, указав alignl перед системой уравнений или перед конкретной строкой, все элементы этой строки будут выровнены по левому краю. В том числе числитель и знаменатель дроби. Аналогичное явление будет наблюдаться в многострочных формулах (например, при использовании newline и/или stack). Простой пример:
Логичный выход из ситуации – установка выравнивания по центру для числителя и знаменателя дроби.
Если присмотреться к тому, как Math определяет границы выравнивания, то очевидно, что он определяет их по наиболее длинному элементу. Например, выравнивание по левому краю короткого числителя приводит к тому, что числитель выравнивается по левому краю относительно левого края знаменателя. Аналогичная картина будет наблюдаться при выравнивании короткого числителя по центру: он выровняется по центру относительно знаменателя. В большинстве случаев мы заранее можем определить длины числителя и знаменателя. Тогда достаточно указать выравнивание либо числителя, либо знаменателя. Это приводит к сокращению записи.
Приведу пример многострочной формулы.
Аналогично осуществляется выравнивание числителя и знаменателя по центру в системах уравнений и неравенств.
Расширенные матрицы
Немного расскажу о записи расширенных матриц, не вдаваясь в математическую сторону вопроса. По сути, требуется провести вертикальную линию между столбцами матрицы. Для этого существует команда mline. Например:
Однако у mline есть серьёзный недостаток, который мне пока не удалось компенсировать даже другими методами проведения вертикальной линии. Речь о некорректном выравнивании элементов матрицы друг относительно друга. Простой пример:
На самом деле 6 цифра должна быть на уровне 3 и 4. Разработчики оповещены о проблеме.
Хитрости
Перейдём теперь к приёмам записи некоторых выражений в OOo Math. Примеры составлены на основании вопросов, на которые я в своё время отвечал себе и другим людям.
Вопрос: как сделать двойной верхний/нижний индекс? Как сделать одновременно два индекса?
Ответ: например, так:
Вопрос: как сделать «многоэтажные» дроби
Ответ: с помощью операторных фигурных скобок. Например:
Вопрос: как напечатать знак равенства (неравенства, принадлежности и т. п.), не используя спецсимволы? Math ругается на отсутствие операндов.
Ответ: использовать операторные фигурные скобки. С помощью них можно указать Math пустой операнд, записав на его месте {}. Например:
С помощью подобной записи можно организовать перенос выражения на новую строку. Например:
В большинстве случаев необходимо выравнивание по левому краю. Изменим запись:
Поскольку alignl выравнивает по левому краю относительно самой длинной строки в формуле, то alignl перед этой самой строкой можно опустить. В нашем примере таковой является верхняя. Поэтому можем записать:
Визуально формулы выглядят одинаково.
Вопрос: когда я ввожу Re (чтобы указать действительную часть комплексного числа), у меня подставляется спецсимвол, а мне этого не надо. Как записать выражение для действительной части числа? Как записать обозначение числа Рейнольдса?
Ответ: поясню о чём идёт речь. У нас принято обозначать действительную часть комплексного числа z как Re(z), т.е. Re является функцией и, следовательно, используется обычное начертание. Math подставляет символ R вместо Re. Один из способов решения основан на следующем: по умолчанию Math настроен так, что обычный текст оформляется как раз обычным начертанием (если это не так – то соответствующие параметры можно настроить из меню: Формат – Шрифты). Поэтому просто укажем Math, что Re – это текст.
Теперь про число Рейнольдса. Число Рейнольдса – в общем случае переменная, а для конкретного случая – константа. Поэтому оформлено оно должно быть курсивом: Re. Соответственно, есть два способа решения этой проблемы.
Первый способ: указать курсивное начертание:
Но есть и другой способ. Он сработает в том случае, если Вы не обозначили какой-либо спецсимвол через %Re. Если нет соответствующего символа, Math записывает курсивом последовательность символов, стоящую после знака %.
Этот способ неочевиден, но он более компактен. Кроме того не все символы можно отобразить таким образом.
Вопрос: почему тригонометрические функции sin и cos оформляются правильно (т.е. обычным начертанием), а tg – курсивом? Как решить эту проблему?
Ответ: дело в том, что в России и в США разные обозначения тригонометрических функций. У нас тангенс обозначается как tg, а в США и Западной Европе – tan. Поэтому tg воспринимается Math как переменная, следовательно, он оформляет её курсивом. Решение проблемы – аналогично записи действительной части числа: укажем Math, что tg – это текст.
Кстати, как и ожидалось, tan оформляется обычным начертанием без каких-либо ухищрений.
Вопрос: как оформить сложение уравнений в системе?
Ответ: данный вопрос рассмотрю подробно, поскольку здесь используется сложная разметка, которая может пригодиться в различных случаях.
Сперва рассмотрим способ проведения горизонтальной черты под матрицей. Это делается подчёркиванием матрицы. Однако на мой взгляд, underline здесь не совсем подходит, поскольку запись будет выглядеть не очень эстетично, а именно:
Можно отступить строчку, добавив в матрицу пустую строку.
Но, согласитесь, смотрится также не очень красиво. Поэтому могу предложить два других способа. Первый – подбор высоты, на которой надо провести горизонтальную линию. В этом случае линию проводим перечёркиванием (overstrike).
Минус данного способа состоит в том, что выражение под чертой придётся вписывать в саму матрицу (в противном случае будет большой отступ снизу), что само по себе используется не всегда. К тому же появляются сложности с проставлением слева фигурной скобки: её тоже придётся подбирать по высоте вне зависимости от матрицы, что чревато нарушением разметки. Поэтому этот способ отбросим ввиду его вопиющей неуниверсальности.
Предложу на суд читателя ещё один вариант.
Суть такова: мы перечёркиваем невидимую матрицу. Тогда наша задача – подобрать размер перечёркиваемой матрицы такой же, как и у верхней.
Полученная запись кажется мне наиболее эстетичной и удобной с точки зрения дальнейшего решения проблемы. Хотя, признаться, этот способ (в отличие от подчёркивания матрицы с помощью underline) не столь очевиден.
Исходя из этих соображений, рассмотрим запись системы уравнений с помощью этих двух способов.
Простой случай: без почленного выравнивания слагаемых (т.е. одно уравнение написано просто под другим).
В выделенной полужирным начертанием команде мы используем невидимые символы для указания длины линии. Очевидно, что линию нужно выровнять по правому краю (alignr) и сделать по длине чуть больше самого длинного уравнения (в данном случае это верхнее). Выражение под командой phantom представляет из себя самое длинное уравнение системы, удлинённое добавленным символом q (на его месте может быть и другой символ или несколько символов, а также такие символы могут отсутствовать вообще, если Вы считаете удлинение линии нецелесообразным). Указание под phantom самого длинного уравнения (а не другой комбинации символов) упрощает подбор линии нужной длины, поскольку мы как бы ведём отсчёт от известной длины.
В обоих случаях имеется одна и та же проблема – выравнивание итога (103y = 18). Может, конечно, alignc или alignr случайно дадут нужное Вам выравнивание, но это маловероятно. Придётся выравнивать с помощью пробелов (обратный апостроф или гравис ` и тильда ~) и невидимых символов. Например, чтобы выровнять итог по левому краю уравнений системы, можно воспользоваться невидимыми символами:
Сопоставьте выделенные полужирным начертанием участки кода и Вы поймете логику.
Рассмотрим более сложный случай: с почленным выравниванием уравнение. Грубо говоря, x находится под x, y – под y и т.д. В таком случае надо использовать две матрицы: одну для системы уравнений, другую – для итоговой строки.
Вы можете спросить: а зачем мы последнюю строку записали с помощью матрицы? Можно было просто написать обычную строчку и выровнять её вручную. Да, так можно сделать, но в описанном мной случае выравнивать элементы матрицы на мой взгляд проще: доставлять пробелы и невидимые символы в отдельных элементах матрицы удобнее, поскольку тогда мы привязываемся только к границам соответствующей ячейки матрицы, а не ко всей строке.
alignr при переменных используется для выравнивания «по переменной», alignl у знаков равенства используется для расположения их друг под другом. Тем самым мы достигаем независимости записи самой системы уравнений от длины этих уравнений или коэффициентов при переменных.
Недостаток этого способа очевиден: несмотря на идеальное выравнивание самих уравнений, приходится подбирать длину горизонтальной линии (как и в предыдущем случае), а также отступы для итоговой строки (в указанном примере я это сделал с помощью коротких пробелов – см. выделенный текст).
Последний недостаток можно устранить в том случае, если допустимо оставить немного места после итоговой строки. Понятно, что размер матрицы автоматически подбирается по самым длинным её элементам. Суть предлагаемого мной метода заключается в том, чтобы задать равные размеры матриц системы уравнений и итоговой строки, а именно – по наиболее длинной строке системы уравнений указать размер итоговой строки. Какую команду для этого удобно использовать? Правильно, phantom!
Мы просто «зафантомили» самую длинную строку и расположили её аккурат под итоговой строкой, а точнее – мы её добавили к матрице итоговой строки. Именно для неё требуется дополнительное место.
Напоследок рассмотрю задачу, которую у меня пока не получилось решить. Задача: а что делать, если итоговая строка длиннее всех уравнений системы? Такая ситуация маловероятна. Суть решения проблемы аналогична: добавить над системой уравнений скрытую строку, равную по длине итоговой строке, причём вписать скрытую строку необходимо в ту же матрицу (или stack), в которой записана система уравнений. Сама запись не сложна, но не удаётся корректно поставить фигурную скобку слева, т.е. чтобы она обрамляла только уравнения, но не скрытую строку. При этом отделить скрытую строку от матрица системы уравнений нельзя, поскольку тогда потеряется эффект подбора ширины. за который мы и боремся.
В этой ситуации есть три выхода. Первый – подбор нужной ширины с помощью пробелов и скрытых символов, что неуниверсально и часто неудобно. Второй – не ставить слева знак + и фигурную скобку, но тогда нарушается вся соль записи, которая превращается просто в запись матрицы из нескольких строк, первая из которых скрытая. Третий выход подразумевает дорисовывание фигурной скобки внешними средствами: например, если Вы используете Math как редактор формул в Writer (как чаще всего и бывает), то можно дорисовать фигурную скобку с помощью соответствующей кнопки на панели инструментов Рисунок.
Заключение
Можно придумать ещё много ситуаций, когда разметка Math сложна, малопонятна. Конечно, я не могу охватить сразу все случаи. Но Math хорош как раз тем, что достаточно понять логику и принципы его работы – и можно приниматься за решение практически любых задач касаемо набора математических формул. Именно эта черта делает Math довольно удобным в освоении и работе.
Об авторе
Подробнее:
Смирнов Дмитрий Вячеславович (DMA)
Дата создания:
09.03.2007
Обсудить
на форуме:
community.i-rs.ru
Присоединенные файлы