
Я хочу сообщить latex, что можно прерывать строки на символах ZWNJ (U+200C), если это необходимо. Как мне изменить шаблоны переноса строк (дефисы), чтобы разрешить это?
\hyphenation у меня не работает и выдает ошибку «Не буква...», когда ввод содержит ZWNJ.
Пример (компиляция с помощью xelatex):
\documentclass{book}
\usepackage{xepersian}
\settextfont{XB Niloofar}
\begin{document}
شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده
\end{document}
решение1
Ошибку переноса можно избежать, присвоив \lccode
символу значение, отличное от 0.
Тогда могло бы сработать что-то вроде этого (но поскольку я не могу прочитать сценарий...):
\documentclass{book}
\usepackage{xepersian}
\settextfont[HyphenChar="200B]{XB Niloofar} %don't show hyphenchar
\lccode`^^^^200c=`^^^^200c
\hyphenation{شخصی--سازی--شده}
\begin{document}
شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده
\end{document}
Вы также можете установить ZWJN в качестве символа дефиса:
\documentclass{book}
\usepackage{xepersian}
\settextfont[HyphenChar="200C]{XB Niloofar}
\begin{document}
شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده
\end{document}
решение2
Чтобы разрешить переносы строк в ZWNJ, вы можете добавить туда дискреционные значения, так что вместо "чистого" WNJ вы можете ввести \discretionary{}{}{^^^^200c}
разрешение переносов строк. Конечно, переписывание всего документа потребовало бы много работы, поэтому вы можете указать XeTeX всегда вставлять эту последовательность, когда он встречает ZWNJ, сделав ZWNJ активным и назначив его \discretionary{}{}{^^^^200c}
в качестве замены. newunicodechar
Пакет делает это просто:
\usepackage{xepersian}
\usepackage{newunicodechar}
\settextfont{Shabnam.ttf}
\newunicodechar{^^^^200c}{\discretionary{}{}{^^^^200c}}
\begin{document}
\showthe\hyphenchar\font
شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده شخصیسازیشده
\end{document}
(Предполагается, что вы хотите, чтобы TeX избегал разрывов, если в этом нет необходимости (например, при расстановке переносов), но при этом вы не хотите вставлять переносы.)
решение3
У меня нет доступа к вашим шрифтам, поэтому я покажу на примере другого символа Unicode то, что я имею в виду.
Я использую свой новый tokcycle
пакет, который был выпущен только вчера:https://www.ctan.org/pkg/tokcycle. В такой задаче вы можете рассматривать пакет как прославленный потоковый редактор, работающий с токенами LaTeX.
Здесь я ищу каждый последующий токен в потоке. Если он соответствует указанному символу unicode (здесь ⁊
), он помещает что-то другое в выходной поток. В первом случае он помещает (Hi Mom)
в выходной поток. Во втором случае он помещает \-
в выходной поток a, который является дискреционным дефисом.
И, как вы заметите, tokcycle
может правильно обрабатывать пробелы, макросы и группы, даже работая за пределами границ разделов.
\documentclass{article}
\usepackage{fontspec,tokcycle}
\setmainfont{Segoe UI Symbol}
\begin{document}
\Characterdirective{\ifx⁊#1\addcytoks{(Hi Mom)}\else\addcytoks{#1}\fi}
\tokencyclexpress vi⁊-a-viz\endtokencyclexpress
\Characterdirective{\ifx⁊#1\addcytoks{\-}\else\addcytoks{#1}\fi}
\tokencyclexpress xxxxx vi⁊antium vi⁊antium vi⁊antium vi⁊antium vi⁊antium vi⁊antium
vi⁊antium vi⁊antium vi⁊antium vi⁊antium vi⁊antium
\section{Works across section boundaries!!}
Blah blah blah\endtokencyclexpress
\end{document}