考虑以下 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 }