Как указать fo: блок занимает страницу - PullRequest
3 голосов
/ 23 мая 2019

У меня есть fo: block, который может занимать страницу.Я хотел бы разместить текст типа «продолжение» внизу первой страницы, на которой находится блок.

Исходный документ содержит серию s внутри тега .

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

Нужно ли проверить, охватывает ли блок страницу?

Исходный документ:

<recipe page-break="auto">
  <instructions>
    <step>The first thing to do</step>
    <step>The second thing to do</step>
  </instructions>
<recipe>

Соответствующий раздел таблицы стилей:

<xsl:template match="recipe">
  <xsl:variable name="pbi"><xsl:choose><xsl:when test="@page-break"><xsl:value-of select="@page-break"/></xsl:when><xsl:otherwise>avoid</xsl:otherwise></xsl:choose></xsl:variable>
  <xsl:variable name="pbb"><xsl:choose><xsl:when test="@page-break">always</xsl:when><xsl:otherwise>auto</xsl:otherwise></xsl:choose></xsl:variable>
  <fo:block page-break-inside="{$pbi}" page-break-before="{$pbb}" margin-bottom="1.5em">
    <xsl:apply-templates select="instructions/step" mode="plain"/>
  </fo:block>
</xsl:template>

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 мая 2019

Хотя предложение Тони будет работать, оно будет работать только для форматеров, которые поддерживают эту конструкцию.Как он предлагает, вы можете сделать то же самое с чистыми маркерами, потянувшими в нижний колонтитул.У вас может быть меньше контроля в вертикальном пространстве между концом контента и нижним колонтитулом, но это зависит от вашего контента.

Вы бы просто использовали маркер получения в области нижнего колонтитула, например:

    <fo:static-content flow-name="footer">
        <fo:block-container text-align="left" margin-left="1in">
            <fo:block><fo:retrieve-marker retrieve-class-name="continued" retrieve-boundary="page" retrieve-position="last-starting-within-page"/>
            </fo:block>
        </fo:block-container>
    </fo:static-content>

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

 <fo:block-container>
    <fo:marker marker-class-name="continued">I am continued on next page ...</fo:marker>
    <fo:block margin-top="6pt">I am some text that will break across the page somewhere. When I do break the footer should have continued. I am some text that will break across the page somewhere. When I do break the footer should have continued. </fo:block>
 <!-- More content here, whatever you need -->

 </fo:block-container>
 <fo:block-container keep-with-previous.within-page="always">
     <fo:marker marker-class-name="continued"></fo:marker>
 </fo:block-container>

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

Результат выглядит следующим образом: непрерывного текста не существует (страницы 1, 3, 4), кроме случаев, когда разрывы страниц внутри отмеченной областис продолжением сообщения (стр. 2).

enter image description here

1 голос
/ 23 мая 2019

Используйте маркеры. Либо поместите все в fo:table и используйте fo:retrieve-table-marker (см. https://www.w3.org/TR/xsl11/#fo_retrieve-table-marker) в fo:table-footer, либо используйте fo:retrieve-marker в fo:static-content для fo:region-after. Разница в том, что при * В методе 1009 * указание «продолжение» может появляться сразу после последнего текста на странице (как в этом примере), а не в фиксированной позиции в нижнем колонтитуле страницы с помощью метода fo:retrieve-marker.

Formatted sample

<fo:table table-layout="fixed">
  <fo:table-footer>
    <fo:retrieve-table-marker
        retrieve-class-name="footer-continued"
        retrieve-position-within-table="last-ending"/>
  </fo:table-footer>
  <fo:table-body>
    <fo:table-row>
      <fo:marker marker-class-name="footer-continued">
        <fo:table-row>
          <fo:table-cell padding="3pt">
            <fo:block text-align="right"
                      font-style="italic">continued.....</fo:block>
          </fo:table-cell>
        </fo:table-row>
      </fo:marker>
      <fo:table-cell padding="3pt">
        <fo:block>The first thing to do</fo:block>
      </fo:table-cell>
    </fo:table-row>
    ...
    <fo:table-row>
      <fo:marker marker-class-name="footer-continued" />
      <fo:table-cell padding="3pt">
        <fo:block>The fourth thing to do</fo:block>
      </fo:table-cell>
    </fo:table-row>
  </fo:table-body>
</fo:table>

Вы можете использовать метод fo:retrieve-table-marker с FOP, если вы работаете с его документированным (фиксированная компоновка таблицы, извлеченный маркер не может изменить размерность блока) и недокументированным (суетливо по поводу того, где поставить fo:retrieve-table-marker, пришлось переместить fo:marker в fo:table-cell) ограничения:

<fo:table table-layout="fixed" width="100%">
  <fo:table-footer>
    <fo:table-row>
      <fo:table-cell padding="3pt">
        <fo:block text-align="right"
                  font-style="italic">
          <fo:retrieve-table-marker
              retrieve-class-name="footer-continued"
              retrieve-position-within-table="last-ending"/>
        </fo:block>
      </fo:table-cell>
    </fo:table-row>
  </fo:table-footer>
  <fo:table-body>
    <fo:table-row>
      <fo:table-cell padding="3pt">
        <fo:marker marker-class-name="footer-continued">continued.....</fo:marker>
        <fo:block>The first thing to do</fo:block>
      </fo:table-cell>
    </fo:table-row>
    ...
    <fo:table-row>
      <fo:table-cell padding="3pt">
        <fo:marker marker-class-name="footer-continued">&#xA0;</fo:marker>
        <fo:block>The fourth thing to do</fo:block>
      </fo:table-cell>
    </fo:table-row>
  </fo:table-body>
</fo:table>
...