\dots 인식 명령 정의

\dots 인식 명령 정의

편집하다:프랑스 바벨의 문제를 보여주기 위해 MWE를 변경했습니다.

그래서 TeX.sx에 대해 궁금해하다가 이런 질문을 받게 되었습니다. amsmath에서 Magic \dots는 어떻게 작동하나요?, 나는 동일한 작업을 수행하고 싶었습니다( \dots-aware 매크로 사용).

\documentclass{minimal}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage[french]{babel}

\renewcommand*{\to}{%
    \DOTSB
    \myto
}
\NewDocumentCommand{\myto}{o}{%
    \IfValueTF{#1}{%
        \xrightarrow{#1}%
    }{%
        % default latex \to
        \mathchar"3221
    }%
}

\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}

하지만 점은 적응하지 않습니다. 나는 그랬다:

texdef -t latex -p amsmath DOTSB

그리고 분명히 \DOTSB이고 \relaxamsmath.sty 파일이 이를 확인합니다. 누구든지 이것에 대한 해결책을 가지고 있습니까?

편집하다: 다른 두 솔루션 splitamsmath.

답변1

french의 모듈 에 버그가 있습니다 babel. 명령 \dots은 다음과 같이 재정의됩니다.

\relax\csname\ifmmode M\else T\fi dots@\endcsname

그래서 수학 모드에서는 \Mdots@로 확장되는 것이 실행됩니다. \@xp\mdots@이는 잘못된 것입니다. 단순히 이어야 합니다 \mdots@. 실제로 패치를 적용하면 \dots예상되는 결과가 나타납니다.

\documentclass{article}

\usepackage{amsmath}
\usepackage{xparse}
\usepackage[french]{babel}
\usepackage{xpatch}

% the redefinition of \dots happens at begin document
% we simply remove one step: instead of the faulty
% \Mdots@ we do \mdots@
\AtBeginDocument{\xpatchcmd{\dots}{M}{m}{}{}}

\renewcommand*{\to}{%
    \DOTSB
    \myto
}
\NewDocumentCommand{\myto}{o}{%
    \IfValueTF{#1}{%
        \xrightarrow{#1}%
    }{%
        % default latex \to
        \rightarrow
    }%
}

\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}

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

답변2

\dotsof는 amsmath다음 토큰을 확인하고 필요한 경우 로 시작하는 다음 매크로의 의미도 확인합니다 \DOTSB. 선택적 인수에 대한 구문 분석은 둘 이상의 매크로(주로 인해 \futurelet)로 구현되므로 이러한 감지를 방지합니다. 따라서 에서 사용하는 마커가 \dots표시되지 않습니다 . 이 예에서는 매크로를 확장 가능한 부분과 화살표 및 선택적 인수에 대한 다른 부분으로 분할합니다.\DOTSB\dots\DOTSB

\documentclass{minimal}

\usepackage{amsmath}
\usepackage{xparse}

\renewcommand*{\to}{%
    \DOTSB
    \myto
}
\NewDocumentCommand{\myto}{o}{%
    \IfValueTF{#1}{%
        \xrightarrow{#1}%
    }{%
        % default latex \to
        \mathchar"3221
    }%
}

\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}

결과

\usepackage[french]{babel}

frenchb.ldf이는 재정의 \dots하고 정의가 amsmath사라졌기 때문에 에서는 작동하지 않습니다 .

다음 예에서는 수학 모드 내부 \dots의 매크로를 복원합니다.amsmath

\documentclass{minimal}

\usepackage{letltxmacro}
\usepackage{amsmath}
\LetLtxMacro\amsmathdots\dots

\usepackage{xparse}
\usepackage[french]{babel}

\AtBeginDocument{%
  \LetLtxMacro\frenchdots\dots
  \everymath{\LetLtxMacro\dots\amsmathdots}%
  \everydisplay{\LetLtxMacro\dots\amsmathdots}%
}

\renewcommand*{\to}{%
    \DOTSB
    \myto
}
\NewDocumentCommand{\myto}{o}{%
    \IfValueTF{#1}{%
        \xrightarrow{#1}%
    }{%
        % default latex \to
        \mathchar"3221
    }%
}

\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}

답변3

다음이 없는 솔루션 xparse:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{letltxmacro,amsmath}
\LetLtxMacro\amsdots\dots
\usepackage[french]{babel}
\AtBeginDocument{%
  \LetLtxMacro\frenchdots\dots
  \everymath{\LetLtxMacro\dots\amsdots}%
  \everydisplay{\LetLtxMacro\dots\amsdots}%
}
\renewcommand*\to{\DOTSB\myto}
\newcommand*\myto[1][]{\if$#1$\dots\else\xrightarrow{#1}\fi}

\begin{document}
\( t\to[s]\dots\to[b]a \to\)
\end{document}

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

관련 정보