Scribus - вертикально выравнивать текст внутри текстовой рамки

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

4 ответа

Решение

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

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

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

Используя 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: Текстовые расстояния вне границ, должны быть положительными.

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

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

Удивительно, но для такой простой и распространенной функции в 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.

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

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

Просто примечание к принятому ответу Килла: 1.5.4 не находится в стабильной ветке, но это релиз для разработки. Это может быть интересно, когда кто-то задается вопросом после установки 1.4.8 (последняя стабильная версия). Тем не менее, это действительно работает, хорошее улучшение от команды разработчиков.

Другие вопросы по тегам