En análisis no estándar, el operador de extensión no estándar * se utiliza con frecuencia. Sin embargo, componerlo no es sencillo porque la ubicación de * depende del símbolo a seguir. Por ejemplo, la extensión no estándar de los reales se escribe
^*{\mathbb{R}}
mientras que la extensión no estándar de una función real X suele estar tipográfica
^*\!{X}
Si no se incluye el espacio negativo \!
, el * y la X están demasiado separados.
Me gustaría separar el estilo del contenido en mi LaTeX, pero no está claro cómo definiría una macro que se expandiera adecuadamente según el contexto. Parecería que necesitaría dos macros: una en la que necesitaba un espacio negativo y otra en la que no. Pero esto no parece mucho mejor que agregar algo \!
al código. He visto publicaciones que sugieren el tensor
paquete, pero el espacio no es correcto.
EDITAR: Acepté una respuesta que permite especificar el espacio apropiado para letras particulares. Una versión LuaLateX es una versión más flexible de esta idea. El enfoque automático es impresionante y creativo, pero no ofrece la calidad necesaria para un documento tipográfico profesional. Ahora me inclino a pensar que es poco probable que un enfoque automático sea suficiente sin un conocimiento detallado de la fuente subyacente.
Respuesta1
Hasta que a alguien se le ocurra una buena solución, una de fuerza bruta podría ser:
\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}
Sólo necesita agregar un par dentro del \str_case:nn
segundo argumento si desea agregar una nueva letra y el espacio correspondiente para eliminar.
Respuesta2
ENFOQUE REVISADO
Los comentarios del OP indicaron que mi solución original, aunque quizás agradable de ver, dependía de cambiar la fuente matemática a ptmx, lo cual no era aceptable. Entonces, el problema parecía ser que el interletraje matemático de la fuente ptmx estaba bien, pero el de ComputerModern (CM) era inadecuado para la tarea actual.
Con eso en mente, decidí declarar el alfabeto matemático ptmx por separado yÚselo solo para posicionar los glifos CM. EDITADO para declarar un nuevo alfabeto matemático. Luego, cuando apilo *
encima/antes del argumento dado, uso la \mathptmx
versión del argumento (que acabo de declarar) para controlar el desplazamiento desde la mano derecha.
Para tener en cuenta los argumentos que no son glifos alfabéticos puros, comienzo con una prueba de código cat. En este MWE a continuación, puede ver mi enfoque en la línea superior, en comparación con la construcción cruda de ComputerModern $^*<letter>$
en la segunda línea.
EDITADO (8/2016) para funcionar en estilos matemáticos de subíndices, según una solicitud por correo electrónico de un lector. Para ello, utilizo la \ThisStyle{...\SavedStyle...}
función del scalerel
paquete para importar el estilo matemático a lugares donde de otro modo se perdería. REEDITADO para \leavevmode
manejar el caso de uso en \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}
ENFOQUE ORIGINAL (matemáticas ptmx)
Esto intenta alinear el * aproximadamente donde podría estar el extremo derecho de una f. La primera fila muestra el kerning que estaba intentando emular (el modelo); la segunda fila muestra la macro implementada; mientras que la tercera fila muestra cómo la macro logra su objetivo (el método, con *
el extremo derecho superpuesto de 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}
Respuesta3
Aquí hay una solución basada en LuaLaTeX, que configura una función Lua que ajusta el espacio entre el asterisco y la letra siguiente, donde la cantidad de ajuste depende de la forma de la letra.
El código define una macro LaTeX denominada \nsx
(abreviatura de "extensión no estándar") que antepone un asterisco al argumento de la macro, normalmente una letra mayúscula; el ajuste de espaciado predeterminado entre el asterisco y la letra es -4mu
. (Un espacio delgado negativo, \!
es igual a -3mu
). A continuación, el código configura una función Lua que anula la cantidad de ajuste predeterminada para las letras seleccionadas.
Consulte la siguiente tabla para conocer los montos de ajuste que he podido obtener para las 26 letras mayúsculas del alfabeto latino, así como para \mathbb{R}
y \Gamma
. Tenga en cuenta que estas cantidades de ajuste están optimizadas para las fuentes matemáticas "Computer/Latin Modern". Otras familias de fuentes probablemente requerirán cantidades de ajuste diferentes.
% !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}
Respuesta4
Este código también reconoce algunos tipos, basándose en la macro \binrel@
: operación binaria y relaciones (aunque no operadores).
\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}