Tex: подробное описание С. М. Львовский


Download 1.51 Mb.
Pdf ko'rish
bet121/143
Sana08.05.2023
Hajmi1.51 Mb.
#1444247
1   ...   117   118   119   120   121   122   123   124   ...   143
Bog'liq
LaTeX-Lvovsky

5. Блоковые переменные
В тех случаях, когда один и тот же фрагмент текста (например, фрагмент псевдорисунка,
являющийся аргументом команды \multiput) используется многократно, бывает полезно
сверстать этот фрагмент раз и навсегда, а затем просто повторять его: это сэкономит как
количество нажатий на клавиши, так и машинное время. Использование макроопределения
в данном случае времени не сэкономит: если мы напишем, например,
\newcommand{\abcd}{\parbox{6cm}%
{kOGDA W TOWARI]AH SOGLASXQ NET,
NA LAD IH DELO NE POJDET, I WYJDET
IZ NEGO NE DELO --- TOLXKO MUKA.}}
то при каждой обработке команды \abcd это макроопределение будет заново развертывать

ся, и TEX будет заново находить переносы и места разрыва строк в одном и том же отрыв
ке из
«Лебедя, рака и щуки». Чтобы не заставлять TEX много раз повторять идентичные
операции по верстке текста, надо сделать так. Во-первых, определим
«блоковую перемен
ную
», которая будет хранить сверстанный фрагмент текста. Это делается с помощью коман
ды \newsavebox. Единственный аргумент этой команды
— имя новой блоковой переменной,
которое должно удовлетворять тем же условиям, что любые имена TEXовских команд: либо
backslash с одной не-буквой, либо backslash с последовательностью букв. Имя новой блоко

вой переменной не должно совпадать с именем уже существующей команды или переменной
длины (если Вы попытаетесь нарушить это правило, L
A
TEX выдаст сообщение об ошибке).
Во-вторых, присвоим нашей блоковой переменной значение
— блок, и будем в дальнейшем
этот блок использовать. Давайте приведем пример того, как можно этим пользоваться. На
стр.
119
мы приводили пример псевдорисунка-наклонной решетки, и там же мы отметили,
что экономнее было бы сверстать наклонный отрезок раз и навсегда, а затем только повто

рять его. Теперь мы можем объяснить, как это сделать. Создадим блоковую переменную под
названием \BLOK, написав в преамбуле следующее:


VIII.5. БЛОКОВЫЕ ПЕРЕМЕННЫЕ
176
\newsavebox{\BLOK}
Теперь сверстаем тот текст, который будет храниться в нашей блоковой переменной, и за

пишем его в эту переменную. Для этих целей используется команда \sbox с двумя обяза

тельными аргументами: первый
— имя блоковой переменной, второй — текст, который в нее
записывается. Итак:
\sbox{\BLOK}{\line(1,5){10}}
А теперь можно воспользоваться нашей блоковой переменной. Чтобы напечатать содержи

мое блоковой переменной, используется команда \usebox с одним обязательным аргументом
— именем переменной. В нашем случае мы используем блоковую переменную в аргументе
команды \multiput:


















































\begin{picture}(100,50)
\multiput(0,0)(10,0){10}%
{\usebox{\BLOK}}
\multiput(0,0)(2,10){6}%
{\line(1,0){90}}
\end{picture}
Можно было бы сделать аналогичный трюк и с горизонтальными линиями решетки, но большой эко

номии это не даст: горизонтальные и вертикальные линии на псевдорисунках L
A
TEX не собирает из
отдельных символов, а создает
«в один присест» с помощью команды \vrule, что и так достаточно
быстро.
Текст, присутствующий в аргументе команды \sbox, будет сверстан в виде блока так,
как если бы этот текст был передан в качестве аргумента команде \hbox или \mbox. Тем са

мым в аргументе \sbox может быть все то же, что может присутствовать в аргументе \hbox
или \mbox. Если команда \sbox была дана внутри группы, то по выходе из этой группы со

держимое блоковой переменной забудется.
Наряду с командой \sbox есть еще и команда \savebox, относящаяся к ней примерно
так же, как \makebox относится к \mbox: между первым и вторым обязательным аргументом
команды \savebox могут присутствовать необязательные аргументы, имеющие тот же смысл
и записывающиеся так же, как необязательные аргументы команды \makebox. Например,
написать
\savebox{\PRIMER}[4cm][r]{sLOWO}
все равно, что
\sbox{\PRIMER}{\makebox[4cm][r]{sLOWO}}
Наряду с L
A
TEXовской командой \usebox есть похожая на нее, но не идентичная, TEXовская
команда \copy. Используется она так:
Однажды Лебедь, Рак и Щу

ка. . .
\sbox{\BLOK}{rAK}
oDNAVDY lEBEDX,
\copy\BLOK{} I ˝UKA\ldots


VIII.5. БЛОКОВЫЕ ПЕРЕМЕННЫЕ
177
Обратите внимание, что при использовании команды \copy имя блоковой переменной не
заключается в фигурные скобки! Различие между \copy и \usebox
— такое же, как меж
ду \hbox и \mbox: будучи употребленными внутри абзаца (или, скажем, в аргументе ко

манд \put, \hbox или \mbox) эти две команды действуют совершенно одинаково, а вот будучи
употребленным между абзацами, L
A
TEXовское \usebox начинает новый абзац, в то время как
TEXовское \copy просто подверстывает блок к странице, нового абзаца не начиная. Эту
разницу следует иметь в виду, когда Вы работаете с командой \leaders: выгоднее сверстать
блок один раз и записать его в блоковую переменную, а затем в команде \leaders писать
просто \copy. Пример:






\savebox{\BLOK}[1cm]{$*$}
\hbox to \textwidth
{\leaders\copy\BLOK\hfil}
В этой ситуации по TEXническим причинам сказать \usebox нельзя.



Download 1.51 Mb.

Do'stlaringiz bilan baham:
1   ...   117   118   119   120   121   122   123   124   ...   143




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling