Как выровнять текст по вертикали внутри текстового фрейма Scribus?
4 ответа
Используя 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);
Вот как использовать скрипт:
- скопируйте и вставьте скрипт в текстовый документ (например, с помощью блочной заметки или блокнота) без применения стилевого форматирования к документу;
- сохраните документ как файл .py , назвав его любым именем;
- в Scribus выберите текстовый фрейм ;
- перейдите в Script (рядом с Extras) в главном меню вверху, затем выберите Execute Scripts ...;
- Появится окно « Run Script», в котором вы выберите созданный вами файл .py;
- нажмите ОК
Текст внутри выделенного текстового фрейма будет центрирован вертикально.
Я мог испытать по крайней мере два недостатка с этим сценарием:
- необходимо перезапустить скрипт, если была изменена либо высота, либо ширина текстового фрейма
- он не может центрировать текст, если он переполняется, так как создает какие-то верхние и нижние поля (поэтому, возможно, не идеально подходит для больших текстов)
Этот сценарий преодолевает тот факт, что сценарий, упомянутый в ответе Джона Бентли, не работал для меня (по крайней мере, в Scribus 1.4.6), показывая сообщение об ошибке со следующей строкой:
ValueError: Текстовые расстояния вне границ, должны быть положительными.
что, возможно, связано больше с документом, чем сам скрипт.
Выберите текстовый фрейм и нажмите F2 или щелкните правой кнопкой мыши и выберите свойства. Затем выберите раздел Shape. Там вы можете установить смещение левого поля от края текстового фрейма, чтобы выровнять текст в фрейме. Вы также можете установить вкладки и столбцы, если это больше соответствует вашей цели.
Удивительно, что для такой простой и распространенной функции в Scribus не существует опции для версии 1.4.5. Вот три обходных пути (к сожалению, ни один из которых не является идеальным решением), один из которых основан на ответе @ W_Whalley (который является устаревшим для текущего пользовательского интерфейса Scribus):
Вручную установите интервал внутри текстовой рамки
Адаптировано из ответа @ W_Whalley:
- Откройте « Свойства» для текстового фрейма (выберите и нажмите F2 или щелкните правой кнопкой мыши и выберите «Свойства»).
- Выберите вкладку « Текст ».
- Откройте раскрывающийся список « Столбцы и расстояния текста» .
- Отрегулируйте поля для достижения желаемого выравнивания.
Недостатки:
- Вы должны будете отработать поля вручную.
- Это приведет только к приближению, если вы не усердно работаете, чтобы рассчитать поля.
- Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.
Выровняйте текстовую рамку внутри другого объекта
Основываясь на предложенном решении на Scribus Wiki:
- Обведите текстовый фрейм другим объектом (например, другим текстовым фреймом).
- Выберите внутреннюю рамку и внешнюю рамку вместе в этом порядке (используя клавишу Shift).
- Откройте окно « Выравнивание и распространение».
- Установить относительно последнего выбранного.
- Нажмите Центр по горизонтальной оси.
Недостатки:
- Это неточно из-за того, что текст во внутреннем текстовом фрейме не выровнен по вертикали.
- Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.
Использовать скрипт
- Используйте этот скрипт из Scribus Wiki.
Я лично не пробовал эту опцию, поэтому не могу подтвердить, насколько она эффективна. Из описания можно было бы решить большинство недостатков двух других методов, оставив только один:
- Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.