出于某种原因,我需要一个提供活动撇号的包。为了简单起见,我们假设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
您想在文本模式下使用的宏在哪里。