編輯:更改了 MWE 以顯示法語 babel 的問題
所以,我想知道 TeX.sx 並遇到了這個問題
amsmath 中的神奇 \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 文件證實了這一點。有人有解決方案嗎?
編輯:我選擇了@egreg解決方案,因為其他兩個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
ofamsmath
檢查下一個標記,並在必要時檢查下一個宏的含義(如果它以\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}