Scribus - вертикально выравнивать текст внутри текстовой рамки
Как выровнять текст по вертикали внутри текстового фрейма Scribus?
4 ответа
Использование Scribus 1.5.4:
- Щелкните правой кнопкой мыши на текстовом поле и выберите
Text Properties
; - Нажмите на
Column & Text Distances
; - На первой строке поменяй
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);
Вот как использовать скрипт:
- скопируйте и вставьте сценарий в текстовый документ (например, с помощью блок-заметки или блокнота) без применения стилевого форматирования к документу;
- сохраните документ как файл .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.
Я лично не пробовал эту опцию, поэтому не могу подтвердить, насколько она эффективна. Из описания, по-видимому, можно решить большинство недостатков двух других методов, оставив только один:
- Вам придется повторять его каждый раз, когда вы вносите изменения, которые изменяют выравнивание.
Просто примечание к принятому ответу Килла: 1.5.4 не находится в стабильной ветке, но это релиз для разработки. Это может быть интересно, когда кто-то задается вопросом после установки 1.4.8 (последняя стабильная версия). Тем не менее, это действительно работает, хорошее улучшение от команды разработчиков.