تخطَّ إلى المقال

الطباعة والخطوط نُشر زمن القراءة 10 د

ارتفاع السطر في العربية ليس 1.7: حساب الحدّ الأدنى الحقيقي

كل دليل يعطي النسبة نفسها، ولا واحد منها يعطي مصدرًا. والرقم الذي تحتاجه ليس خاصيّةً من خصائص العربية أصلًا — هو خاصيّة أسوأ موضع يمكن أن ينكسر عنده نصّك أنت، وتستطيع حسابه من ملف الخط في نحو عشرين سطرًا.

باختصار

لا توجد نسبة صحيحة لارتفاع السطر في العربية، لأن المقدار الذي تختاره ليس خاصيّةً من خصائص الكتابة. السطران المتراكبان يتصادمان حبرًا بحبر لا صندوقًا بصندوق، فالحدّ الأدنى هو أعمق نزول في السطر الأعلى مضافًا إليه أعلى صعود في السطر الذي يليه، مقيسًا على النصوص التي تنشرها فعلًا، عند كل حدّ كلمة يمكن أن تنكسر عنده، ومضروبًا في أي size-adjust طبّقته. على هذا الموقع أعاد هذا الحساب 1.3944 لأسوأ حالة بين أربعة نصوص عرض، والقيمة المنشورة 1.45 — أي أنها تعلوه بمقدار 5.6 بالمئة من em. وعنوان واحد لا يمكن أن ينكسر أخذ 1.25 بالطريقة نفسها.

ما تخرج به

  1. صناديق السطور لا تتصادم. الحبر هو الذي يتصادم. احسب الحدّ الأدنى من الصعود والنزول في الخط نفسه، لا من نسبة كرّرها أحدهم.
  2. الحالة الحاسمة هي في الغالب ألف تحمل همزة، وهي تبلغ 1.024 em فوق خطّ الأساس في Zain حيث لا تتجاوز الألف المجرّدة 0.716.
  3. size-adjust يضبط مقاييس الخط أيضًا، فيجب حساب الحدّ الأدنى بعده لا قبله.
  4. العنوان الذي لا يمكن أن ينكسر له حدّ أدنى مختلف وأخفض من حدّ جملة تنكسر. ورقم واحد لهما معًا رقم خاطئ لأحدهما.
  5. النص الجاري ونصوص العرض يحتاجان قيمتين مختلفتين للسبب نفسه الذي يجعلهما يحتاجان size-adjust مختلفًا: هما يُقرآن على ارتفاعين مختلفين.

searched again 2026-05-06

من أين جاء الرقم 1.7؟

ابحث عن ارتفاع السطر المناسب للنص العربي على الويب، فيعود إليك الرقم نفسه من عشرات مقالات الوكالات ومدوّنات التصميم: 1.7، وأحيانًا 1.8، وأحيانًا مصوغًا على أنه مرّة ونصف ما تستعمله للّاتينية. المقالات تتفق فيما بينها. ولا واحدة منها تتفق مع مصدر.

تتبّع الإحالات مفيد. أكثرها يحيل إلى مقال آخر يعطي الرقم نفسه بلا مصدر. وعدد منها يستشهد بتقرير لا وجود له. والبقية تقدّم الرقم على أنه بديهي، وهو الشيء الوحيد الذي لا يمكن أن يكونه في كتابة يتفاوت امتدادها الرأسي بين خطٍّ وآخر أكثر مما يتفاوت في اللاتينية.

هذا لا يجعل 1.7 خاطئًا. ففي كثير من الخطوط العربية بحجم المتن يقع مرتاحًا فوق الحدّ الأدنى، ولذلك لم يسِئ إلى أحد إساءةً بالغة. لكنه يجعله رقمًا غير قابل للتكذيب، والرقم غير القابل للتكذيب رقم لا تستطيع تنقيحه حين تتصادم عناوينك رغمًا عنه.

CSS Inline Layout, half-leading

ما يتصادم فعلًا هو الحبر، لا الصناديق

صندوق السطر ليس على شكل الحبر الذي بداخله. المتصفّح يبني كل سطر من مقاييس الخط: الصعود فوق خطّ الأساس، والنزول تحته، والفارق بين مجموعهما وبين ارتفاع السطر، وهو فارق يُقسَم بالتساوي أعلى وأسفل باسم نصف الفراغ البيني (half-leading). وحين يصير ارتفاع السطر أصغر من صندوق محتوى الخط، يصير نصف الفراغ سالبًا ويفيض الحبر خارج صندوق سطره في الاتجاهين معًا.

لهذا قد تبدو الفقرة العربية سليمة ويظلّ العنوان العربي متصادمًا عند النسبة نفسها. فالفقرة مضبوطة عند حجم يكون فيه الصعود والنزول صغيرين بالقيمة المطلقة؛ والعنوان ليس كذلك. ولهذا أيضًا يجب طرح السؤال بوحدات em من الحبر لا بمضاعفات حجم الخط.

والعربية تجعل الفارق بين الصندوق والحبر أكبر مما تجعله اللاتينية، لسبب بعينه: العلامات. فالياء في آخر الكلمة تحمل نقطتين تتدلّيان قرابة نصف em تحت خطّ الأساس، والألف الحاملة للهمزة تحمل علامة تعلو الألف المجرّدة بوضوح. وليس أيٌّ منهما حالة شاذّة — كلاهما حرف عادي في كلمة عادية.

الصعود (ascent)
إلى أي مدى يرتفع أعلى حبر في السطر فوق خطّ الأساس، ككسر من em. في Zain يتفاوت هذا بين 0.716 للألف المجرّدة و1.024 للألف الحاملة للهمزة.
النزول (descent)
إلى أي مدى ينزل أعمق حبر تحته. النقطتان تحت الياء في آخر الكلمة، وكأس العين في آخرها، هما المرشّحان المعتادان.
size-adjust
مُعامل يُطبَّق على الخط كلّه، بما في ذلك مقاييسه. والحدّ الأدنى المحسوب قبله خاطئ بمقدار هذا المعامل بالضبط.
المقادير الثلاثة التي يتألّف منها الحدّ الأدنى.

fontTools 4.x, five minutes

كيف تحسب الحدّ الأدنى لنصوصك أنت

الطريقة قصيرة بما يكفي لتشغّلها مرّة واحدة لكل خط ثم تنساها. تحتاج ملف الخط، والنصوص التي تنشرها، ووسيلة لقراءة صناديق إحاطة المحارف — وfontTools هي الوسيلة المعتادة.

شكل القياس، بـfontTools. والرقمان الخارجان منه هما الجواب كلّه.
from fontTools.ttLib import TTFont
 
font  = TTFont(path)
upem  = font[head].unitsPerEm
glyf  = font[glyf]
cmap  = font.getBestCmap()
 
def extent(text):
    lo, hi = 0, 0
    for ch in text:
        g = glyf[cmap[ord(ch)]]
        if g.numberOfContours == 0: continue
        lo = min(lo, g.yMin); hi = max(hi, g.yMax)
    return lo / upem, hi / upem
 
# الحدّ الأدنى لانكسار واحد = |نزول السطر الأعلى| + صعود السطر الأسفل
floor = abs(extent(upper)[0]) + extent(lower)[1]
  1. اسرد النصوص التي تهمّ لا محتواك كلّه. بل نصوص العرض — العناوين، وأسطر الوقع، وكل ما يُضبط بحجم يجعل التصادم مرئيًا. والنص الجاري بحجم المتن نادرًا ما يكون الحالة الحاسمة.
  2. أحصِ مواضع الانكسار لكل نص، كل حدّ كلمة يمكن أن ينكسر عنده. عنوان من ثلاث كلمات فيه موضعان. وكل انكسار يعطيك سطرًا أعلى وسطرًا أسفل.
  3. قِس الطرفين للسطر الأعلى، أعمق yMin بين محارفه. وللسطر الأسفل، أعلى yMax. وكلاهما ككسر من unitsPerEm.
  4. اجمعهما الحدّ الأدنى لذلك الانكسار هو القيمة المطلقة لنزول السطر الأعلى مضافًا إليها صعود السطر الأسفل. وتحت هذا الرقم يتقاسم السطران البكسلات نفسها.
  5. طبّق size-adjust اضرب في أي size-adjust أُعلن به الخط. فالمواصفة تطبّق الضبط على مقاييس الخط، ومن ثمّ يتحرّك الحبر معه.
  6. خذ الأكبر، ثم أضف هواءً أسوأ انكسار عبر نصوصك كلّها هو الحدّ الأدنى. وانشر فوقه بهامش تختاره عن قصد، لا بنسبة ورثتها.
القياس من أوّله إلى آخره. وهو يجيب عن سؤال واحد: عند أي ارتفاع سطر لا يمكن لهذين السطرين أن يتلامسا؟

تفصيلان يسهل الخطأ فيهما. تجاوز المحارف التي لا كنتورات لها، وإلا سحبت المسافة نزولك إلى صفر وأخفت التصادم. وقِس الشكل المركّب — ففي العربية تكون النقاط والهمزة مكوّنات منفصلة تُجمَّع عند العرض، والبحث الساذج الذي يفوّتها سيخبرك أن الألف الحاملة للهمزة بارتفاع الألف المجرّدة نفسه.

Zain, size-adjust 112% and 103%

النصوص الأربعة التي تحدّد الرقم على هذا الموقع

ينشر هذا الموقع أربعة نصوص عرض عربية يمكن أن تنكسر. وتشغيل القياس عليها جميعًا، عند كل حدّ كلمة يمكن أن ينكسر عنده كلٌّ منها، أنتج أربعة حدود دنيا وقرارًا واحدًا.

محسوبة على مخطّطات Zain، عند size-adjust المُعلن به كل دور. والحالة الحاسمة هي عبارة التذييل، وهي حاسمة بسبب حرف واحد.
النص أين يظهر الحدّ الأدنى المحسوب
دائمًا | أستكشف الفكرة التالية عبارة التذييل 1.3944
مشاريع | مختارة عنوان المشاريع 1.2952
خمس | دورات شهادة واحدة قسم الشهادة 1.2412
لغات | & تقنيات شبكة التقنيات 1.1549

والقيمة المنشورة 1.45. تعلو أسوأ الأربعة بمقدار 5.6 بالمئة من em، وهو ما يكفي لألّا يتحوّل تحديثٌ للخط بمقاييس مختلفة قليلًا إلى تصادم فوري، ويقلّ بما يكفي لألّا تتباعد العناوين العربية بعضها عن بعض.

ولاحظ كم تبعد الأربعة بعضها عن بعض. الفارق بين أضيق نص وأوسعه 0.24 em — أكبر من المسافة بين 1.45 وأي نسبة في النصائح المتداولة. والرقم المختار لمتوسّط محتواك رقم خاطئ لطرفيه.

measured on the Zain outlines

لماذا الحالة الحاسمة ألف تحمل همزة

نص التذييل يتفوّق بـ0.10 em على الذي يليه سوءًا، وهو يتفوّق بحرف واحد. فسطره الثاني يبدأ بألف تحمل همزة، وتلك العلامة هي ما يغيّر الحساب. والشكلان موضوعان جنبًا إلى جنب أدناه بالحجم نفسه.

  • 0.716 plain alef ا الشكل الرأسي العادي
  • 1.024 hamza-bearing alef أ العلامة تتجاوز صندوق em
  • +43% الفارق علامة واحدة، على السطر كلّه
الصعود فوق خطّ الأساس، ككسر من em، مقيسًا على مخطّطات Zain.

الجملة العرضية التي يمكن أن تضع إحدى هاتين في سطر ثانٍ هي ما يحدّد الرقم. وتلك حقيقة عن المحتوى لا عن الطباعة — ولهذا يجب أن يجري القياس على نصوصك أنت لا على الأبجدية. والموقع الذي لا تنكسر عناوينه العربية قبل ألف حاملة للهمزة أبدًا له حدّ أدنى أخفض فعلًا، ومن حقّه أن يستعمله.

four roles, four values

رقم واحد لا يكفي للنص الجاري وللعرض معًا

الحدّ الأدنى يجيب عن متى يتصادم الحبر. ولا يجيب عن ما المريح في القراءة، وهذان سؤالان مختلفان بأجوبة مختلفة لأدوار مختلفة. وينتهي هذا الموقع إلى أربعة ارتفاعات سطر عربية، لكلٍّ منها سببه.

النص الجاري — p، li 1.8
التسميات والعناوين الفوقية 1.55
عناوين العرض 1.45
الثنائية ذات الكلمة الواحدة 1.25
ارتفاعات السطر العربية الأربعة التي ينشرها هذا الموقع، وما يخدمه كلٌّ منها.الأشرطة مرسومة بمقياس نسبته إلى 1.8.

النص الجاري يأخذ 1.8 لأنه يُقرأ في أسطر طويلة وتحتاج عودة العين إلى متّسع، لا لأن شيئًا يتصادم عند 1.5. والتسميات تأخذ 1.55 لأنها صغيرة، وأشبه بالحروف الكبيرة، وتقع داخل نافذة قصّ عليها أن تتجاوز نزولها. والعرض يأخذ 1.45 المقيسة. وقسم واحد يأخذ 1.25، لسبب يستحقّ فقرة خاصّة به.

ارتفاع سطر التسميات أعلاه تحدّده نافذة قصّ لا تصادمٌ، ولتلك النافذة حكايتها — الانقلاب الذي يهبط بعيدًا عن خطّ الأساس.

measured at 130.5px, intended 112.5

الاستثناء: عنوان لا يمكن أن ينكسر

قسم واحد من هذا الموقع يركّب عنوانين من كلمة واحدة، كلٌّ منهما كلمة واحدة فوق كلمة واحدة. ولا يمكن لأيٍّ منهما أن ينكسر، فالتصادم الوحيد الممكن هو نزول العنصر الأول في مواجهة صعود العنصر الثاني — وكلاهما محارف معلومة لا مدى من الاحتمالات.

مقيسًا على قطعتَي Zain اللتين يختارهما هذان العنصران: نزول 0.4262 em وصعود 0.7158 em، أي حدّ أدنى قدره 1.1420. والقيمة المنشورة 1.25، وهي تعلوه بمقدار 10.8 بالمئة من em، وتنقل الكتلة العربية من 391 بكسلًا إلى 337 عند 1440 مقابل 247 اللاتينية.

القاعدة، وأين تعيش. هي في ورقة اللغة لا في ورقة القسم لأن طبقة التتالي تغلب التخصيص: طبقة الأدوات تنتصر على أي شيء يكتبه ملف قسم، مهما ضاق نطاقه.
html[lang='ar'] .otot-home-text-w :is(h1, h2, h3) {
  line-height: 1.25;
}
الجانب / البرمجي
النصف البرمجي من الثنائية. نزول 0.4262 em في الكلمة العليا، وصعود 0.7158 em في السفلى، أي حدّ أدنى قدره 1.1420.
الجانب / التصميمي
النصف التصميمي. الكلمة العليا نفسها، والسفلى أقصر في الامتداد الرأسي، فليس هذا الزوج هو الحالة الحاسمة.
الزوجان، والقياس الواحد الذي يحتاجانه. كل محرف معلوم سلفًا، وهذا ما يجعل رقمًا أضيق قابلًا للدفاع عنه هنا دون سواه في الصفحة.

نُشرت في ملف القسم أوّل الأمر، فعُرضت عند 130.5 بكسل حيث كان المقصود 112.5، لأن القاعدة الشاملة لعناوين العرض في ورقة اللغة كانت في طبقة لاحقة فانتصرت. هكذا اكتُشفت القاعدة، ولهذا صارت الآن إلى جانب الرقم الذي هي استثناء له.

حجّة طبقات التتالي نفسها تحسم عدّة تصحيحات عربية أخرى على هذا الموقع — انظر علل الاتجاه من اليمين إلى اليسار السبع التي لا تصلحها الخصائص المنطقية.

a checklist, not a ratio

ماذا تفعل على موقعك أنت

إن أخذت شيئًا واحدًا من الحساب أعلاه، فخذ شكل السؤال لا أيًّا من الأرقام. أرقامي هي Zain عند قيمتَي size-adjust فوق أربعة نصوص بعينها؛ وأرقامك ستكون خطًّا آخر فوق كلمات أخرى، وسيقع الحدّ الأدنى في مكان آخر.

قِس قبل أن تختار
شغّل قياس الامتدادات على نصوص العرض عندك مرّة واحدة. يستغرق دقائق، ويستبدل برقم لا يستطيع أحد الدفاع عنه رقمًا تستطيع أنت الدفاع عنه.
افعلها بعد size-adjust
إن كنت تطابق خطًّا عربيًا بخطّ لاتيني عبر size-adjust، فالحبر يتحرّك مع الضبط. احسب الحدّ الأدنى عند القيمة المنشورة، لا عند 100 بالمئة.
افصل العرض عن النص الجاري
هما يُقرآن على ارتفاعين مختلفين ويتصادمان عند ارتفاعين مختلفين. والقيمتان ليستا ترددًا، بل جوابان لسؤالين.
انتبه لنوافذ القصّ
أي تأثير يقصّ تسمية — دورة، أو قناع، أو صندوق بارتفاع ثابت — له علاقته الخاصة بالنزول، وفتح صندوق السطر دون تحريك القصّ هو الطريق إلى قطع النقطتين من ياء آخر الكلمة.
لا تباعد بين الحروف أبدًا
لا علاقة له بارتفاع السطر، ويستحقّ أن يُقال في النفَس نفسه: التباعد يفكّك كتابةً متّصلة. وهو التجاوز الشامل الوحيد الذي يستحقّ أن يُطبَّق على الموقع كلّه.
خمسة فحوص، بترتيب ما تعود به.

لمشكلة نافذة القصّ مقالها الخاص، لأنها الموضع الذي يتحوّل فيه ارتفاع السطر الخاطئ إلى حرف خاطئ: ضبط حجم خطّ عربي حين لا يعني ارتفاع الـx شيئًا.

وإن كنت تختار خطًّا عربيًا لموقع ثنائي اللغة، فالنصف المتعلّق بالمقاييس من هذا السؤال هو قياس السنّ والألف.

أسئلة

هل 1.7 ضارّ فعلًا؟

نادرًا. ففي نصّ المتن بأكثر الخطوط العربية يقع فوق الحدّ الأدنى بمسافة مريحة، فلا يتصادم شيء — هو فقط أكبر مما يلزم، وذلك يكلّف مساحة رأسية ويفكّك الفقرة. والضرر يظهر في خطوط العرض، حيث يكون 1.7 مفرط الاتّساع، وحيث يمكن لخط ذي علامات مرتفعة أن يتصادم عند نسب يظنّها الناس سخيّة.

هل ينطبق هذا على الفارسية والأردية وسائر لغات الخط العربي؟

الطريقة تنطبق تمامًا. أمّا الأرقام فلا. فالأردية بخطّ نستعليق لها بنية رأسية مختلفة جذريًا عن العربية بخطّ نسخ أو كوفي، والنستعليق خاصةً يتدرّج نازلًا داخل الكلمة الواحدة، فتكون امتداداته أكبر من ذلك أيضًا. قِس الخط الذي تنشره أنت.

وماذا عن text-box-trim وleading-trim؟

هما يحلّان مشكلة أخرى: إزالة نصف الفراغ البيني فوق السطر الأول وتحت الأخير، حتى تصطفّ كتلة النص على حبرها لا على صناديق سطورها. ولا يغيّران ما يحدث بين سطرين داخل الكتلة، وهو ما يدور حوله الحدّ الأدنى. مفيدان، ومتعامدان على المسألة.

أفلا أضبط ارتفاع سطر كبيرًا وأكفّ عن القلق؟

تستطيع، وهي مقايضة معقولة للنص الجاري. أمّا لخطوط العرض فلا: العنوان المضبوط عند 1.7 يُقرأ سطرين منفصلين لا عبارةً واحدة في سطرين، وعلى الهاتف قد يدفع بقيّة القسم خارج الشاشة. والغاية من القياس أن تستطيع التضييق عن قصد.

المصادر

مقيس في هذا المستودع

  • src/styles/locale/arabic.css الحدود الأربعة المحسوبة، واشتقاق 1.45 و1.25، وامتدادات الألف الحاملة للهمزة، وارتفاعات السطر الأربعة المنشورة مع سبب كلٍّ منها.
  • src/assets/fonts/zain/ قطع Zain الثلاث التي أُخذت عليها القياسات، منشورة مع رخصة SIL Open Font.
  • src/styles/tokens/type.css سلّم ارتفاعات السطر اللاتينية التي تصحّحها القيم العربية، ومفتاحا الضبط البصري لكل لغة.

روجِع مقابل

Alaa Abbod

بقلم

علاء عبّود

مطوّر إبداعي — هيرنه، ألمانيا

مصمّم ومطوّر يبني مواقع ويب سهلة الوصول وتطبيقات جوال ومتاجر إلكترونية وهويات بصرية كعملٍ واحد، وبيديه. هذا الموقع منشور بالإنجليزية والألمانية والعربية من مصدر واحد، ومن هناك جاء أكثر هذه الأسئلة.

Alaa Abbod

أتبني شيئًا بأكثر من كتابة واحدة؟

العربية ليست مسألة ترجمة مرفقة بورقة أنماط. إن كنت تخطّط لبناء ثنائي أو ثلاثي اللغة وتريد الطباعة محسومة قبل أن يُحسم التخطيط، فتلك محادثة قصيرة تستحقّ أن تجري مبكرًا.

من فضلك أدر جهازك،
هذا الموقع مبني عموديًا.