Удаление пробела вокруг точки в полном имени

Удаление пробела вокруг точки в полном имени

Как ограничить пробел вокруг точки, которая не является точкой (т. е. не завершает предложение)?

В моей статье мне нужно ссылаться на квалифицированные имена (например, A.x). В настоящее время я набираю их как \texttt{A.x}. Однако иногда это создает некоторое пространство вокруг точки, например, в следующем фрагменте:

Квалифицированное имя с пробелами.

Я хотел бы иметь только крошечный пробел вокруг символа точки, разделяющего части имени, но все, что я смог найти, было связано с пробелами в математическом режиме. Кроме того, я попытался временно изменить catcode на .11, как показано ниже:

\newcommand{\codename}[1]{
  \begingroup
  \catcode`.=11
  \texttt{#1}
  \endgroup
}

затем с помощью \codename{A.x}. Однако это не помогло.

Любая помощь будет оценена по достоинству.

решение1

Вы можете определить команду:

\newcommand{\codename}[2]{#1\kern-.05em.\kern-.05em#2}

Затем сравните A.xс \codename{A}{x}:

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

Использование \kernпредотвратит разрывы строк и растяжения. Вы можете настроить коэффициент кернинга так, как вам нравится. Я выбрал -.05emдлину с обеих сторон, но в другом шрифте вам могут понадобиться разные длины до и после.

решение2

Я вижу, что главная проблема автора поста в том, что ему не нравится тот факт, что \textttточки имеют ту же ширину, что и все остальные символы.

Здесь я использую цикл токенов для решения проблемы. Я просматриваю каждый токен аргумента \codename. Каждый раз, когда я нахожу ., я заменяю его на \nobreak{\textrm{.}}\nobreak. Это означает, что кодовые имена с несколькими точками не являются проблемой для макроса.

Это позволит избежать пробелов, вносимых точками в результате контекста, а установка точек в \textrmпозволит избежать дополнительной ширины точки, даже если \codenameустановлено в \texttt.

\documentclass{article}
\usepackage{tokcycle}
\Characterdirective{\ifx.#1\addcytoks{\nobreak{\textrm{.}}\nobreak}\else
  \addcytoks{#1}\fi}
\newcommand\codename[1]{\tokencyclexpress#1\endtokencyclexpress}
\begin{document}
Here is \codename{A.1} code name.
Code names such as \texttt{\codename{A.2.4}}, can contain multiple dots!
By setting the dots in textrm, extra spacing is avoided even if the 
codename is set in texttt.
\end{document}

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

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