LINUX.ORG.RU

[LaTeX] Изменение геометрии страницы в определении стиля страницы

 


0

1

Приветствую.

Пытаюсь запилить для себя стиль страниц по ГОСТ 21.101–97 СПДС «Оосновные требования к проектной и рабочей документации». Вкратце, для тех кто не в курсе — это тот же ЕСКД, но с другими штампами, для строителей. Вот, что получилось

\documentclass[14pt,a4paper]{extarticle}

\usepackage{xltxtra}
\setmainfont{Linux Libertine O}

\usepackage{polyglossia}
\setmainlanguage{russian}

\usepackage{indentfirst}
\frenchspacing

% Поля страницы по ЕСКД
\usepackage[
    left=30mm,
    top=15mm,
    right=15mm,
    bottom=15mm,
    footskip=10mm,
    nohead,
    nomarginpar,
    driver=xetex
]{geometry}

% Создаем новые стили страницы
\makeatletter
\newcommand{\spds@titleheight}[1]{%
  \setlength{\textheight}{\paperheight}
  \addtolength{\textheight}{-#1}
  \addtolength{\textheight}{-30mm}
}

% Титульный лист
\newcommand\ps@spdstitle{%
    \spds@titleheight{0mm}
    \renewcommand{\@oddhead}{}
    \renewcommand{\@evenhead}{}
    \renewcommand{\@oddfoot}{%
        \unitlength=1mm
        \begin{picture}(0,0)(10,0)
            \linethickness{0.6mm}
            \put(0,0){\line(1,0){185}}
            \put(0,287){\line(1,0){185}}
            \put(0,0){\line(0,1){287}}
            \put(185,0){\line(0,1){287}}
        \end{picture}
        СПДС~— Титульный лист\hfill % Debug
    }
    \renewcommand{\@evenfoot}{}
}

% Первый лист — форма 5 по ГОСТ 21.101–97
\newcommand\ps@spdsformfive{%
    \spds@titleheight{40mm}
    \renewcommand{\@oddhead}{}
    \renewcommand{\@evenhead}{}
    \renewcommand{\@oddfoot}{%
        \unitlength=1mm
        \begin{picture}(0,0)(10,0)
            \linethickness{0.6mm}
            % Рамка
            \put(0,0){\line(1,0){185}}
            \put(0,287){\line(1,0){185}}
            \put(0,0){\line(0,1){287}}
            \put(185,0){\line(0,1){287}}
            % Штамп
            \put(0,25){\line(1,0){185}}
            \put(0,40){\line(1,0){185}}
            \put(0,30){\line(1,0){65}}
            \put(135,15){\line(1,0){50}}
            \put(135,20){\line(1,0){50}}
            \put(20,0){\line(0,1){40}}
            \put(40,0){\line(0,1){40}}
            \put(55,0){\line(0,1){40}}
            \put(65,0){\line(0,1){40}}
            \put(135,0){\line(0,1){25}}
            \put(150,15){\line(0,1){10}}
            \put(165,15){\line(0,1){10}}
            \put(10,25){\line(0,1){15}}
            \put(30,25){\line(0,1){15}}
            \linethickness{0.2mm}
            \put(0,5){\line(1,0){65}}
            \put(0,10){\line(1,0){65}}
            \put(0,15){\line(1,0){65}}
            \put(0,20){\line(1,0){65}}
            \put(0,25){\line(1,0){65}}
            \put(0,35){\line(1,0){65}}
        \end{picture}
        СПДС~— Основная надпись по форме 5\hfill % Debug
    }
    \renewcommand{\@evenfoot}{}
}
\makeatother

\begin{document}

\thispagestyle{spdstitle}

Тестовый текст в начале страницы.

\vfill

Тестовый текст в конце страницы.

\newpage
\pagestyle{spdsformfive}
%\newgeometry{bottom=55mm}

Тестовый текст в начале страницы.

\vfill

Тестовый текст в конце страницы.

\newpage
Тестовый текст в начале страницы.

\vfill

Тестовый текст в конце страницы.

\newpage
Тестовый текст в начале страницы.

\vfill

Тестовый текст в конце страницы.

\end{document}

Все более-менее работает, но в зависимости от формы штампа должна меняться высота текстового поля, за что отвечает служебная команда \spds@titleheight{}. Она и меняется, но для следующей за текущей страницы. А вот как сделать так, чтоб высота изменялась немедленно?

Можно, конечно, запилить для каждой формы штампа отдельную команду, которая сначала будет дергать \newgeometry{} из пакета geometry с нужными параметрами, а потом будет устанавливать стиль страницы, но выглядит это уж больно костыльно. Может есть способ довести до ума стиль страницы?

P.S. Компилировать XeLaTeX'ом или переделать преамбулу.

★★★★★

Последнее исправление: fat_angel (всего исправлений: 1)
Ответ на: комментарий от fat_angel

Неужели там нет таких штампов?

Ну, а вообще, сделал бы благое дело, если нет: добавил бы нужные штампы в eskd.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Неужели там нет таких штампов?

Нет. ЕСКД и СПДС несколько разные вещи.

Ну, а вообще, сделал бы благое дело, если нет: добавил бы нужные штампы в eskd.

Зубодробительный LaTeXовый код нагонянет на меня депрессию. Поэтому разбираться в этом достаточно большом и сложном пакете у меня нет никакого желания. Плюс они в основных надписях догадались использовать антиквенный шрифт, что меня никак не устраивает. Да и общее оформление в этом пакете (например черезчур маленькие отступы текста от рамок) мне не нравится.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

У тебя проблемы из-за того, что твои инструкции вызываются лишь после того, как бокс-страница будет заполнен. Здесь два варианта: либо писать не \pagestyle{...}, а сделать какую-нибудь команду вроде \chStamp{...}, которая будет сразу же устанавливать нужный \textheight и давать команду для \everypage; либо явно вручную устанавливать высоту текста.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

У тебя проблемы из-за того, что твои инструкции вызываются лишь после того, как бокс-страница будет заполнен.

Это я уже понял.

а сделать какую-нибудь команду вроде \chStamp{...}

Я и про такой вариант написал, но по-моему попахивает костылем, нет?

давать команду для \everypage

Что эта команда делает?

либо явно вручную устанавливать высоту текста.

Ты имеешь ввиду внутри документа? Вроде закомментированной команды \newgeometry{bottom=55mm}?

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Только рамка все равно съезжает: потому что неправильно оформлена (она как будто от нижнего края текста отсчитывается, а не от нижнего края листа).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от fat_angel

\everypage вызывается каждый раз перед выхлопом страницы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от fat_angel

Ты имеешь ввиду внутри документа? Вроде закомментированной команды \newgeometry{bottom=55mm}?

Пакетом geometry я никогда не пользовался. Не вижу смысла.

А чтобы правильно выводить страницу я пока вижу только такой вариант: пихать рамку в верхний колонтитул, указывая, что это vbox с нулевой высотой, в котором находится hbox с нулевой шириной.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

она как будто от нижнего края текста отсчитывается

Если быть совсем точным то от начала нижнего колонтитула. Позиционирование рамки надо подправить.

а не от нижнего края листа

Я не нашел способа запилить такое. Подскажи рецепт?

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

В общем, титульную рамку сделать так:

\newcommand\ps@spdstitle{%
    \spds@titleheight{0mm}
    \renewcommand{\@evenhead}{}
    \renewcommand{\@oddfoot}{}
    \renewcommand{\@oddhead}{\vbox to 0pt{\vspace{274mm}
        \hbox to 0pt{
        \unitlength=1mm
        \begin{picture}(0,0)(10,0)
            \linethickness{0.6mm}
            \put(0,0){\line(1,0){185}}
            \put(0,287){\line(1,0){185}}
            \put(0,0){\line(0,1){287}}
            \put(185,0){\line(0,1){287}}
        \end{picture}
        СПДС~-- Титульный лист\hfill % Debug
    }}}
    \renewcommand{\@evenfoot}{}
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от fat_angel

Как я уже говорил, пихать рамку надо в верхний колонтитул, который всегда находится на одном и том же месте, а не в нижний.

Нужное смещение делается \vspace'ом

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

пихать рамку в верхний колонтитул

Оно так и сделано, только в нижнем колонтитуле.

указывая, что это vbox с нулевой высотой, в котором находится hbox с нулевой шириной.

Да вроде бы и сейчас размер рамки в колонтитуле не считается, я об этом сужу по позиционированию текстов помеченных комментарием Debug.

fat_angel ★★★★★
() автор топика

Чтобы не париться с доп. командами, советую просто сделать команды вроде \SPDStitle, \SPDSmain, \SPDSdraw и т.п., которые будут устанавливать нужную высоту текста + делать нужный \pagestyle.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от fat_angel

Оно так и сделано, только в нижнем колонтитуле.

Что в корне неверно, т.к. положение нижнего колонтитула зависит от высоты текста (что и вызывало сдвиг рамки вверх).

Да вроде бы и сейчас размер рамки в колонтитуле не считается, я об этом сужу по позиционированию текстов помеченных комментарием Debug.

Значит, box'ы можно опустить.

Просто я когда-то давным-давно делал простенькие рамочки (когда еще то ли не знал о стиле eskd, то ли его не было), но не рисованием, а box'ами с рамкой.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Как я уже говорил, пихать рамку надо в верхний колонтитул, который всегда находится на одном и том же месте, а не в нижний.

Не критично, можно указать разное смещение для разных штампов, поскольку положение нижнего колонтитула должно быть привязано к форме штампа.

Нужное смещение делается \vspace'ом

Почитай документацию про окружение picture — там оно из коробки (второй аргумет).

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Почитай документацию про окружение picture — там оно из коробки (второй аргумет).

Понятно

Не критично, можно указать разное смещение для разных штампов, поскольку положение нижнего колонтитула должно быть привязано к форме штампа.

Зачем тебе вообще колонтитулы? Все равно ведь для точного позиционирования ты будешь использовать боксы, размещаемые в соответствии с рамкой.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

положение нижнего колонтитула зависит от высоты текста

Ты чего куришь? Оно жестко задано в стиле странице.

У меня на третьей и последующих страницах рамка съехала только потому, что в них применяется команда \spds@titleheight{40mm} меняющая положение нижнего колонтитула. Рамка при этом отцентрирована из учета того, что эта команда не срабатывает (второй лист).

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Зачем тебе вообще колонтитулы?

А как еще можно запилить повтор рамки на каждом листе? \everypage?

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Оно жестко задано в стиле странице.

при этом ты меняешь \textwidth =) Так что, это ты куришь.

Положение нижнего колонтитула определяется высотой текста.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от fat_angel

Я имел в виду, что нижний колонтитул не нужен.

Без колонтитулов можно использовать \everypage (одноименный пакет) или самому \output переопределять.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Так что, это ты куришь.

Не-не-не. У каждого стиля страницы своя рамка и свой, соответствующий ей, \textheight, который в пределах одного стиля страницы не меняется. Поэтому, как я уже говорил, абсолютно не принципиально к какому колонтитулу привязываться.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Переопределить \output: эта команда вызывается, когда блок с текстом уже заполнен. Она выставляет нужные отступы, формирует колонтитулы и все это выводит в очередную страницу dvi-файла.

В общем, читать Кнута (Все про ТеХ). У него были интересные примеры (например, как сделать многоколоночный вывод, чтобы колонки на последней странице были одинаковой высоты).

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.