⚠ שימו לב!

הדף שאתם קוראים לקוּח מארכיון האתר „מילים דיגיטליות”.
לאתר במתכונתו החדשה לחצו כאן.

רשומות אחרונות
21 בספטמברהאק לכתיבה בעברית עם החבילה "multicol" ל־LaTeX
18 באפריל'מעבדי־תמלילים: טיפשיים ולא יעילים'
עיון בארכיון הרשומות
קריאת רשומה אקראית

Articles tagged with TeX

האק לכתיבה בעברית עם החבילה "multicol" ל־LaTeX
‎2006·09·21‏

(השינויים ב־multicol.sty מופיעים בסוף הפוסט. אם כל מה שאתם רוצים זו גרסה של multicol שתומכת טוב בעברית, בלי לקרוא את כל ה־yada yada שלפני, דלגו לשם.)

לטעמי, טקסט בשתי עמודות נראה הרבה יותר טוב מכזה שמסודר בעמודה אחת, לפחות בכל האמור בטקסטים שמודפסים על A4. הרוחב של A4 עם שוליים נורמליים עדיין רחב מדי, ואלא אם כן משתמשים ברווח כפול (ואז כל שורה בוטלת בפני עצמה ואין בעיה לעקוב), יש צורך בטרחה תמידית לעקוב אחרי "באיזו שורה אני?". הפתרון הנוח ביותר הוא לקצר את השורות, ולהשתמש בשתי עמודות. כך גם דף שיש בו פסקאות מאוד קצרות לא נראה לא מאוזן - הקיטוע של הפסקה באמצע לא בולט מדי בטקסט עם שתי עמודות, שהרי בכל מקרה כל עמודה היא די קצרה. זה גם חוסך, בסופו של דבר, מקום על הדף: שורות קצרות (בין אם כאלה שמהוות פסקאות קצרות ובין אם כאלה שמסיימות פסקה) מבזבזות פחות מקום כשיש שתי עמודות (ה־tradeoff בחיסכון במקום הוא כמובן הרווח שצריך לשים בין העמודות; בסופו של דבר כתיבה בשתי עמודות "משתלמת"*).

* לפחות עבור הטקסטים שאני כותב. יכול להיות שבמקרה של סופר שכותב פרוזה עם פסקאות מאוד ארוכות כתיבה בעמודה אחת תהיה עדיפה (התשלום על הריווח שבין העמודות יהיה גדול מהרווח שיש בניצול טוב יותר של הדף בשורות קצרות). בכל מקרה, זה לא רלוונטי: זה לא מקובל, מבחינת הנורמות הטיפוגראפיות, לכתוב פרוזה בשתי עמודות; זה בעיקר טקסטים מדעיים (ועיתונים/מגזינים, אבל זה כבר עניין אחר ושם משתמשים ביותר משתי עמודות הרבה פעמים, ובזרימה מיוחדת של הטקסט, שצריכה להתחשב בגורמים נוספים. סידור של עיתונים זו אומנות אחרת...) שמשתמשים בהם בשתי עמודות.

לכן, זה די טבעי שארצה לכתוב בשתי עמודות, ב־LaTeX (לאטעך). amama (איך בכלל כותבים את זה בעברית??), twocolumn הסטנדרטי די פרימיטיבי ולא נוח, ו־multicol לא תומך בכתיבה מימין לשמאל (הוא מסדר את העמודות כך שהראשונה לוגית, זו עם הטקסט המקודם יותר, תהיה בקצה השמאלי, וממשיך הלאה ימינה). מצד שני, multicol הוא החבילה האולטימטיבית לכתיבה בכמה עמודות: אפשר לעבור בקלות בין כתיבה בעמודה אחת וכתיבה בכמה, סיום של של מקטע של כמה עמודות מסודר כך שהוא יתפוס פחות מקום, אפשר לשלוט בקלות על הריווח שבין העמודות, ואפשר לבחור בכמה עמודות להשתמש.
את הבעיה הזו, ש־multicol לא תומך בסידור מימין לשמאל, פתר (לפחות פתרון ראשוני) איש נחמד בשם צפריר כהן (וזה מקום להודות לו על מה שהוא עשה לפיתוח של התמיכה העברית ב־LaTeX :-) ). הוא כתב האק (hack) שבודק "אם אני בסביבה של כתיבה מימין לשמאל (rl@), תחליף בבקשה את הסדר של העמודות". לפתרון שלו יש שלוש בעיות:

  1. הבדיקה "אם אני נמצא בסביבה של כתיבה מימין לשמאל" נעשית בכל עמוד. נתאר לעצמנו את הסיטואציה הבאה: אנחנו כותבים בעברית, בשתי עמודות. כותבים כותבים כותבים ואז רוצים, בתוך הרצף של הטקסט, לצטט טקסט בקוריאנית, שנכתב משמאל לימין. עכשיו, קרה מקרה וחלק מהטקסט נמצא בעמ' n וההמשך שלו בעמ' n+1. מה ההאק של צפריר יעשה? בעמ' n+1 הוא יגיד "הא! אני לא נמצא בסביבה של כתיבה מימין לשמאל אלא בכזו שמשמאל לימין! הבה אסדר את העמודות כך שהראשונה לוגית תהיה משמאל". זה כמובן דבר שאנחנו לא רוצים, שפתאום באמצע הטקסט הסידור של העמודות ישתנה בלי להודיע מראש. אני הבנתי את הבעיה הזו (אחרי שהשתמשתי כמה זמן בהאק של צפריר) בדרך הקשה: אני מנסה לקרוא משהו שכתבתי, ולרגע מאבד את הידים והרגליים. אני בטוח שיש מקרים שבהם שינוי־סדר כזה יכול להניב תוצאות משעשעות במיוחד אם קוראים את הטקסט ברצף...
  2. באופן שבו צפריר מחליף בין עמודות יש באג שגורם לפעמים - לא הבנתי אף פעם מתי, באלו מקרים - לזה שהקומפיילר של LaTeX נתקע עם לוף אינסופי של הודעות overfull \vbox.
  3. יש תמיכה רק בשתי עמודות. מעבר לזה הסדר מתבלגן, כך שבמקום א-ב-ג מתקבל ב-א-ג (pun intended).

את הבעיה הראשונה פתרתי פעם על־ידי שינוי של "אם אני בסביבה של כתיבה מימין לשמאל (rl@)" ל"בכל מקרה (iftrue\)", מה שאמנם פתר את הבעיה, אבל לא אפשר לסדר עמודות גם מימין לשמאל וגם משמאל לימין באותו הקובץ. עכשיו אני כותב טקסט שבו אני רוצה שחלק ממנו יופיע בסידור עמודות מימין לשמאל (גוף הטקסט, שכתוב בעברית) וחלק יופיע בסידור משמאל לימין (נספח שיש בו תרגום, מאנגלית עתיקה, באופן שצריך להיות מסודר לפי הטקסט המקורי, משמאל לימין). הפשלתי שרוולים והתחלתי לחטט בקוד של multicol.sty. את שתי הבעיות הראשונות פתרתי באופן מלא (אם כי כזה שהוא לא קומפטבילי עם multicol הישן, לגבי הבעיה הראשונה) ואת הבעיה השלישית פתרתי באופן חלקי (אפשר לסדר שתיים או שלוש עמודות, אבל מעבר לזה זה מתחרבש).

  1. את הבדיקה לפי הסביבה של IvriTeX החלפתי בבדיקה של משתנה שהגדרתי, multicolisrtl. אם הערך שלו 1, סדר ימין לשמאל נמצא בשימוש, ואם 0, שמאל לימין. זה דורש לפני ההתחלה של ה־environment של multicol להגדיר ל־multicolisrtl ערך, כך:

    \def\multicolisrtl{1}
    xor
    \def\multicolisrtl{0}

    פשוט, טריוויאלי ונוח. כמובן שאם לא משנים את הערך, הוא נשאר גם לסביבות ה־multicol הבאות. כדי למנוע "באגים" בקוד ה־LaTeX שלכם, שנובעים מזה ש־multicolisrtl שונה אי־שם קודם בקובץ ושכחתם להחזיר אותו לערך הנכון, אני חושב שכדאי להגדיר לו את הערך לפני כל התחלה של סביבת־multicol, אלא אם כן אתם בטוחים בעצמכם שלא תתבלבלו.

  2. את הבעיה השניה היה ממש קל לפתור: במקום ליצור הקוד של מעבר העמודות ששונה מאוד מזה ה־LTR־י (מה שנראה שצפריר עשה, אלא אם כן multicol פעם היה מאוד שונה), פשוט לקחתי את זה המקורי, ושיניתי בו את החלקים הרלוונטיים. זה פתר את הבאג.
  3. כאן עשיתי משהו מלוכלך. היה ברור שהבעיה עם הסדר של עמודות, כשיש יותר משתיים, היא במשהו שקשור לקאונטר שרץ שם ועובר עמודה-עמודה. אני מודה שזה לא לגמרי לגמרי ברור לי מה הולך שם, אבל שמתי לב שאם בכל איטרציה אני מגדיל את הערך של הקאונטר בשניים אחרי שזורקים את העמודה הקודמת אל ה־output, הפלא ופלא זה עובד טוב גם עם שתי עמודות וגם עם שלוש (מעבר לזה יש תוצאות random־יות מאוד: ריווח מיותר, סדר־עמודות מוזר ושאר דברים לא צפויים). אל תשאלו אותי איך זה עובד, אבל בפועל זה ככה. Pure magic.

אז הנה הרגע שכולם חיכו לו, הקוד עם השינוי! קראתי לחבילה החדשה bidimulticol, על משקל hmulticol של צפריר (הרי אין כאן שום הגבלה לעברית; כל כתב RTL־י אמור להסדר עם זה מצויין); כך אפשר עדיין לקמפל קבצים שתואמים ל־hmulticol של צפריר, בלי צורך לעשות שינויים לאחור. הנה ה־diff עבור גרסת ה־multicol שיש אצלי (1.6e), והנה הקובץ עם השינויים.
כדי להתקין את זה, צריך שהקובץ bidimulticol.sty (בין אם יצרתם אותו בעזרת הפאץ' ובין אם פשוט הורדתם אותו) יהיה בספריה tex/latex/tools בעץ ה־texmf שלכם (זה המקום שבו נמצא multicol.sty). ב־teTeX ב־FreeBSD, לדוגמה, ה־path המלא הוא usr/local/share/texmf-dist/tex/latex/tools/. אחרי זה צריך להריץ mktexlsr כ־root ואז כיוזר, כדי ש־LaTeX יכיר בשינויים. אני מניח שאין שום סיבה שזה לא יעבוד ב־MiKTeX או בלאטעכים אחרים, אבל אני מכיר רק את teTeX. אם מישהו צריך עזרה בהתקנה, הודיעוני בתגובה כאן או דאלוני.

זהו, אני מקווה שזה יביא תועלת למישהו... זה מסקרן לדעת כמה אנשים משתמשים ב־LaTeX בעברית; אני מכיר כמה אישית, אבל אין לי מושג כמה יש out there.