# למה `` חובה בכל run ## הבעיה כשאתה יוצר `run` ב-python-docx על סגנון עברי מוגדר היטב (למשל Normal עם `cs="David"`) — עברית עדיין יוצאת ב-Times New Roman. ## הסיבה Word משתמש ב-3 font slots בתוך ``: - `w:ascii` — תווים לטיניים - `w:hAnsi` — אותיות מיוחדות אירופיות - `w:cs` (complex script) — עברית, ערבית, תאית ההחלטה איזה slot להשתמש נעשית **לפי סוג הטקסט ב-run** ולפי **דגל רמת הריצה ``**. בלי הדגל, Word יכול להתייחס לטקסט העברי כ-LTR (למשל כשהוא מתערבב עם ספרות/לטינית) ולבחור את `ascii` — Times New Roman. ## הפתרון מסמן כל run עברי כ-complex-script: ```python from docx.oxml import OxmlElement from docx.oxml.ns import qn def _mark_run_rtl(run): rPr = run._r.get_or_add_rPr() if rPr.find(qn("w:rtl")) is None: rPr.append(OxmlElement("w:rtl")) ``` וגם ברמת ה-paragraph (למקרה ש-paragraph mark עצמו משפיע): ```python def _mark_paragraph_rtl(paragraph): pPr = paragraph._p.get_or_add_pPr() rPr = pPr.find(qn("w:rPr")) if rPr is None: rPr = OxmlElement("w:rPr"); pPr.append(rPr) if rPr.find(qn("w:rtl")) is None: rPr.append(OxmlElement("w:rtl")) ``` ## תופעות לוואי של חוסר RTL ברמת ה-run 1. **Font fallback ל-Times New Roman** — הסימפטום הנפוץ ביותר. 2. **BiDi reordering של פיסוק** — נקודתיים, פסיקים, סוגריים עוברים למקום הלא נכון. הסימפטום: `"(א)"` הופך ל-`")א("`. 3. **מספרים "נוגדים" ברצף עברי** — `"בשנת 2024 פסקנו"` יכול להיראות עם המספר במיקום הלא נכון. ## איך לבדוק שה-RTL חל ```python from docx.oxml.ns import qn for p in doc.paragraphs: for r in p.runs: rPr = r._r.find(qn("w:rPr")) has_rtl = rPr is not None and rPr.find(qn("w:rtl")) is not None if not has_rtl and any('\u0590' <= c <= '\u05FF' for c in r.text): print(f"Missing RTL: {r.text[:40]!r}") ``` ## זה לא מספיק רק ברמת הסגנון זו תפיסה מוטעית נפוצה: "אם הסגנון כולל `` ב-`rPr`, ירש כל ריצה". **לא נכון**. סגנון נותן ברירת מחדל ל-runs שעדיין לא נוצרו ב-Word GUI — אבל runs שנוצרו דרך python-docx מקבלים `rPr` ריק, שלא תורש אוטומטית את ה-rtl מהסגנון. לכן חייבים להוסיף ידנית. ## הטמפלט של דפנה כדוגמה בוחנים את `word/document.xml` של הטמפלט המקורי — כל ריצה עברית כוללת: ```xml רקע ``` `` נמצא שם **במפורש**. אנחנו מחקים את זה.