\noindent не имеет эффекта, если окружен маркерами bidi

\noindent не имеет эффекта, если окружен маркерами bidi

Почему xelatexв PDF-файле, полученном из следующей рукописи LaTeX, первая строка текста (на иврите) имеет отступ?

\documentclass{scrartcl}

\catcode8198=10 % Left-To-Right Mark
\catcode8199=10 % Right-To-Left Mark
\catcode8234=10 % Left-To-Right Embedding
\catcode8235=10 % Right-To-Left Embedding
\catcode8236=10 % Pop Directional Formatting

\usepackage{fontspec}
\setmainfont{Arial Hebrew}
\usepackage[rldocument]{bidi}

\begin{document}
\setRTL

‏‪\noindent‬ פְּרֶצְל מנסה לישון, על מנת להחיש את מהלך הזמן. אדם הולך לו לישון בשתים-עשרה, קם כעבור רגע, והנה השעה שבע בבוקר, ומתברר שהוא השתמש בשינה בתור סוס, לדלג על שבע שעות. תחבולה זו ידועה היטב לטבע. מה עושה הטבע נגדה? נותן לפרש הערמומי להירדם בשתים-עשרה, מציף אותו בהרבה סיוטים, וכשהפרש קם תשוש ומזיע ואומר לעצמו בחצי סיפוק "לפחות עברו שבע שעות," מייד קופץ שעונו ומורה שתים-עשרה ורבע. גם לא ישנת, בסיוטים סוייטת, וכל הלילה עוד לפניך.


\end{document}

Набранный вывод:

В набранном PDF-файле первая строка имеет отступ.

Примечание о невидимых маркерах двунаправленности (bidi)

Появляется \noindentперед всем текстом на иврите. \noindentОкружен маркерами bidi. Ему непосредственно предшествуют два маркера: Unicode Right-To-Left Mark (U+200F) и Left-To-Right Embedding (U+202A) в этом порядке; и сразу за ним следует маркер Pop Directional Formatting (U+202C). Таким образом, порядок символов следующий, слева направо:

U+200F, U+202A, \, n, o, i, n, d, e, n, t, U+202C, U+0020 (a space), <Hebrew text>

Чтобы лучше это представить, воспользуйтесь следующей иллюстрацией.

Легенда
⊳ ... Знак справа налево, U+200F (набирается как ⊲ внутри абзаца rtl)
⋉ ... Встраивание слева направо, U+202A
⋈ ... Форматирование направления Pop, U+202C

Каждый из этих символов был набран в окне редактора.послеинструкция, которую он представляет, вступила в силу.

Двунаправленный текст

решение1

Ваша проблема заключается в том, что вы помещаете U+200F в начало абзаца. Это токен catcode 12: 'other', и поэтому начинает абзац, вызывая вставку отступа абзаца и \everypar. Тот факт, что он не печатается, не имеет значения для TeX. \noindentПоэтому происходит после начала абзаца и вообще ничего не делает.

(Настройка catcode в начале документа, вероятно, не соответствует задуманному значению 8198 = U+2006= SIX-PER-EM SPACEи 8199 = U+2007= FIGURE SPACE.)

решение2

В общем случае некорректно присваивать элементам управления направлением Unicode код 10, поскольку в этом случае они не смогут контролировать форматирование и будут создавать аномальное пространство.

Рассмотрим строку

abc‮xyz‬123

То есть

  U+0061 LATIN SMALL LETTER A     a
  U+0062 LATIN SMALL LETTER B     b
  U+0063 LATIN SMALL LETTER C     c
  U+202e RIGHT-TO-LEFT OVERRIDE
  U+0078 LATIN SMALL LETTER X     x
  U+0079 LATIN SMALL LETTER Y     y
  U+007a LATIN SMALL LETTER Z     z
  U+202c POP DIRECTIONAL FORMATTING
  U+0031 DIGIT ONE     1
  U+0032 DIGIT TWO     2
  U+0033 DIGIT THREE     3

Если установлены коды котиков по умолчанию (12= "другие"), то

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Arial}
%\catcode"202E=10
%\catcode"202C=10
\begin{document}

abc‮xyz‬123
\end{document}

производит

введите описание изображения здесь

Какой порядок указан, соответствующий отображению в браузере, но если вы раскомментируете объявления, чтобы сделать элементы управления catcode 10, то вы получите

введите описание изображения здесь

без изменения направления и с ложным пространством.

Связанный контент