macros

Abstände in Makros mit potenziell leerem tiefem Index

Ich habe das folgende Problem,dass die Abstände nicht ganz richtig sind:

Dies wird durch den folgenden LaTex-Code erzeugt:

\documentclass[a4paper, 12pt]{article}

\newcommand{\opens}[2][]{\restr{\mathcal{T}_{#2}}{#1}}
\newcommand{\restr}[2]{{\ifx\\#2\\ #1 \sonst #1|#2 \fi}}

\begin{document}

\begin{tabular}{ll}
Want this & Get this \\
$(\mathcal{T})$ & $(\opens{})$ \\
$(\mathcal{T}|X')$ & $(\opens[X']{})$ \\
$(\mathcal{T}_X|X')$ & $(\opens[X']{X})$ \\
\end{tabular}

\end{document}

Der Grund für den ungeraden Abstand scheint zu sein, dass ein leerer Index den Platz für das T verkleinert. Das Makro \opens soll unter verschiedenen Bedingungen funktionieren:

  • Wenn der optionale Parameter nicht leer ist (z. B. X' ), dann (und nur dann) sollte er diesen Parameter nach einem Balken anhängen (z . B. |X' ).
  • Wenn der Hauptparameter angegeben ist (z. B. X ), sollte er als Index für das T gesetzt werden.

Wie kann ich das \opens -Makro so zum Laufen bringen, dass es in allen Fällen den richtigen Abstand erzeugt?


Sie haben Recht,wenn eine tiefgestellte Schrift vorhanden ist,wird sie ohne Kursivkorrektur gedruckt und es wird keine Kursivkorrektur hinzugefügt.Wenn es keine tiefgestellte Schrift gibt,wird eine Kursivkorrektur hinzugefügt.Sie können Ihr Problem folgendermaßen lösen:

\newcommand{\opens}[2][]{\restr{\mathcal{T}\ifx\\#2\\ \else_{#2}\fi}{#1}}
\newcommand{\restr}[2]{{\ifx\\#2\\ #1 \else #1|#2 \fi}}



Schauen wir uns ein einfacheres Beispiel an:

\documentclass{article}
\usepackage{amsmath}

\pagestyle{empty}\showoutput

\begin{document}

$\mathcal{T})$

$\mathcal{T}_{X})$

$\mathcal{T}_{})$

\end{document}

Die entsprechenden Informationen in der Protokolldatei lauten

....\mathon
....\OMS/cmsy/m/n/10 T
....\kern2.54167
....\OT1/cmr/m/n/10 )
....\mathoff
[...]
....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(4.78334+0.0)x7.60211, shifted 1.49998
.....\OML/cmm/m/it/7 X
....\OT1/cmr/m/n/10 )
....\mathoff
[...]
....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(0.0+0.0)x0.5, shifted 1.49998
....\OT1/cmr/m/n/10 )
....\mathoff

Was können wir sehen? In der ersten Formel erscheint ein Kern zwischen dem T und der Klammer: Es ist die Kursivkorrektur, die TeX in bestimmten Fällen nach Buchstaben im mathematischen Modus hinzufügt. In der zweiten Formel erscheint kein solcher Kern, weil es einen Index gibt. Die Breite des Index enthält bereits den \scriptspace ; in der Tat, wenn wir \scriptspace auf Null setzen, erhalten wir

....\mathon
....\OMS/cmsy/m/n/10 T
....\hbox(4.78334+0.0)x7.10211, shifted 1.49998
.....\OML/cmm/m/it/7 X
....\OT1/cmr/m/n/10 )
....\mathoff

weil der Standardwert von \scriptspace 0.5pt ist.

In der dritten Formel wird nur der \scriptspace hinzugefügt, weil der Index da ist, obwohl er leer ist: ein bekannter Trick, um die Kursivkorrektur wegzulassen, aber in Ihrem Fall bringt er Sie ins Stolpern.

Sie müssen den tiefgestellten Index nur dann hinzufügen,wenn er nicht leer ist.

Ich bin mir nicht sicher,ob ich Ihre Syntax übernehmen würde:Das optionale Argument sollte meiner Meinung nach das mögliche Subskript von T sein,also werde ich Lösungen für beide Wege anbieten.

Nein \ifx\\#1\\ ; Ich schlage stattdessen die robusteren \IfValue(TF) und \IfBlank(TF) vor.

\documentclass{article}
\usepackage{amsmath}

% your syntax
\NewDocumentCommand{\opens}{om}{%
  \mathcal{T}\IfBlankF{#2}{_{#2}}% Basissymbol
  \IfValueT{#1}{\,|\,#1}% restr
}

% my syntax
\NewDocumentCommand{\egregopens}{om}{%
  \mathcal{T}\IfValueT{#1}{_{#1}}%
  \IfBlankF{#2}{\,|\,#2}%
}

\begin{document}

Your syntax

$(\opens{})$

$(\opens[X']{})$

$(\opens[X']{X})$

\bigskip

My syntax

$(\egregopens{})$

$(\egregopens{X'})$

$(\egregopens[X]{X'})$

\end{document}