Tex: подробное описание С. М. Львовский
Download 1.51 Mb. Pdf ko'rish
|
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 нельзя. |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling