Как на одной странице определить начало нового узла для вставки другого заголовка

ИЗМЕНИТЬ ПОСЛЕ ПОЛУЧЕНИЯ ПРАВИЛЬНОГО РЕЗУЛЬТАТА:

Хорошо, мне это удалось. В основном, когда я понимаю, что на самом деле @Kevin хочет, чтобы я сделал, я создал пустой маркер в начале темы (с сохранением-с-следующим), а после создания заголовка темы я изменил его на обычный заголовок. Сейчас все нормально.

РЕДАКТИРОВАТЬ:

Я попробовал предложение @Kevin-Brown, но, вероятно, я сделал что-то не так. Я покажу минимальную версию, чтобы дать общее представление о том, что произошло.

Я получил:

flow
    block with normal header marker
    block with keep-with-next always, and empty marker which actually doesnt matter in my case
    block with content

и заголовок выглядит так:

<fo:block>
    <fo:retrieve-marker retrieve-class-name="body-header-marker" retrieve-position="first-including-carryover" retrieve-boundary="page"/>
</fo:block>

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

СТАРЫЙ ВОПРОС:

Я работаю с объектами форматирования, и у меня есть некоторые проблемы с поиском хорошего (фактически любого) решения в тех же случаях. Есть ли способ проверить, действительно ли текущий узел обработки занимает 2 страницы?

Может быть, если я попытаюсь определить проблему, вы сможете предложить лучшее решение. У меня есть несколько тем в xml, и во время обработки темы я добавляю верхний и нижний колонтитулы на каждую страницу. Я хочу изменить его, чтобы не добавлять заголовок на странице, где находится заголовок новой темы (тема начинается с новой страницы). Так что, возможно, есть лучший способ сделать то, что я хочу, чем проверять страницы. Потому что я думаю, что из-за другого подхода к «переменным» в функциональном программировании я не смогу использовать страницу так, как хотел.


person Luzgan    schedule 10.09.2015    source источник
comment
Если вам нужно изменить заголовок в зависимости от содержимого страницы, вы должны использовать <fo:marker>< /a> и элементы <fo:retrieve-marker>.   -  person potame    schedule 10.09.2015
comment
Звучит отлично. Я попробую.   -  person Luzgan    schedule 10.09.2015


Ответы (2)


Общий принцип, который вам нужен в псевдоразметке, таков:

block-container for topic
   throw marker containing the header for the topic
   ... content of topic ...
end block-container for topic

block-container with empty marker keep-with-next as "always"
   throw marker with nothing in it (basically clear the marker)
end block-container with empty marker 

block-container for topic
   throw marker containing the header for the topic
   ... content of topic ...
end block-container for topic

... and so on ...

Таким образом, вы вставляете маркер first-включая-carryover в свой заголовок. Это означает, что первый маркер, родительский контейнер которого начинается сверху или переносится с последней страницы.

Если ваша страница идеально начинается с начала темы, первый маркер на странице будет пустым. Это потому, что вы приклеиваете пустой блок-контейнер маркера к началу каждой темы. В этой структуре нет контента, он не испортит ваш вывод. Я не показал выше размещение пустого контейнера маркера над первой темой, но сделайте это, если хотите.

Если ваша страница разрывается внутри темы, то будет вытягиваться маркер «переноса», который будет вытягивать заголовок темы с предыдущей страницы. Обычно этот маркер должен включать что-то вроде «- Продолжение» в конце.

person Kevin Brown    schedule 10.09.2015
comment
Спасибо. Я проверю или в следующий раз у меня будет время для этого (что, вероятно, будет в среду). - person Luzgan; 11.09.2015
comment
Неважно, я снова отредактировал ответ;) Спасибо за хорошее решение. - person Luzgan; 16.09.2015

Вы можете поместить каждую тему в отдельный fo:page-sequence и использовать fo:page-sequence-master (http://www.w3.org/TR/xsl11/#fo_page-sequence-master), чтобы выбрать другой fo:simple-page-master только для первой страницы. Вы можете сделать так, чтобы мастер страницы имел другой заголовок.

См., например, «Автоматическое переключение макета на противоположных страницах (page-sequence-master)» в http://www.antennahouse.com/antenna1/comprehensive-xsl-fo-tutorials-and-samples-collection/, хотя вы, вероятно, захотите выбрать page-position="first", а не чем odd-or-even.

person Tony Graham    schedule 10.09.2015
comment
Звучит очень хорошо, но проблема в том, что я работаю с плагином, который уже большой. А дело в том, что у меня page-master на теле. И тело у каждой главы. Так что я думаю (но я абсолютно не уверен, потому что я новичок в этом), что в этом случае первая страница всегда будет только первой страницей первой главы. И изменить что-то такое большое может быть проблематично. - person Luzgan; 10.09.2015
comment
Что это за плагин? Если вы не можете изменить выбор мастера страницы, можете ли вы использовать fo:marker и fo:retrieve-marker, как предложил @potame? - person Tony Graham; 10.09.2015
comment
com.docdept.pdf. Я пытался, но у меня с этим проблемы. Потому что я смог настроить маркер, но я создавал маркер в page-sequence (точнее, в fo:flow), поэтому я думаю, что он всегда будет одинаковым для одной главы, не так ли? По крайней мере так было в моем примере. - person Luzgan; 10.09.2015
comment
Извините, но я ничего не знаю о com.docdept.pdf. Если вы можете использовать fo:retrieve-marker с retrieve-position="first-starting-within-page", то маркер должен быть получен только на первой странице темы. - person Tony Graham; 10.09.2015
comment
Я не вижу нигде в запросе, где OP хочет, чтобы каждая тема была в своей последовательности страниц, что означает, что каждая тема начинается с новой страницы. Это то, что делает это решение. - person Kevin Brown; 11.09.2015
comment
ОП сказал, что тема начинается с новой страницы. Из комментария маркеры были незнакомы, поэтому создание статического контента с каждой последовательностью страниц могло бы избавить от необходимости возиться с маркерами, но теперь мы знаем, что это не вариант, учитывая используемую структуру. - person Tony Graham; 11.09.2015