editar:mudou o MWE para mostrar o problema com a babel francesa
Então, eu estava pensando no TeX.sx e me deparei com esta questão
Como os pontos mágicos funcionam no amsmath?, eu queria fazer a mesma coisa (ter uma \dots
macro com reconhecimento).
\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}
mas os pontos não se adaptam. Eu fiz:
texdef -t latex -p amsmath DOTSB
e aparentemente \DOTSB
é \relax
, e o arquivo amsmath.sty confirma isso. Alguém tem uma solução para isso?
editar: optei pela solução @egreg, porque as outras duas conflitavam com o split
ambiente do amsmath
.
Responder1
Há um bug no french
módulo do babel
. O \dots
comando é redefinido para ser
\relax\csname\ifmmode M\else T\fi dots@\endcsname
então, no modo matemático \Mdots@
é executado, que se expande para \@xp\mdots@
, o que está errado: deveria ser simplesmente \mdots@
. Na verdade, o patch \dots
dá o resultado esperado:
\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}
Responder2
\dots
of amsmath
verifica o próximo token e também verifica o significado da próxima macro, se necessário, se começar com \DOTSB
. A análise de um argumento opcional evita essa detecção, pois é implementada por mais de uma macro (principalmente por causa de \futurelet
). Portanto \dots
não vê \DOTSB
o marcador usado por \dots
. O exemplo divide a macro em uma parte expansível \DOTSB
e outra parte para a seta e o argumento opcional:
\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}
Isso não funciona frenchb.ldf
porque redefine \dots
e a definição amsmath
desaparece.
O exemplo a seguir restaura a \dots
macro amsmath
dentro do modo matemático:
\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}
Responder3
Uma solução sem 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}