数学模式下的有效撇号字符

数学模式下的有效撇号字符

出于某种原因,我需要一个提供活动撇号的包。为了简单起见,我们假设ABC在文本模式下每个撇号都应替换为。在数学模式下,将保留默认行为。

latex.ltx在第 4548 行至第 4563 行中,撇号字符被定义为“math-active” :

\def\active@math@prime{^\bgroup\prim@s}
{\catcode`\'=\active \global\let'\active@math@prime}
\def\prim@s{%
  \prime\futurelet\@let@token\pr@m@s}
\def\pr@m@s{%
  \ifx'\@let@token
    \expandafter\pr@@@s
  \else
    \ifx^\@let@token
      \expandafter\expandafter\expandafter\pr@@@t
    \else
      \egroup
    \fi
  \fi}
\def\pr@@@s#1{\prim@s}
\def\pr@@@t#1#2{#2\egroup}

此代码确保在数学模式下将撇号字符序列转换为素数符号序列。

为了满足我的需要,我设计了以下代码:

\begin{filecontents}{mypackage.sty}
\RequirePackage{xparse}
\ProvidesExplPackage {mypackage} {2019-09-20} {1.0} {My package}
\cs_new:Npn \mypackage_apostrophe:
  {
    \mode_if_math:TF
      {
        \active@math@prime % latex.ltx, line 4548
      }
      {
        ABC % dummy text for testing
      }
  }
\char_set_active_eq:NN ' \mypackage_apostrophe:
\NewDocumentCommand \Activate { }
  {
    \char_set_catcode_active:N '
  }
\NewDocumentCommand \Deactivate { }
  {
    \char_set_catcode_other:N '
  }
\end{filecontents}
\documentclass{article}
\usepackage{mypackage}
\begin{document}
a'b $f'(x)$ $f''(x)$

\Activate
a'b $f'(x)$ $f''(x)$

\Deactivate
a'b $f'(x)$ $f''(x)$
\end{document}

如果撇号字符处于活动状态并且$f''(x)$需要第二次派生,则此代码会生成错误消息:

! Double superscript. \active@math@prime ->^
                      \bgroup \prim@s
l.30 a'b $f'(x)$ $f''
                   (x)$

我该如何避免出现此错误消息(保持'活动状态)?

答案1

线条

\catcode`\'=\active 
\def\svprime{\active@math@prime}
\def'{\ifmmode\expandafter\svprime\else\expandafter\ABC\fi}
\def\ABC{ABC}

几乎已经成功了。但后来我最后意识到由于\pr@m@s采用了重复测试',我必须'在定义之前使其处于活动状态\pr@m@s,否则它总是会无法通过\ifx重复测试'

注释掉了与\prime中的定义相关的其他部分latex.ltx

\documentclass{article}
\makeatletter
\catcode`\'=\active 
%\def\active@math@prime{^\bgroup\prim@s}
%{\catcode`\'=\active \global\let'\active@math@prime}
%\def\prim@s{%
%  \prime\futurelet\@let@token\pr@m@s}
\def\pr@m@s{%
  \ifx'\@let@token
    \expandafter\pr@@@s
  \else
    \ifx^\@let@token
      \expandafter\expandafter\expandafter\pr@@@t
    \else
      \egroup
    \fi
  \fi}
%\def\pr@@@s#1{\prim@s}
%\def\pr@@@t#1#2{#2\egroup}
\def'{\ifmmode\expandafter\active@math@prime\else\expandafter\ABC\fi}
\def\ABC{ABC}
\makeatother
\begin{document}
Text mode: x'x
\begin{equation}
a = v'(t) = x''(t)
\end{equation}
\end{document}

在此处输入图片描述

答案2

\pr@m@s仍然寻找类别代码 12 的撇号。修补它很容易。

\documentclass{article}
\usepackage{regexpatch}

\makeatletter
\regexpatchcmd{\pr@m@s}{'}{\cA'}{}{} % \pr@m@s should look for an active '
% now define the active '
\catcode`'=\active
\protected\def'{\ifmmode\expandafter\active@math@prime\else ABC\fi}
\makeatother

\begin{document}

' in text mode

$f'+f''$

\end{document}

在此处输入图片描述

在现实世界中,它可能是

\protected\def'{%
  \ifmmode
    \expandafter\active@math@prime
  \else
    \expandafter\wehro@active@text@prime
  \fi
}

\wehro@active@text@prime您想在文本模式下使用的宏在哪里。

相关内容