
Я читал ответы на вопросы по латексу в прошлом, чтобы решить проблему, с которой я столкнулся. Я использую шрифт, содержащий символы, и сопоставляю символы с командой latex. Для этого MWE вы можете использовать любой шрифт с символами, которые могут отсутствовать в наборе латинских символов.Здесьтот, который я использую (я просто изменил имя файла на Symbols.otf), издесьесть некоторая документация для него, включая команды XeLaTeX. Эта часть работает отлично:
\documentclass[10pt,twoside]{book}
\makeatletter
\newfontface\honourific[Path = ./fonts/]{Symbols.otf}
\newcommand{\hn}[1]{{\honourific\XeTeXglyph #1}}
\newcommand{\RahimahumuLlah}{{\large\hn{83}\kern0.25em}}
\begin{document}
...and a similar statement has been reported as being the view of Imām Mālik Ibn Anas \RahimahumuLlah.
\begin{document}
Теперь, когда я пытаюсь использовать его \firstcommand
в наборе, он работает, однако, когда есть точка, запятая, двоеточие, точка с запятой или другой знак препинания, после символа может быть намного больше или намного меньше места, чем нужно. Вот почему я установил кернинг по умолчанию на 0,25em, что отлично подходит для большинства ситуаций. Я хочу настроить его так, чтобы он проверял, есть ли подходящий знак препинания сразу после символа (точка, запятая, двоеточие...), и если да, то применял кернинг 0,05em.
Я наткнулся на некоторые обсуждения команды @ifnextchar, в частностиэта темакоторый начался вэтотсообщение на форуме. Я попытался реализовать окончательный ответ автора форума в своем коде, но обнаружил, что он не оценивает ни истинные, ни ложные условия.
Если бы вы могли дать разъяснения относительно того, как реализовать этот или любой другой метод условного кернинга, я был бы очень признателен.
Спасибо
Редактировать:
Хорошо, я провел некоторые тесты и, возможно, сузил проблему. Использование xspace не работает, как и ручной запуск условных операторов для обнаружения знаков препинания. Я использовал этот код, чтобы попытаться найти, где была моя проблема:
\makeatletter
\newcommand{\punctuationcheck}{%
\@ifnextchar){parens\relax}{%
\@ifnextchar]{square bracket\relax}{%
\@ifnextchar.{fullstop\relax}{%
\@ifnextchar,{comma\relax}{space
}%
}%
}%
}%
}
\makeatother
Когда я запускаю этот код, он не обнаруживает запятую и вместо этого просто вставляет слово «пробел», независимо от того, есть ли пробел после запятой или нет. Я посмотрел на ответздесьи он отметил использование {}
команд after для сохранения пробелов по мере необходимости. Я попробовал это, и это сработало. Теперь проблема в том, как заставить LaTeX добавлять a {}
после каждой моей пользовательской команды, чтобы мне не приходилось помнить об этом, когда я печатаю свой документ?
Редактировать 2: Решено
Таким образом, оказывается, что место, где вы размещаете \xspace
команду в определении, действительно имеет значение.
Первый случай:
\newcommand{\RahimahumuLlah}{{\large\hn{83}\xspace}}
Я не видел, чтобы команда работала. Я переместил команду прямо перед последней скобкой:
\newcommand{\RahimahumuLlah}{{\large\hn{83}}\xspace}
И это работает.
решение1
Вы можете скопировать xspace
код пакета, который делает именно это, за исключением того, что он добавляет обычный пробел, а не ваш кернинг.