定義 \dots-aware 命令

定義 \dots-aware 命令

編輯:更改了 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解決方案,因為其他兩個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

\dotsofamsmath檢查下一個標記,並在必要時檢查下一個宏的含義(如果它以\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}

在此輸入影像描述

相關內容