2015-06-17 1 views
0

В этой ситуации: Я конвертирую html в xsl-fo в pdf. Я показываю текст заголовка, такой как «4.4.1. [Header Text]», используя таблицу, потому что может случиться, что текст [Header Text] довольно длинный и в этом случае должен быть перенесен на следующую строку следующим образом:Настольная ячейка XSL-FO с надстрочным и вертикальным выравниванием

[table-row] 
    [cell with numbering] [cell with header text] 
[/table-row] 

Есть 4 различных случаев, как может состоять заголовок:

  1. заголовок текст однолинейных
  2. текста заголовка заворачивает на следующую строку
  3. заголовка текст одной строки с надстрочным
  4. текста заголовка обертывание на следующую строку с верхним индексом

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

__________________________ 
|_1.2.3_|_header_text____|  <<< OK 

__________________________ 
| 1.2.3 | long long long |  <<< OK 
|_______|_header_text____| 

__________________________ 
| 1.2.3 |   (1) |  <<< NOT OK 
|_______|_header_text____| 

__________________________ 
| 1.2.3 | long long long |  <<< OK 
|  |   (1) | 
|_______|_header_text____| 

Как вы можете видеть, в случае № 3 нумерации и большая часть текста заголовка не выровнены в хорошем способе.

Я мог бы решить случай № 3 с помощью display-align = "after" на таблице-ячейке с нумерацией. Но чтобы не испортить другие 3 случая, мне нужно было бы определить, будет ли содержимое текста заголовка перенесено на следующую строку или нет. Шрифт, который я использую для вывода, не является моноширинным, поэтому подсчет символов будет в лучшем случае приблизительным.

Мой вопрос, как это может быть сделано так, что случай 3 выглядит следующим образом:

__________________________ 
|  |   (1) | 
|_1.2.3_|_header_text____| 

в то время как другие остаются неизменными.

Спасибо!

EDIT: пример разметки для случая 3

<fo:table font-size="18pt" font-weight="bold" font-style="italic" space-after="2mm" space-before="7mm" keep-with-next.within-page="always"> 
    <fo:table-column column-width="16mm"/> 
    <fo:table-column/> 
    <fo:table-body> 
     <fo:table-row> 
      <fo:table-cell> 
       <fo:block>1.2.3</fo:block> 
      </fo:table-cell> 
      <fo:table-cell> 
       <fo:block> 
        <fo:block text-align="left"> 
         <fo:block>Header Text (<fo:inline baseline-shift="super">1</fo:inline>) 
         </fo:block> 
        </fo:block> 
       </fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
    </fo:table-body> 
</fo:table> 

EDIT 2: Я пытался обратить надстрочное-логику:

  • не использовать верхний индекс разметки на текст, который должен be superscript
  • заверните все текстовые части заголовка (включая нумерацию), чтобы должен был быть верхним индексом в

Это «сработало», я проверил его для случаев 3 + 4, и текст заголовка был в порядке с нумерацией в обоих случаях.

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

ответ

1

Вы используете элемент fo: inline, чтобы обернуть текст надстрочного текста, я полагаю. Если вы измените стратегию укладки строк по умолчанию от максимальной высоты до высоты шрифта, от верхнего индекса не будет пробела. Попытайтесь:

<fo:inline vertical-align="super" line-stacking-strategy="font-height">Your superscript text here</fo:inline> 

Редактировать: Я поместил стратегию выравнивания строк в родительский блок, который на самом деле вызывал эффект. Я тестировал с визуализатора Xml2PDF Altsoft в:

<fo:block line-stacking-strategy="font-height">Header Text <fo:inline baseline-shift="super">(1)</fo:inline> 

Чтобы получить тот же базовый уровень, я предлагаю использовать его для предыдущего поля тоже:

<fo:block line-stacking-strategy="font-height">1.2.3</fo:block> 
+0

Я попробовал ваше предложение, но unfortunateIy, похоже, это Безразлично Вносить изменения в результат. Я добавил пример (оригинальной) разметки к исходному вопросу. – flitz

+0

С помощью стратегии укладки строк на уровне блока это работает. Благодаря! Я тестировал его и в других случаях. Единственная незначительная проблема заключается в том, что текст надстрочного текста теперь немного перекрывается с верхним краем области. Но это не является большой проблемой и делается еще менее критическим из-за того, что текст надстрочного шрифта обычно имеет меньший шрифт (не показан в примере вопроса). – flitz