편집하다:프랑스 바벨의 문제를 보여주기 위해 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
이고 \relax
amsmath.sty 파일이 이를 확인합니다. 누구든지 이것에 대한 해결책을 가지고 있습니까?
편집하다: 다른 두 솔루션 split
은 amsmath
.
답변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
\dots
of는 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}