MetaPost

Поделись знанием:
Перейти к: навигация, поиск
MetaPost
Класс языка:

императивный

Появился в:

1994

Автор:

Джон Хобби

Выпуск:

1.212 (19 октября 2010)

Тестовая версия:

1.902 (23 апреля 2014)

Система типов:

неявная, динамическая, строгая

Испытал влияние:

METAFONT

Повлиял на:

Asymptote

Сайт:

[foundry.supelec.fr/projects/metapost/ .supelec.fr/projects/metapost/]

MetaPost — интерпретатор языка программирования META, который можно использовать для создания графических иллюстраций. MetaPost был создан Джоном Хобби в то время, когда он был аспирантом у Дональда Кнута. В качестве основы была взята система создания шрифтов METAFONT[1].

На входе интерпретатору подаётся текст на META, а на выходе получается графический файл в формате PostScript[2]. Начиная с версии 1.200 MetaPost поддерживает в качестве выходного формата SVG-графику[3].

Язык META, унаследованный от METAFONT, позволяет оперировать геометрическими объектами, такими как: точка, путь, картинка и выполнять над ними различные алгебраические действия, например, сдвиг, вращение и другие линейные преобразования.

Основными отличиями MetaPost от METAFONT кроме выходного формата является наличие поддержки цвета и возможность делать текстовые вставки. Текстовые вставки создаются с помощью LaTeX, таким образом, любая конструкция, которая может быть создана в LaTeX, также может быть вставлена в картинку MetaPost. Кроме этого изначально автор MetaPost Джон Хобби разработал библиотеку для визуализации двумерных графиков[4].

Интерпретатор MetaPost (исполняемый файл mpost) вместе со стандартными макро-библиотеками распространяется как открытое программное обеспечение, обычно, в составе дистрибутивов LaTeX.





MetaPost-конвейер

На вход программы mpost подаётся «META-картинка». «META-картинка» — это текстовый файл с расширением .mp (далее для краткости mp-файл) с инструкциями на языке META. В одном mp-файле можно хранить несколько описаний картинок. При компиляции с помощью mpost создаются файлы с тем же именем, что и у исходного файла, но с расширениями в виде чисел, которые указываются в декларации beginfig. Результирующие файлы сразу можно вставлять в LaTeX-тексты с помощью обычного \includegraphics. Для этого достаточно в заголовок tex-файла добавить команду из LaTeX-пакета graphicx:

\DeclareGraphicsRule{*}{eps}{*}{}

От «правильных» eps-файлов они отличаются только тем, что в них не «внедрены» шрифты, поэтому просмотреть их без дополнительной обработки не удастся.

Шрифты можно внедрить посредством программ latex и dvips с результатом в виде eps-файла или скрипта mptopdf с результатом в виде pdf-файла. Эти картинки уже можно использовать независимо любой программой, которая поддерживает эти векторные форматы.

Кириллица и MetaPost

Внедрить кириллицу в метки MetaPost можно только с помощью LaTeX. Для этого mp-файл должен иметь примерно следующий заголовок:

verbatimtex 
\documentclass[12pt]{minimal} 
%простейшая кириллизация
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\begin{document}
etex;

Этот заголовок будет использоваться каждый раз, когда MetaPost доходит до текста, находящегося между метками btex и etex. Если для создание метки требуется какой-либо пакет LaTeX, то, соответственно, необходимо добавить этот пакет в заголовок стандартным образом.

Для того, чтобы при создании надписи использовался именно latex, интерпретатор mpost должен запускаться с опцией -tex=latex. Если эта опция отсутствует, то информацию о том, что следует запускать, mpost ищет в переменной окружения TEX. По умолчанию вместо latex запускается tex.

Если в тексте определяется переменная prologues, то она должна быть равна 0. В этом случае все необходимые шрифты «подшиваются» к картинке в момент, когда создаются eps и pdf-файлы.

Структура mp-файла

После заголовка идут описания картинок. Каждая картинка заключается между командами beginfig и endfig. В качестве параметра beginfig указывается порядковый номер картинки. При компиляции этот номер будет добавляться к картинке как расширение. Пример:

%Математический HelloWorld
beginfig(3) ;
 for alpha:=90 step -9 until 0:
  label(btex \(f(x)=
  \frac{1}{\sqrt{2\pi}\,\sigma}
    \int\limits_{-\infty}^{\infty}
      e^{-\frac{x^2}{2\sigma^2}}dx\) etex
    scaled (5*(1-alpha/100)) rotated alpha,(0,0))
 withcolor(max(1-alpha/45,0)*red+min(alpha/45,2-alpha/45)*green+max(alpha/45-1,0)*blue);
 endfor;
endfig ;

Файл должен закончиться командой end. или bye. Эти команды дают понять интерпретатору mpost, что обработка закончена.

Автоматизация

Для автоматизации получения картинок с помощью MetaPost можно использовать следующий Makefile:

#временный файл
tmp_file := tmp_file
#программы
LATEX := latex 
MPOST := mpost -tex=latex 
DVIPS := dvips
MPTOPDF := mptopdf
MV := mv
all:
	@echo "run: make mpfile.n.[eps|pdf] - where n is the picture number"
%.eps: % 
	@echo  "\documentclass[12pt]{minimal}">$(tmp_file).tex
	@echo  "\usepackage[koi8-r]{inputenc}">>$(tmp_file).tex
	@echo  "\usepackage[english,russian]{babel}">>$(tmp_file).tex
	@echo  "\usepackage{graphicx}">>$(tmp_file).tex
	@echo  "\DeclareGraphicsRule{*}{eps}{*}{}">> $(tmp_file).tex
	@echo  "\nofiles">>$(tmp_file).tex
	@echo  "\begin{document}">> $(tmp_file).tex
	@echo  "\thispagestyle{empty}">> $(tmp_file).tex
	@echo  "\includegraphics{$(basename $@)}">> $(tmp_file).tex
	@echo  "\end{document}">> $(tmp_file).tex
	@$(LATEX) $(tmp_file)
	@$(DVIPS) -E -o $@ $(tmp_file)
	@rm $(tmp_file).*
%.pdf: % 
	@$(MPTOPDF) $<
	@$(MV) `echo $< | sed -e "s/\.\([0-9]\+\)$$/-\1.pdf/"` $<.pdf
clean:
	@rm  -f mpx* *~ *.log *.mpx
	@rm -f $(tmp_file).* 
#Зависимости для mpost-картинок.
#По одной для каждого числа из beginfig
%.1:%.mp 
	$(MPOST) $<
 …
%.64:%.mp 
	$(MPOST) $<

Чтобы на выходе получить готовую eps-картинку с уже «внедрёнными» шрифтами, которую можно вставить уже куда угодно, достаточно выполнить следующую команду:

make <имя mp-файла>.<номер картинки>.[eps|pdf]

Обычно mp-файлам даются короткие имена.

Как вариант, предлагается shell-скрипт (mp2pdf.sh), который делает практически то же самое. Предполагается использование GNU/Linux (или подобной ОС).

Скрипт для каждого beginfig(n)-блока сделает файлы filen.eps и filen.pdf, где file — имя исходного MetaPost-файла, n — номер блока. В скрипте предусмотрено размещения полученных файлов в отдельных каталогах. Имена каталогов задаются переменными EPS_DIR и PDF_DIR. Если каталогов с такими именами не существуют, то скрипт автоматически создаёт их.

#!/bin/sh
# Скрипт для превращения MetaPost файла в EPS и PDF рисунки

# каталоги для хранения eps- и  pdf-файлов
EPS_DIR=./eps
PDF_DIR=./pdf
TMP_FILE=tmp

if [[ "$@" == ""]];
then
  echo 
  echo Скрипт обрабатывает mp-файл, создает eps- и pdf-файлы и
  echo перемещает их соответственно в каталоги $EPS_DIR и $PDF_DIR
  echo Использование: ./mp2pdf.sh file.mp
  echo
  exit
fi

if [ ! -d $EPS_DIR ]; then
  echo ======== Создание каталога для eps-файлов 
  mkdir $EPS_DIR
fi
if [ ! -d $PDF_DIR ]; then
  echo ======== Создание каталога для pdf-файлов
  mkdir $PDF_DIR
fi

echo ======== Исходный файл: $@

list=`grep beginfig $1 | sed -e 's/beginfig(//' -e 's/);//'`
echo ======== Список блоков:  $list

echo ======== Запуск mpost...
mpost -tex=latex $1

for i in $list          # цикл по блокам beginfig()
do
 epsi=${1%mp}$i
 eps=${1%.mp}${i}.eps
 pdf=${1%.mp}${i}.pdf
 echo Блок ${i}: ' >> ' $epsi ' >> ' $eps ' >> ' $pdf

if [ ! -e $epsi ]; then
  echo
  echo Ошибки при обработке mp-файла!
  echo
  exit
else
  echo ======== MetaPost ===== Ok!
fi

echo ======== Генерация временного LaTeX-файла...
echo \\documentclass[12pt]{article} > ${TMP_FILE}.tex
echo \\usepackage{mathtext} >> ${TMP_FILE}.tex
echo \\usepackage{amsmath} >> ${TMP_FILE}.tex
echo \\usepackage[T2A]{fontenc} >> ${TMP_FILE}.tex
echo \\usepackage[koi8-r]{inputenc} >> ${TMP_FILE}.tex
echo \\usepackage[english,russian]{babel} >> ${TMP_FILE}.tex
echo \\usepackage{graphics} >> ${TMP_FILE}.tex
echo \\begin{document} >> ${TMP_FILE}.tex
echo \\pagestyle{empty} >> ${TMP_FILE}.tex
echo \\includegraphics{${epsi}} >> ${TMP_FILE}.tex
echo \\end{document} >> ${TMP_FILE}.tex

echo ======== Запуск LaTeX...
latex ${TMP_FILE}

if [ ! -e ${TMP_FILE}.dvi ]; then
  echo
  echo ======== Не найден dvi-файл!
  echo
  exit
else
  echo ======== LaTeX ===== Ok!
fi
echo ======== Запуск dvips...
dvips -E ${TMP_FILE} -o $eps

echo ======== Запуск epstopdf...
epstopdf $eps

if [[ -e $pdf]]; then
 mv $eps $EPS_DIR 
 mv $pdf $PDF_DIR
 echo ======== Перенос $eps и $pdf в нужное место...
fi

echo ======== Зачистка...
rm *.log *.mpx ${TMP_FILE}.* *.aux *.dvi *.tex $epsi 2>>/dev/null

done

Скрипт надо сделать исполняемым:

chmod +x ./mp2pdf.sh

Использование:

./mp2pdf.sh file.mp

Пример MetaPost-файла для тестирования:

%% Шаблон для mp-файлов
prologues:=0;

% LaTeX; работает вместе с "mpost -tex=latex file.mp" (см. скрипт выше)
verbatimtex \documentclass[12pt]{article}
\usepackage{mathtext}
\usepackage{amsmath}
\usepackage[T2A]{fontenc}
\usepackage[koi8-r]{inputenc}
\usepackage[english,russian]{babel}
\begin{document}
etex;

beginfig(1);
draw (0,0)--(0,100)--(100,100)--(100,0)--cycle;
label(btex Метка: $\alpha_1$ etex, (50,50));
endfig;

end.

Язык META

В качестве базового языка, инструкции которого подаются на вход программы MetaPost, используется язык META[5].

В MetaPost можно оперировать следующими типами данных:

  • boolean — логический (Истина/Ложь)
  • numeric — обычные числа
  • pen (перо) — то, чем компьютер рисует (в подавляющем большинстве случаев используется круглое перо pencircle)
  • pair (точка) — пара чисел (x, y) в случае декартовых координат или R*dir(α) в случае полярных координат
  • path (путь) — набор точек с описанием типа соединений между ними
  • color (цвет) — тройка чисел (r, g, b) соответствует цветовой модели RGB
  • picture (картинка) — совокупность путей и точек
  • string (строка) — ASCII строка,
  • transform (линейные преобразования) — линейные преобразования, которые можно применять к объектам типа pair, pen, path и picture.

Имена переменных в META могут состоять из нескольких лексем. Лексемы могут быть либо буквенными, либо числовыми. Например, переменная x1l состоит из трёх лексем. Её можно переписать более понятным способом x[1].l, то есть числовая лексема по сути указывает на номер элемента в массиве, а следующая за ней буква уточняет элемент структуры. Возможность опускать «[].» в написании имён переменных упрощает в некоторых случаях восприятие кода (например, <math>x_{1l}</math> — это x-координата границы линии слева по направлению движения для первой точки пути z[]) и сокращает объём программы. Взамен, если нужны просто переменные без подобных особенностей, то придётся ограничиться только буквенными комбинациями.

Все переменные необходимо объявлять перед использованием. Исключением являются переменные типа numeric. Массивы объявляются и используются следующим образом:

 pair w[];
 w:=(10,5);
 w[2]=w[1];

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

В META можно опускать некоторые из операторов для сокращения записей, например, 2*x соответствует записи 2x. Но, так как 1/2x — это 0.5x, что более естественно с точки зрения математики, но не программирования. В META сначала обрабатываются числовые лексемы.

Набор стандартных вычислительных операций расширен с учётом специализации языка. В частности, поддерживаются операции пифагорова сложения <math>a{+}{+}b=\sqrt{a^2+b^2}</math>, пифагорова вычитания <math>a{+}{-}{+}b=\sqrt{a^2-b^2}</math>, целочисленное деление div и возведение в степень <math>x{*}{*}y=x^y</math>.

В языке присутствуют операторы цикла, условных переходов и тому подобное. Отличительной особенностью META является возможность решать линейные уравнения. Например, выражение вида <math>C=1/2[A,B]</math>, означает, что точка C находится ровно посередине между точками А и B.

Программу mpost можно использовать в режиме калькулятора для вычислений на языке META. Это позволяет проверить правильность ваших предположений относительно языка. Пример сеанса представлен ниже:

 baldin@evgueni:~$ mpost
 This is MetaPost, Version 0.901 (Web2C 7.5.5)
 **\relax
 *a:=10;
 *b:=8;
 *c:=a+-+b;
 *show c;
 >> 6
 *show (3-sqrt 5)/2;
 >> 0.38197
 *show angle(1,sqrt 3);
 >> 60.00008
 *show 2**10;
 >> 1024.00003
 *show infinity;
 >> 4095.99998
 *show epsilon;
 >> 0.00002
 *show infinity-infinity;
 >> 0
 *end
 Transcript written on mpout.log.

После вывода приглашения ** следует набрать команду \relax. Далее можно вводить команды MetaPost. Делать это надо аккуратно, так как этот режим не поддерживает «истории команд». В начале не предполагалось, что MetaPost можно использовать и так тоже. С помощью команды show можно вывести результат на экран. Закончить сеанс можно с помощью команды end. Обратите внимание, что на просьбу вывести бесконечность (infinity) MetaPost выдал 4095.99998 — это максимальное значение, которое может принимать переменная типа numeric. Причём в процессе вычисления результат может превышать «бесконечность», но ответ должен быть меньше или равен ей, иначе будет выдана ошибка. Минимальный шаг изменения типа numeric равен epsilon, или, точнее, 1/256/256. При создании рисунка эти ограничения не существенны, так как диапазон изменения чисел вполне велик, чтобы вместить все элементы. Но в любом случае это тоже необходимо учитывать.

Если необходимо вычислить однострочное выражение, то на первоначальное приглашение ** можно ввести expr. В этом случае mpost считает файл expr.mf и на любое действие будет выдаваться ответ:

 baldin@evgueni:~$ mpost
 This is MetaPost, Version 0.901 (Web2C 7.5.5)
 **expr
 (/usr/local/texlive/2005/texmf-dist/metafont/base/expr.mf
 gimme an expr: 2(a+3b)-2b
 >> 4b+2a
 gimme an expr: 1/3[a,b]
 >> 0.33333b+0.66667a

Примеры

Код каждого примера приведён в описании соответствующей картинки.

Аналоги

MetaPost имеет некоторое количество ограничений, доставшихся ему в наследство от METAFONT. Попытка обойти эти ограничения легла в основу создания программного интерпретатора Asymptote[6]. Язык, используемый Asymptote, похож на META, но вследствие перехода от синтаксиса макро-языка к синтаксису C++ гораздо более многословен и сложен. Основное преимущество Asymptote заключается в лучшей поддержке возможностей PostScript.

Functional MetaPost — DSL для графики встроенный в Haskell, который генерирует код MetaPost.[7]

METAGRAF — графический интерфейс над MetaPost. Написан на Java. По возможностям напоминает xfig. Картинки сохраняет в формате MetaPost.[8]

Среди программного окружения LaTeX аналогичной MetaPost функциональностью также обладают пакеты PSTricks и PGF/TikZ.

На основе программной базы MetaPost был создан инструмент METATYPE1 для разработки Type1 шрифтов.

Напишите отзыв о статье "MetaPost"

Примечания

  1. [ect.bell-labs.com/who/hobby/89_2-15.pdf John D. Hobby, A METAFONT-like System with PostScript Output, Tugboat, the TeX User's Group Newsletter, 10(4), 1989.]
  2. [ect.bell-labs.com/who/hobby/92_2-21.pdf John D. Hobby, Introduction to MetaPost, Proceedings of EuroTeX '92, 1992.] MetaPost is a picture-drawing language very much like METAFONT except with PostScript output. The language provides access to all major features of Level 1 PostScript® and it has facilities for integrating graphics with typeset text.
  3. [www.tug.org/pipermail/metapost/2009-May/001647.html MetaPost 1.200 announcement]
  4. [ect.bell-labs.com/who/hobby/cstr_164.pdf John D. Hobby, Drawing Graphs with MetaPost, AT&T Bell Laboratories Computing Science Technical Report 164, 1992.]
  5. [wiki.linuxformat.ru/wiki/LXF76:MetaPost Е.М. Балдин Введение в MetaPost] // Linux Format 76 (февраль 2006)
  6. [www.math.ualberta.ca/~bowman/publications/asyTUG.pdf Asymptote: A vector graphics language John C. Bowman and Andy Hammerlindl, TUGBOAT: The Communications of the TeX Users Group, 29:2, 288-294 (2008).]
  7. [cryp.to/funcmp/ Functional MetaPost]
  8. [w3.mecanica.upm.es/metapost/metagraf.php METAGRAPH]

Ссылки

  • [www.tug.org/metapost.html MetaPost on the Web] (англ.). TEX users group. Проверено 1 января 2011. [www.webcitation.org/65J8vHxWL Архивировано из первоисточника 9 февраля 2012].
  • Евгений Балдин. [www.inp.nsk.su/~baldin/mpost/index.html Создание иллюстраций в MetaPost] (2006). — Цикл статей в журнале Linux Format. Проверено 1 января 2011. [www.webcitation.org/65J8vn2YH Архивировано из первоисточника 9 февраля 2012].
  • Джон Хобби и участники проекта развития MetaPost. [www.tug.org/docs/metapost/mpman.pdf A User’s Manual for MetaPost 1.212] (англ.). TEX users group (19 октября 2010). Проверено 1 января 2011. [www.webcitation.org/65J8xDTxM Архивировано из первоисточника 9 февраля 2012].
  • Джон Хобби и участники проекта развития MetaPost/ Пер. Владимира Лидовского. [ctan.usu.ru/info/metapost/doc/russian/mpman-ru/mpman-ru.pdf MetaPost руководство пользователя (A User’s Manual for MetaPost 1.004)] (рус.). CTAN (10 мая 2008). Проверено 5 января 2011. [www.webcitation.org/65J8xmcuj Архивировано из первоисточника 9 февраля 2012].
  • [cm.bell-labs.com/who/hobby/index.html Домашняя страничка Джона Хобби]
  • [cm.bell-labs.com/who/hobby/MetaPost.html Основополагающие статьи по MetaPost Джона Хобби]
  • André Heck. [staff.science.uva.nl/~heck/Courses/mptut.pdf Руководство пользователя MetaPost] (англ.). MAPS (2005). Проверено 5 января 2011. [www.webcitation.org/65J8yNAhx Архивировано из первоисточника 9 февраля 2012].
  • Vincent Zoonekynd. [zoonek.free.fr/LaTeX/ Metapost : exemples] (фр.) (2003). — Большое количество примеров. Проверено 5 января 2011. [www.webcitation.org/65J8yvClm Архивировано из первоисточника 9 февраля 2012].
  • Jean-Michel Sarlat. [melusine.eu.org/syracuse/metapost/galeries/ Galeries MetaPost] (фр.) (11 декабря 2005). — Фракталы, геометрия, картинки «под Эшера». Проверено 5 января 2011. [www.webcitation.org/65J8zT96y Архивировано из первоисточника 9 февраля 2012].

Литература

  • Дональд Кнут. Всё про METAFONT = The METAFONTbook. — М.: Вильямс, 2003. — 384 с. — ISBN 5-8459-0442-0.
  • М. Гуссенс, С. Ратц, Ф. Миттельбах. Путеводитель по пакетам LaTeX и его графическим расширениям = The LaTeX Graphics Companion. — М.: Мир, 2002. — 621 с. — ISBN 5-03-003388-2.

Отрывок, характеризующий MetaPost

Никто не ответил на это замечание. И довольно долго все эти люди молча смотрели на далекое разгоравшееся пламя нового пожара.
Старик, графский камердинер (как его называли), Данило Терентьич подошел к толпе и крикнул Мишку.
– Ты чего не видал, шалава… Граф спросит, а никого нет; иди платье собери.
– Да я только за водой бежал, – сказал Мишка.
– А вы как думаете, Данило Терентьич, ведь это будто в Москве зарево? – сказал один из лакеев.
Данило Терентьич ничего не отвечал, и долго опять все молчали. Зарево расходилось и колыхалось дальше и дальше.
– Помилуй бог!.. ветер да сушь… – опять сказал голос.
– Глянь ко, как пошло. О господи! аж галки видно. Господи, помилуй нас грешных!
– Потушат небось.
– Кому тушить то? – послышался голос Данилы Терентьича, молчавшего до сих пор. Голос его был спокоен и медлителен. – Москва и есть, братцы, – сказал он, – она матушка белока… – Голос его оборвался, и он вдруг старчески всхлипнул. И как будто только этого ждали все, чтобы понять то значение, которое имело для них это видневшееся зарево. Послышались вздохи, слова молитвы и всхлипывание старого графского камердинера.


Камердинер, вернувшись, доложил графу, что горит Москва. Граф надел халат и вышел посмотреть. С ним вместе вышла и не раздевавшаяся еще Соня, и madame Schoss. Наташа и графиня одни оставались в комнате. (Пети не было больше с семейством; он пошел вперед с своим полком, шедшим к Троице.)
Графиня заплакала, услыхавши весть о пожаре Москвы. Наташа, бледная, с остановившимися глазами, сидевшая под образами на лавке (на том самом месте, на которое она села приехавши), не обратила никакого внимания на слова отца. Она прислушивалась к неумолкаемому стону адъютанта, слышному через три дома.
– Ах, какой ужас! – сказала, со двора возвративись, иззябшая и испуганная Соня. – Я думаю, вся Москва сгорит, ужасное зарево! Наташа, посмотри теперь, отсюда из окошка видно, – сказала она сестре, видимо, желая чем нибудь развлечь ее. Но Наташа посмотрела на нее, как бы не понимая того, что у ней спрашивали, и опять уставилась глазами в угол печи. Наташа находилась в этом состоянии столбняка с нынешнего утра, с того самого времени, как Соня, к удивлению и досаде графини, непонятно для чего, нашла нужным объявить Наташе о ране князя Андрея и о его присутствии с ними в поезде. Графиня рассердилась на Соню, как она редко сердилась. Соня плакала и просила прощенья и теперь, как бы стараясь загладить свою вину, не переставая ухаживала за сестрой.
– Посмотри, Наташа, как ужасно горит, – сказала Соня.
– Что горит? – спросила Наташа. – Ах, да, Москва.
И как бы для того, чтобы не обидеть Сони отказом и отделаться от нее, она подвинула голову к окну, поглядела так, что, очевидно, не могла ничего видеть, и опять села в свое прежнее положение.
– Да ты не видела?
– Нет, право, я видела, – умоляющим о спокойствии голосом сказала она.
И графине и Соне понятно было, что Москва, пожар Москвы, что бы то ни было, конечно, не могло иметь значения для Наташи.
Граф опять пошел за перегородку и лег. Графиня подошла к Наташе, дотронулась перевернутой рукой до ее головы, как это она делала, когда дочь ее бывала больна, потом дотронулась до ее лба губами, как бы для того, чтобы узнать, есть ли жар, и поцеловала ее.
– Ты озябла. Ты вся дрожишь. Ты бы ложилась, – сказала она.
– Ложиться? Да, хорошо, я лягу. Я сейчас лягу, – сказала Наташа.
С тех пор как Наташе в нынешнее утро сказали о том, что князь Андрей тяжело ранен и едет с ними, она только в первую минуту много спрашивала о том, куда? как? опасно ли он ранен? и можно ли ей видеть его? Но после того как ей сказали, что видеть его ей нельзя, что он ранен тяжело, но что жизнь его не в опасности, она, очевидно, не поверив тому, что ей говорили, но убедившись, что сколько бы она ни говорила, ей будут отвечать одно и то же, перестала спрашивать и говорить. Всю дорогу с большими глазами, которые так знала и которых выражения так боялась графиня, Наташа сидела неподвижно в углу кареты и так же сидела теперь на лавке, на которую села. Что то она задумывала, что то она решала или уже решила в своем уме теперь, – это знала графиня, но что это такое было, она не знала, и это то страшило и мучило ее.
– Наташа, разденься, голубушка, ложись на мою постель. (Только графине одной была постелена постель на кровати; m me Schoss и обе барышни должны были спать на полу на сене.)
– Нет, мама, я лягу тут, на полу, – сердито сказала Наташа, подошла к окну и отворила его. Стон адъютанта из открытого окна послышался явственнее. Она высунула голову в сырой воздух ночи, и графиня видела, как тонкие плечи ее тряслись от рыданий и бились о раму. Наташа знала, что стонал не князь Андрей. Она знала, что князь Андрей лежал в той же связи, где они были, в другой избе через сени; но этот страшный неумолкавший стон заставил зарыдать ее. Графиня переглянулась с Соней.
– Ложись, голубушка, ложись, мой дружок, – сказала графиня, слегка дотрогиваясь рукой до плеча Наташи. – Ну, ложись же.
– Ах, да… Я сейчас, сейчас лягу, – сказала Наташа, поспешно раздеваясь и обрывая завязки юбок. Скинув платье и надев кофту, она, подвернув ноги, села на приготовленную на полу постель и, перекинув через плечо наперед свою недлинную тонкую косу, стала переплетать ее. Тонкие длинные привычные пальцы быстро, ловко разбирали, плели, завязывали косу. Голова Наташи привычным жестом поворачивалась то в одну, то в другую сторону, но глаза, лихорадочно открытые, неподвижно смотрели прямо. Когда ночной костюм был окончен, Наташа тихо опустилась на простыню, постланную на сено с края от двери.
– Наташа, ты в середину ляг, – сказала Соня.
– Нет, я тут, – проговорила Наташа. – Да ложитесь же, – прибавила она с досадой. И она зарылась лицом в подушку.
Графиня, m me Schoss и Соня поспешно разделись и легли. Одна лампадка осталась в комнате. Но на дворе светлело от пожара Малых Мытищ за две версты, и гудели пьяные крики народа в кабаке, который разбили мамоновские казаки, на перекоске, на улице, и все слышался неумолкаемый стон адъютанта.
Долго прислушивалась Наташа к внутренним и внешним звукам, доносившимся до нее, и не шевелилась. Она слышала сначала молитву и вздохи матери, трещание под ней ее кровати, знакомый с свистом храп m me Schoss, тихое дыханье Сони. Потом графиня окликнула Наташу. Наташа не отвечала ей.
– Кажется, спит, мама, – тихо отвечала Соня. Графиня, помолчав немного, окликнула еще раз, но уже никто ей не откликнулся.
Скоро после этого Наташа услышала ровное дыхание матери. Наташа не шевелилась, несмотря на то, что ее маленькая босая нога, выбившись из под одеяла, зябла на голом полу.
Как бы празднуя победу над всеми, в щели закричал сверчок. Пропел петух далеко, откликнулись близкие. В кабаке затихли крики, только слышался тот же стой адъютанта. Наташа приподнялась.
– Соня? ты спишь? Мама? – прошептала она. Никто не ответил. Наташа медленно и осторожно встала, перекрестилась и ступила осторожно узкой и гибкой босой ступней на грязный холодный пол. Скрипнула половица. Она, быстро перебирая ногами, пробежала, как котенок, несколько шагов и взялась за холодную скобку двери.
Ей казалось, что то тяжелое, равномерно ударяя, стучит во все стены избы: это билось ее замиравшее от страха, от ужаса и любви разрывающееся сердце.
Она отворила дверь, перешагнула порог и ступила на сырую, холодную землю сеней. Обхвативший холод освежил ее. Она ощупала босой ногой спящего человека, перешагнула через него и отворила дверь в избу, где лежал князь Андрей. В избе этой было темно. В заднем углу у кровати, на которой лежало что то, на лавке стояла нагоревшая большим грибом сальная свечка.
Наташа с утра еще, когда ей сказали про рану и присутствие князя Андрея, решила, что она должна видеть его. Она не знала, для чего это должно было, но она знала, что свидание будет мучительно, и тем более она была убеждена, что оно было необходимо.
Весь день она жила только надеждой того, что ночью она уввдит его. Но теперь, когда наступила эта минута, на нее нашел ужас того, что она увидит. Как он был изуродован? Что оставалось от него? Такой ли он был, какой был этот неумолкавший стон адъютанта? Да, он был такой. Он был в ее воображении олицетворение этого ужасного стона. Когда она увидала неясную массу в углу и приняла его поднятые под одеялом колени за его плечи, она представила себе какое то ужасное тело и в ужасе остановилась. Но непреодолимая сила влекла ее вперед. Она осторожно ступила один шаг, другой и очутилась на середине небольшой загроможденной избы. В избе под образами лежал на лавках другой человек (это был Тимохин), и на полу лежали еще два какие то человека (это были доктор и камердинер).
Камердинер приподнялся и прошептал что то. Тимохин, страдая от боли в раненой ноге, не спал и во все глаза смотрел на странное явление девушки в бедой рубашке, кофте и вечном чепчике. Сонные и испуганные слова камердинера; «Чего вам, зачем?» – только заставили скорее Наташу подойти и тому, что лежало в углу. Как ни страшно, ни непохоже на человеческое было это тело, она должна была его видеть. Она миновала камердинера: нагоревший гриб свечки свалился, и она ясно увидала лежащего с выпростанными руками на одеяле князя Андрея, такого, каким она его всегда видела.
Он был таков же, как всегда; но воспаленный цвет его лица, блестящие глаза, устремленные восторженно на нее, а в особенности нежная детская шея, выступавшая из отложенного воротника рубашки, давали ему особый, невинный, ребяческий вид, которого, однако, она никогда не видала в князе Андрее. Она подошла к нему и быстрым, гибким, молодым движением стала на колени.
Он улыбнулся и протянул ей руку.


Для князя Андрея прошло семь дней с того времени, как он очнулся на перевязочном пункте Бородинского поля. Все это время он находился почти в постояниом беспамятстве. Горячечное состояние и воспаление кишок, которые были повреждены, по мнению доктора, ехавшего с раненым, должны были унести его. Но на седьмой день он с удовольствием съел ломоть хлеба с чаем, и доктор заметил, что общий жар уменьшился. Князь Андрей поутру пришел в сознание. Первую ночь после выезда из Москвы было довольно тепло, и князь Андрей был оставлен для ночлега в коляске; но в Мытищах раненый сам потребовал, чтобы его вынесли и чтобы ему дали чаю. Боль, причиненная ему переноской в избу, заставила князя Андрея громко стонать и потерять опять сознание. Когда его уложили на походной кровати, он долго лежал с закрытыми глазами без движения. Потом он открыл их и тихо прошептал: «Что же чаю?» Памятливость эта к мелким подробностям жизни поразила доктора. Он пощупал пульс и, к удивлению и неудовольствию своему, заметил, что пульс был лучше. К неудовольствию своему это заметил доктор потому, что он по опыту своему был убежден, что жить князь Андрей не может и что ежели он не умрет теперь, то он только с большими страданиями умрет несколько времени после. С князем Андреем везли присоединившегося к ним в Москве майора его полка Тимохина с красным носиком, раненного в ногу в том же Бородинском сражении. При них ехал доктор, камердинер князя, его кучер и два денщика.
Князю Андрею дали чаю. Он жадно пил, лихорадочными глазами глядя вперед себя на дверь, как бы стараясь что то понять и припомнить.
– Не хочу больше. Тимохин тут? – спросил он. Тимохин подполз к нему по лавке.
– Я здесь, ваше сиятельство.
– Как рана?
– Моя то с? Ничего. Вот вы то? – Князь Андрей опять задумался, как будто припоминая что то.
– Нельзя ли достать книгу? – сказал он.
– Какую книгу?
– Евангелие! У меня нет.
Доктор обещался достать и стал расспрашивать князя о том, что он чувствует. Князь Андрей неохотно, но разумно отвечал на все вопросы доктора и потом сказал, что ему надо бы подложить валик, а то неловко и очень больно. Доктор и камердинер подняли шинель, которою он был накрыт, и, морщась от тяжкого запаха гнилого мяса, распространявшегося от раны, стали рассматривать это страшное место. Доктор чем то очень остался недоволен, что то иначе переделал, перевернул раненого так, что тот опять застонал и от боли во время поворачивания опять потерял сознание и стал бредить. Он все говорил о том, чтобы ему достали поскорее эту книгу и подложили бы ее туда.
– И что это вам стоит! – говорил он. – У меня ее нет, – достаньте, пожалуйста, подложите на минуточку, – говорил он жалким голосом.
Доктор вышел в сени, чтобы умыть руки.
– Ах, бессовестные, право, – говорил доктор камердинеру, лившему ему воду на руки. – Только на минуту не досмотрел. Ведь вы его прямо на рану положили. Ведь это такая боль, что я удивляюсь, как он терпит.
– Мы, кажется, подложили, господи Иисусе Христе, – говорил камердинер.
В первый раз князь Андрей понял, где он был и что с ним было, и вспомнил то, что он был ранен и как в ту минуту, когда коляска остановилась в Мытищах, он попросился в избу. Спутавшись опять от боли, он опомнился другой раз в избе, когда пил чай, и тут опять, повторив в своем воспоминании все, что с ним было, он живее всего представил себе ту минуту на перевязочном пункте, когда, при виде страданий нелюбимого им человека, ему пришли эти новые, сулившие ему счастие мысли. И мысли эти, хотя и неясно и неопределенно, теперь опять овладели его душой. Он вспомнил, что у него было теперь новое счастье и что это счастье имело что то такое общее с Евангелием. Потому то он попросил Евангелие. Но дурное положение, которое дали его ране, новое переворачиванье опять смешали его мысли, и он в третий раз очнулся к жизни уже в совершенной тишине ночи. Все спали вокруг него. Сверчок кричал через сени, на улице кто то кричал и пел, тараканы шелестели по столу и образам, в осенняя толстая муха билась у него по изголовью и около сальной свечи, нагоревшей большим грибом и стоявшей подле него.
Душа его была не в нормальном состоянии. Здоровый человек обыкновенно мыслит, ощущает и вспоминает одновременно о бесчисленном количестве предметов, но имеет власть и силу, избрав один ряд мыслей или явлений, на этом ряде явлений остановить все свое внимание. Здоровый человек в минуту глубочайшего размышления отрывается, чтобы сказать учтивое слово вошедшему человеку, и опять возвращается к своим мыслям. Душа же князя Андрея была не в нормальном состоянии в этом отношении. Все силы его души были деятельнее, яснее, чем когда нибудь, но они действовали вне его воли. Самые разнообразные мысли и представления одновременно владели им. Иногда мысль его вдруг начинала работать, и с такой силой, ясностью и глубиною, с какою никогда она не была в силах действовать в здоровом состоянии; но вдруг, посредине своей работы, она обрывалась, заменялась каким нибудь неожиданным представлением, и не было сил возвратиться к ней.
«Да, мне открылась новое счастье, неотъемлемое от человека, – думал он, лежа в полутемной тихой избе и глядя вперед лихорадочно раскрытыми, остановившимися глазами. Счастье, находящееся вне материальных сил, вне материальных внешних влияний на человека, счастье одной души, счастье любви! Понять его может всякий человек, но сознать и предписать его мот только один бог. Но как же бог предписал этот закон? Почему сын?.. И вдруг ход мыслей этих оборвался, и князь Андрей услыхал (не зная, в бреду или в действительности он слышит это), услыхал какой то тихий, шепчущий голос, неумолкаемо в такт твердивший: „И пити пити питии“ потом „и ти тии“ опять „и пити пити питии“ опять „и ти ти“. Вместе с этим, под звук этой шепчущей музыки, князь Андрей чувствовал, что над лицом его, над самой серединой воздвигалось какое то странное воздушное здание из тонких иголок или лучинок. Он чувствовал (хотя это и тяжело ему было), что ему надо было старательна держать равновесие, для того чтобы воздвигавшееся здание это не завалилось; но оно все таки заваливалось и опять медленно воздвигалось при звуках равномерно шепчущей музыки. „Тянется! тянется! растягивается и все тянется“, – говорил себе князь Андрей. Вместе с прислушаньем к шепоту и с ощущением этого тянущегося и воздвигающегося здания из иголок князь Андрей видел урывками и красный, окруженный кругом свет свечки и слышал шуршанъе тараканов и шуршанье мухи, бившейся на подушку и на лицо его. И всякий раз, как муха прикасалась к егв лицу, она производила жгучее ощущение; но вместе с тем его удивляло то, что, ударяясь в самую область воздвигавшегося на лице его здания, муха не разрушала его. Но, кроме этого, было еще одно важное. Это было белое у двери, это была статуя сфинкса, которая тоже давила его.