Entfernen des Leerzeichens um den Punkt im qualifizierten Namen

Entfernen des Leerzeichens um den Punkt im qualifizierten Namen

Wie kann ich den Abstand um einen Punkt begrenzen, der kein Punkt ist (d. h. keinen Satz beendet)?

In meinem Dokument muss ich auf qualifizierte Namen verweisen (wie A.x). Derzeit setze ich diese als \texttt{A.x}. Dies erzeugt jedoch manchmal etwas Leerraum um den Punkt herum, beispielsweise im folgenden Ausschnitt:

Qualifizierter Name mit Leerzeichen.

Ich hätte gerne nur ein kleines bisschen Platz um das Punktsymbol, das die Teile des Namens trennt, aber alles, was ich finden konnte, bezog sich auf die Abstände im Mathematikmodus. Außerdem habe ich versucht, den Catcode vorübergehend .wie folgt auf 11 zu ändern:

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

dann verwenden \codename{A.x}. Das hat jedoch nicht geholfen.

Jede Hilfe wird wirklich geschätzt.

Antwort1

Sie können einen Befehl definieren:

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

Vergleichen Sie dann A.xmit \codename{A}{x}:

Bildbeschreibung hier eingeben

Durch die Verwendung \kernvon werden Zeilenumbrüche und Dehnungen vermieden. Sie können den Kerning-Faktor beliebig anpassen. Ich habe -.05emdie Länge auf beiden Seiten gewählt, aber in einer anderen Schriftart benötigen Sie möglicherweise unterschiedliche Längen davor und danach.

Antwort2

Das Hauptproblem des OP liegt meiner Ansicht nach darin, dass ihm die Tatsache nicht gefällt, dass \textttPunkte die gleiche Breite wie alle anderen Zeichen haben.

Hier verwende ich einen Token-Zyklus, um das Problem zu lösen. Ich durchsuche jedes Token des Arguments bis \codename. Jedes Mal, wenn ich ein finde ., ersetze ich es durch \nobreak{\textrm{.}}\nobreak. Das bedeutet, dass Codenamen mit mehreren Punkten für das Makro kein Problem darstellen.

Dadurch werden kontextbedingte Abstände durch Punkte vermieden und durch das Setzen der Punkte in \textrmwird die zusätzliche Breite des Punkts vermieden, selbst wenn \codenamein gesetzt ist \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}

Bildbeschreibung hier eingeben

verwandte Informationen