4

Как выровнять текст по вертикали внутри текстового фрейма Scribus?

4 ответа4

2

Используя Scribus 1.4.6, следующий скрипт по центру (по вертикали) выровнял содержимое текстового фрейма . Алессандро Римольди смог выровнять текст в текстовом фрейме по вертикали:

  • делать это автоматически, даже если после этого изменяется межстрочный интервал и / или смещение первой строки
  • и с несколькими абзацами разных стилей

Вот сценарий (если необходимо, краткая инструкция по использованию сценария следует следующим строкам кода):

#!/usr/bin/python
"""
this script adjust the top and bottom distance of a text frame
to exactly put its content in the middle of the frame
@author: alessandro rimoldi
@version: 1.0 / 20090209
@copyright (c) 2009 alessandro rimoldi under the mit license
           http://www.opensource.org/licenses/mit-license.html
"""
import sys
try:
   import scribus
except ImportError:
   print "This script only works from within Scribus"
   sys.exit(1)

# check that the selection is one text frame and get that frame
frame_n = scribus.selectionCount()
if frame_n == 0 :
    scribus.messageBox('Error:', 'No frame selected');
    sys.exit(1)
elif frame_n > 1 :
    scribus.messageBox('Error:', 'You may select only one frame');
    sys.exit(1)

frame = scribus.getSelectedObject(0)
try:
    char_n = scribus.getTextLength(frame)
except scribus.WrongFrameTypeError:
    scribus.messageBox('Error:', 'You may only adjust text frames');
    sys.exit(1)

if char_n == 0 :
    scribus.messageBox('Error:', 'You can\'t adjust an empty frame');
    sys.exit(1)

if (scribus.textOverflows(frame) == 1) :
    scribus.messageBox('Error:', 'You can\' center a text which is overflowing');
    sys.exit(1)

# get some page and frame measure

(x, y) = scribus.getPosition(frame)

(w, h) = scribus.getSize(frame)

original_height = h

(dl, dr, dt, db) = scribus.getTextDistances();

scribus.setTextDistances(dl, dr, 0, 0);

# if the frame doesn't overflow, shorten it to make it overflow
while ((scribus.textOverflows(frame) == 0) and (h > 0)) :
    h -= 10
    scribus.sizeObject(w, h, frame)

# resize the frame in 10pt steps
while (scribus.textOverflows(frame) > 0) :
    h += 10
    scribus.sizeObject(w, h, frame)

# undo the latest 10pt step and fine adjust in 1pt steps
h -= 10
scribus.sizeObject(w, h, frame)

while (scribus.textOverflows(frame) > 0) :
    h += 1
    scribus.sizeObject(w, h, frame)


scribus.sizeObject(w, original_height, frame)

dt = (original_height - h) / 2

scribus.setTextDistances(dl, dr, dt, dt);

Вот как использовать скрипт:

  1. скопируйте и вставьте скрипт в текстовый документ (например, с помощью блочной заметки или блокнота) без применения стилевого форматирования к документу;
  2. сохраните документ как файл .py , назвав его любым именем;
  3. в Scribus выберите текстовый фрейм ;
  4. перейдите в Script (рядом с Extras) в главном меню вверху, затем выберите Execute Scripts ...;
  5. Появится окно « Run Script», в котором вы выберите созданный вами файл .py;
  6. нажмите ОК

Текст внутри выделенного текстового фрейма будет центрирован вертикально.

Я мог испытать по крайней мере два недостатка с этим сценарием:

  • необходимо перезапустить скрипт, если была изменена либо высота, либо ширина текстового фрейма
  • он не может центрировать текст, если он переполняется, так как создает какие-то верхние и нижние поля (поэтому, возможно, не идеально подходит для больших текстов)

Этот сценарий преодолевает тот факт, что сценарий, упомянутый в ответе Джона Бентли, не работал для меня (по крайней мере, в Scribus 1.4.6), показывая сообщение об ошибке со следующей строкой:

ValueError: Текстовые расстояния вне границ, должны быть положительными.

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

1

Использование Scribus 1.5.4:

  1. Щелкните правой кнопкой мыши текстовое поле и выберите « Text Properties ;
  2. Нажмите на Column & Text Distances ;
  3. В первой строке измените Vertical Alignment на нужное значение (например, Middle).

Снимок экрана меню "Свойства текста"

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

1

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

1

Удивительно, что для такой простой и распространенной функции в Scribus не существует опции для версии 1.4.5. Вот три обходных пути (к сожалению, ни один из которых не является идеальным решением), один из которых основан на ответе @ W_Whalley (который является устаревшим для текущего пользовательского интерфейса Scribus):

Вручную установите интервал внутри текстовой рамки

Адаптировано из ответа @ W_Whalley:

  1. Откройте « Свойства» для текстового фрейма (выберите и нажмите F2 или щелкните правой кнопкой мыши и выберите «Свойства»).
  2. Выберите вкладку « Текст ».
  3. Откройте раскрывающийся список « Столбцы и расстояния текста» .
  4. Отрегулируйте поля для достижения желаемого выравнивания.

Недостатки:

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

Выровняйте текстовую рамку внутри другого объекта

Основываясь на предложенном решении на Scribus Wiki:

  1. Обведите текстовый фрейм другим объектом (например, другим текстовым фреймом).
  2. Выберите внутреннюю рамку и внешнюю рамку вместе в этом порядке (используя клавишу Shift).
  3. Откройте окно « Выравнивание и распространение».
  4. Установить относительно последнего выбранного.
  5. Нажмите Центр по горизонтальной оси.

Недостатки:

  • Это неточно из-за того, что текст во внутреннем текстовом фрейме не выровнен по вертикали.
  • Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.

Использовать скрипт

  1. Используйте этот скрипт из Scribus Wiki.

Я лично не пробовал эту опцию, поэтому не могу подтвердить, насколько она эффективна. Из описания можно было бы решить большинство недостатков двух других методов, оставив только один:

  • Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .