Nicht standardmäßige Analyse: `^*` je nach Kontext setzen

Nicht standardmäßige Analyse: `^*` je nach Kontext setzen

In der nicht-standardmäßigen Analysis wird häufig der nicht-standardmäßige Erweiterungsoperator * verwendet. Sein Satz ist allerdings nicht einfach, da die Platzierung von * vom folgenden Symbol abhängt. Die nicht-standardmäßige Erweiterung der reellen Zahlen wird beispielsweise wie folgt geschrieben:

^*{\mathbb{R}}

während die nicht standardmäßige Erweiterung einer realen Funktion X typischerweise

^*\!{X}

Wenn der Negativraum \!nicht berücksichtigt wird, sind die Abstände zwischen * und X zu groß.

So sieht negativer Abstand aus

Ich möchte in meinem LaTeX Stil und Inhalt trennen, aber es ist nicht klar, wie ich ein Makro definieren würde, das im Kontext angemessen erweitert wird. Es scheint, als bräuchte ich zwei Makros – eines, wenn ich ein Leerzeichen brauche, und ein anderes, wenn ich es nicht brauche. Aber das scheint nicht viel besser zu sein, als \!den Code zu ergänzen. Ich habe Beiträge gesehen, die das tensorPaket vorschlagen, aber das Leerzeichen ist nicht korrekt.

EDIT: Ich habe eine Antwort akzeptiert, die es einem ermöglicht, den entsprechenden Abstand für bestimmte Buchstaben festzulegen. Eine LuaLateX-Version ist eine flexiblere Version dieser Idee. Der automatische Ansatz ist beeindruckend und kreativ, liefert aber nicht die Qualität, die für ein professionell gesetztes Dokument erforderlich ist. Ich neige mittlerweile zu der Annahme, dass ein automatischer Ansatz ohne detaillierte Kenntnisse der zugrunde liegenden Schriftart wahrscheinlich nicht ausreichen wird.

Antwort1

Bis jemand eine gute Lösung findet, könnte eine Lösung mit roher Gewalt so aussehen:

\documentclass{scrartcl}
\usepackage{xparse,dsfont}

\ExplSyntaxOn
\NewDocumentCommand \nsext { m }
 {
  {\vphantom{#1}}
  \sp
   {
    *
    \str_case:nn {#1}
     {
      { X } { \mskip-3mu }
      { A } { \mskip-6mu }
     }
   }
  #1
 }
\ExplSyntaxOff

\newcommand*{\R}{\mathds{R}}

\begin{document}
$\nsext\R \quad \nsext X \quad \nsext V \quad \nsext A$
\end{document}

Sie müssen nur ein Paar innerhalb des zweiten Arguments hinzufügen, \str_case:nnwenn Sie einen neuen Buchstaben und das entsprechende zu entfernende Leerzeichen hinzufügen möchten.

Bildbeschreibung hier eingeben

Antwort2

ÜBERARBEITETER ANSATZ

Kommentare des OP wiesen darauf hin, dass meine ursprüngliche Lösung, obwohl sie vielleicht schön anzusehen war, darauf beruhte, die mathematische Schriftart in ptmx zu ändern, was nicht akzeptabel war. Das Problem schien also zu sein, dass das mathematische Kerning der ptmx-Schriftart in Ordnung war, das von ComputerModern (CM) jedoch für die aktuelle Aufgabe unzureichend war.

Vor diesem Hintergrund habe ich beschlossen, das ptmx-Mathealphabet separat zu deklarieren undVerwenden Sie es nur zur Positionierung der CM-Glyphen. BEARBEITET, um ein neues mathematisches Alphabet zu deklarieren. Wenn ich dann das über/vor dem angegebenen Argument stapele *, verwende ich die \mathptmxVersion des Arguments (die ich gerade deklariert habe), um den Versatz von rechts zu bestimmen.

Um Argumente zu berücksichtigen, die keine reinen alphabetischen Glyphen sind, beginne ich mit einem Catcode-Test. In diesem MWE unten sehen Sie meinen Ansatz in der ersten Zeile, verglichen mit der Rohkonstruktion von ComputerModern $^*<letter>$in der zweiten Zeile.

BEARBEITET (8/2016), um mit tiefgestellten mathematischen Stilen zu arbeiten, gemäß einer E-Mail-Anfrage eines Lesers. Dazu verwende ich die \ThisStyle{...\SavedStyle...}Funktion des scalerelPakets, um den mathematischen Stil an Stellen zu importieren, an denen er sonst verloren gehen würde. NEU BEARBEITET, um \leavevmodeAnwendungsfälle in zu behandeln \substack.

\documentclass{article}
\usepackage{amssymb,stackengine,xcolor,scalerel,mathtools}
\stackMath
\def\nsa#1{\leavevmode\ThisStyle{%
\def\stackalignment{r}\def\stacktype{L}%
\ifcat A#1
  \mkern-6.5mu\stackon[0pt]{\SavedStyle\phantom{f}#1}  
    {\SavedStyle^*\mkern-1.1mu\phantom{\mathptmx{#1}}}%
\else
  \mkern-4mu\stackon[0pt]{\SavedStyle\phantom{f}#1}  
    {\SavedStyle^*\mkern-1.7mu\phantom{#1}}%
\fi
}}
\def\R{\mathbb{R}}
\DeclareMathAlphabet{\mathptmx}{OML}{ztmcm}{m}{it}
\parskip 1ex
\begin{document}
\centering
$(\nsa\R) ~ (\nsa V) ~ (\nsa X) ~ (\nsa A) ~ (\nsa M)$

vs.

$(^*\R) ~ (^*V) ~ (^*X) ~ (^*A) ~ (^*M)$

\hrulefill

Other cases requiring EDIT to \textbackslash nsa:

$(x_n)_{n\in\nsa{\mathbb N}}$. 

$\bigcup_{\substack{U\subseteq X\\ \nsa U\subseteq \mathrm{Fin}(\nsa X)}}$
\end{document}

Bildbeschreibung hier eingeben

URSPRÜNGLICHER ANSATZ (ptmx-Mathematik)

Dadurch wird versucht, das * ungefähr dort auszurichten, wo das rechte Ende eines f sein könnte. Die erste Zeile zeigt das Kerning, das ich zu emulieren versuchte (das Modell); die zweite Zeile zeigt das implementierte Makro; während die dritte Zeile zeigt, wie das Makro sein Ziel erreicht (die Methode mit *überlagerndem rechten Ende von f).

\documentclass{article}
\usepackage{amssymb,mathptmx,stackengine,xcolor}
\stackMath
\def\nsa#1{\def\stackalignment{r}\def\stacktype{L}%
  \mkern-1mu\stackon[0pt]{\mkern-2mu\phantom{f}#1}{^*\mkern-1.7mu\phantom{#1}}}
\def\R{\mathbb{R}}
\begin{document}
$ f\R ~fV ~fX ~fA$ The model

$\nsa\R ~ \nsa V ~ \nsa X ~ \nsa A$ The macro

\def\nsa#1{\def\stackalignment{r}\def\stacktype{L}%
  \mkern-1mu\stackon[0pt]{\color{cyan}\mkern-2mu f#1}{^*\mkern-1.7mu #1}}
$\nsa\R ~ \nsa V ~ \nsa X ~ \nsa A$ The method
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Hier ist eine auf LuaLaTeX basierende Lösung, die eine Lua-Funktion einrichtet, die den Abstand zwischen dem Sternchen und dem nachfolgenden Buchstaben anpasst, wobei der Anpassungsgrad von der Form des Buchstabens abhängt.

Der Code definiert ein LaTeX-Makro mit dem Namen \nsx(kurz für „nonstandard extension“ – nicht standardmäßige Erweiterung), das dem Argument des Makros ein Asterisk voranstellt – normalerweise ein Großbuchstabe; die Standardabstandsanpassung zwischen Asterisk und Buchstabe ist -4mu. (Ein negativer Thinspace, \!, entspricht -3mu.) Der Code richtet als Nächstes eine Lua-Funktion ein, die den Standardanpassungswert für ausgewählte Buchstaben überschreibt.

In der folgenden Tabelle finden Sie die Anpassungswerte, die ich für die 26 Großbuchstaben des lateinischen Alphabets sowie für \mathbb{R}und ermitteln konnte \Gamma. Beachten Sie, dass diese Anpassungswerte für die mathematischen Schriftarten „Computer/Latin Modern“ optimiert sind. Für andere Schriftfamilien sind wahrscheinlich andere Anpassungswerte erforderlich.

Bildbeschreibung hier eingeben

% !TEX TS-program = lualatex
\documentclass{article}

\newcommand\nsx[2][4]{{}^{*}\mkern-#1mu#2}  % default neg. space: 4mu

\usepackage{amsfonts,array,booktabs} % just for this example

\usepackage{luacode,luatexbase}
\begin{luacode}
function adjust_ns ( line )
    if string.find ( line, "\\nsx" ) then
       line = string.gsub ( line, "\\nsx{([AJ])}", "\\nsx[6.5]{%1}" )
       line = string.gsub ( line, "\\nsx{([X])}", "\\nsx[4.5]{%1}" )
       line = string.gsub ( line, "\\nsx{([SZ])}", "\\nsx[3.5]{%1}" )
       line = string.gsub ( line, "\\nsx{([CGOQUVW])}", "\\nsx[2.5]{%1}" )
       line = string.gsub ( line, "\\nsx{([Y])}", "\\nsx[1.5]{%1}" )
       line = string.gsub ( line, "\\nsx{([T])}", "\\nsx[1]{%1}" )
       line = string.gsub ( line, "\\nsx{\\mathbb{R}}", "\\nsx[1.5]{\\mathbb{R}}" )
       line = string.gsub ( line, "\\nsx{\\Gamma}", "\\nsx[2]{\\Gamma}" )
    end
    return  line
end
luatexbase.add_to_callback ( "process_input_buffer", adjust_ns, "adjust_ns" )
\end{luacode}

\begin{document}

\noindent
\begin{tabular}{@{} >{$}l<{$} l @{}}
$Letter$ & Adjustment (in ``mu'')\\
\midrule
\nsx{B}\nsx{D}\nsx{E}\nsx{F}\nsx{H}\nsx{I}\nsx{K}\nsx{L}\nsx{M}\nsx{N}\nsx{P}
\nsx{R} & 4 (default)\\
\nsx{A}\nsx{J} & 6.5\\
\nsx{X} & 4.5\\
\nsx{S}\nsx{Z} & 3.5\\
\nsx{C}\nsx{G}\nsx{O}\nsx{Q}\nsx{U}\nsx{V}\nsx{W} & 2.5 \\
\nsx{Y} & 1.5 \\
\nsx{T} & 1 \\
\nsx{\mathbb{R}} & 1.5 \\
\nsx{\Gamma} & 2 \\
\end{tabular}
\end{document} 

Antwort4

Dieser Code erkennt auch einige Typen, basierend auf dem Makro \binrel@: binäre Operationen und Beziehungen (allerdings keine Operatoren).

\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}

\makeatletter
\DeclareRobustCommand{\nsext}[1]{%
  \binrel@{#1}% compute the type
  \binrel@@{%
    {\vphantom{#1}}^*% the asterisk at the proper height
    \kern-\scriptspace % remove the script space
    \csname mkern@\detokenize{#1}\endcsname % additional kerning
    {#1}% the symbol
  }%
}
\newcommand{\defineextkern}[2]{%
  \@namedef{mkern@\detokenize{#1}}{\mkern#2}%
}
\makeatother

% define some additional kerning
\defineextkern{X}{-3mu}
\defineextkern{\in}{-2mu}

\begin{document}

$x\nsext{\in}\nsext{\mathbb{R}}$

$\nsext{X}_{x\nsext{\in}\nsext{X}}$

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen