使用 mathtools 包时重新定义插入符号 ^

使用 mathtools 包时重新定义插入符号 ^

考虑以下 MWE:

\documentclass{article}
%\usepackage{mathtools}

\newcommand\newCaret{X}

\catcode`^=\active
\let^=\newCaret

\begin{document}
    $x^2$
\end{document}

一切正常,输出xX2符合预期。

当我现在启用 mathtools 包时,出现以下错误:

Package: graphics 2016/07/10 v1.0t Standard LaTeX Graphics (DPC,SPQR)

! Missing number, treated as zero.
<to be read again> 
                   X
l.33 \catcode`\^^
                 A=\catcode`\%
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

graphics(在使用的包的开头mathtools,有一些 catcode-voodoo 似乎与我的 冲突\catcode...

可能的解决方案 1

\catcode...现在,当我将和两行移到\let...之后时\begin{document},一切又恢复正常。但是,我需要它们留在序言中,因此这并不能解决问题。

可能的解决方案

我尝试将\catcode...和包装\let...在 里面\AtBeginDocument,但结果却出现:

\Gin@req@height=\dimen123
\Gin@req@width=\dimen124
)
! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.11 \begin{document}

Please don't say `\def cs{...}', say `\def\cs{...}'.
I've inserted an inaccessible control sequence so that your
definition will be completed without mixing me up too badly.
You can recover graciously from this error, if you're
careful; see exercise 27.2 in The TeXbook.

! Undefined control sequence.
l.12    $x^
         2$

背景

我曾有一个想法,也许很愚蠢,那就是用直立和斜体的上下标来简化工作。直到现在,我

\newcommand\sub[1]{_\text{#1}}
\let\supremum\sup
\renewcommand\sup[1]{^\text{#1}}

对于诸如k\sub{b}和之类的东西f_i。结合我的问题这里k__b我设法用和获得等效输出f_i:当我将下划线加倍时,我会像使用我的\sub命令一样获得直立的下标,并且输入/更改速度非常快。它也适用于上标(^^^),但前提是我更改 catcode/让插入符号序言,所以我无法将我的代码整齐地捆绑在包中。

答案1

更改序言中的类别代码有什么问题^?有些包在文档开头加载文件,这些文件可能包含如下结构

\catcode`\^^A=\catcode`\%

用于将字节 1 变成注释字符或一些`\^^M技巧。

您可以在前言中设置 catcode,但要延迟它\AtBeginDocument(请确保在加载所有包后执行此操作):

\newcommand\NewCaret{X}
\AtBeginDocument{%
  \begingroup\lccode`\~=`\^
  \lowercase{\endgroup\let~}\NewCaret
  \catcode`\^=\active
}

这个\lowercase技巧在网站的其他地方有解释,请参阅\lowercase 技巧。另一方面,如果^只需要在数学模式下将定义为活动字符,则最好仅将其设为数学活跃, 看文本模式与数学模式下的下划线

\newcommand\NewCaret{X}
\begingroup\lccode`\~=`\^
\lowercase{\endgroup\let~}\NewCaret
\AtBeginDocument{\mathcode`\^="8000 }

相关内容