비표준 분석: 문맥에 따라 `^*` 조판

비표준 분석: 문맥에 따라 `^*` 조판

비표준 분석에서는 비표준 확장 연산자 *가 자주 사용됩니다. 그러나 *의 배치는 따라야 할 기호에 따라 달라지기 때문에 조판이 간단하지 않습니다. 예를 들어 실수의 비표준 확장이 작성됩니다.

^*{\mathbb{R}}

실제 함수 X의 비표준 확장은 일반적으로 조판됩니다.

^*\!{X}

음수 공백이 \!포함되지 않으면 *와 X의 간격이 너무 먼 것입니다.

음수 간격이 어떻게 보이는지

LaTeX의 콘텐츠와 스타일을 분리하고 싶지만 상황에 따라 적절하게 확장되는 매크로를 어떻게 정의해야 할지 명확하지 않습니다. 두 개의 매크로가 필요할 것 같습니다. 하나는 여백이 필요한 곳이고 다른 하나는 그렇지 않은 곳입니다. 그러나 이것은 \!코드를 추가하는 것보다 별로 좋지 않은 것 같습니다. 패키지를 제안하는 게시물을 본 적이 있지만 tensor공간이 정확하지 않습니다.

편집: 특정 문자에 적절한 간격을 지정할 수 있는 답변을 수락했습니다. LuaLateX 버전은 이 아이디어의 보다 유연한 버전입니다. 자동 접근 방식은 인상적이고 창의적이지만 전문적으로 조판된 문서에 필요한 품질을 제공하지 않습니다. 나는 이제 기본 글꼴에 대한 자세한 지식 없이는 자동 접근 방식이 충분하지 않다고 생각하는 경향이 있습니다.

답변1

누군가가 좋은 해결책을 내놓을 때까지 무차별적인 방법은 다음과 같습니다.

\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}

\str_case:nn새 문자를 추가하고 해당 공백을 제거하려면 두 번째 인수 안에 쌍을 추가하기만 하면 됩니다 .

여기에 이미지 설명을 입력하세요

답변2

개정된 접근법

OP의 의견에 따르면 내 원래 솔루션은 보기에는 좋지만 수학 글꼴을 ptmx로 변경하는 데 의존했지만 이는 허용되지 않았습니다. 그래서 문제는 ptmx 글꼴의 수학 커닝은 괜찮았지만 ComputerModern(CM)의 수학 커닝은 현재 작업에 부적절했다는 것 같았습니다.

그런 점을 염두에 두고 ptmx 수학 알파벳을 별도로 선언하기로 결정했고,CM 문자 위치를 지정하는 데에만 사용하십시오.. 새로운 수학 알파벳을 선언하도록 편집되었습니다. 그런 다음 *주어진 인수 이전에 스택을 쌓을 때 \mathptmx인수 버전(방금 선언한)을 사용하여 오른쪽으로부터의 오프셋을 제어합니다.

순수 알파벳 문자가 아닌 인수를 설명하기 위해 catcode 테스트부터 시작합니다. 아래 MWE에서 맨 위 줄에 있는 내 접근 방식과 $^*<letter>$두 번째 줄 의 원시 ComputerModern 구성을 비교한 것을 볼 수 있습니다 .

독자의 이메일 요청에 따라 아래 첨자 수학 스타일로 작업하도록 편집되었습니다(2016년 8월). 이를 위해 \ThisStyle{...\SavedStyle...}패키지 기능을 사용하여 scalerel수학 스타일을 손실될 수 있는 위치로 가져옵니다. \leavevmode의 사용 사례를 처리하기 위해 을(를) 다시 편집했습니다 \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}

여기에 이미지 설명을 입력하세요

원래 접근 방식(ptmx 수학)

이는 대략 f의 오른쪽 끝이 있을 수 있는 위치에 *를 정렬하려고 시도합니다. 첫 번째 행은 제가 모방하려고 했던 커닝(모델)을 보여줍니다. 두 번째 행은 구현된 매크로를 보여줍니다. 세 번째 행은 매크로가 목표를 달성하는 방법을 보여줍니다( *의 오른쪽 끝을 오버레이하는 방법 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}

여기에 이미지 설명을 입력하세요

답변3

다음은 별표와 후속 문자 사이의 간격을 조정하는 Lua 함수를 설정하는 LuaLaTeX 기반 솔루션입니다. 조정 정도는 문자 모양에 따라 다릅니다.

코드는 \nsx매크로 인수 앞에 별표(일반적으로 대문자)를 붙인 LaTeX 매크로("비표준 확장"의 약어)를 정의합니다. 별표와 문자 사이의 기본 간격 조정은 입니다 -4mu. (음수 씬스페이스 , \!는 과 같습니다 -3mu.) 다음 코드는 선택한 문자의 기본 조정 양을 재정의하는 Lua 함수를 설정합니다.

\mathbb{R}라틴 알파벳 대문자 26자와 및 에 대해 제가 생각해낸 조정 금액은 아래 표를 참조하세요 \Gamma. 이러한 조정 금액은 "컴퓨터/라틴 현대" 수학 글꼴에 최적화되어 있습니다. 다른 글꼴 모음에는 다른 조정 금액이 필요할 수 있습니다.

여기에 이미지 설명을 입력하세요

% !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} 

답변4

이 코드는 또한 매크로 \binrel@: 이진 연산 및 관계(연산자는 없음)를 기반으로 일부 유형을 인식합니다.

\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}

여기에 이미지 설명을 입력하세요

관련 정보