将字母和符号的 \mathcode 设置为“8000 的后果是什么?

将字母和符号的 \mathcode 设置为“8000 的后果是什么?

我知道这不是你应该做的事情。但为了好玩,我尝试将所有\mathcode字母的改为"8000并将它们定义为命令。然后每个这样的命令将对应于具有该符号的变量。下面,我尝试对字母 执行此操作j,尽管部分失败了。同样,我想重新定义+-和所有其他常见的数学符号。

到目前为止,一切似乎都或多或少地像以前一样运行。命令名称、环境名称和包含的键名称j似乎运行良好。我有四个问题:

  • 如果你这样做,你会破坏 LaTeX 的哪些功能全部字母?如果您对诸如+和之类的常见符号执行此操作会怎样-
  • 我如何修复下面的 MWE 以便j简单地打印j(使用\oldletter导致循环)?
  • 我是否以“正确的方式”进行操作,或者我应该使用不同的构造,例如使用\everymath\everydisplay\AtBeginDocument
  • 将所有这些功能包装到一个命令中的最佳方法是什么,例如\RedefineMathLetter{<letter>}\RedefineMathSymbol{<symbol>}
\documentclass{article}

\let\oldletter=j

\mathcode`\j="8000

\catcode`\j=\active

\NewDocumentCommand{j}{ o }{%
    J% using \oldletter caused a loop
    \IfValueT{#1}{_{#1}}%
}

\catcode`\j=11

\begin{document}

\( j = j[1] \)

\end{document}

在此处输入图片描述

答案1

在此处输入图片描述

\documentclass{article}

\mathchardef\oldletter=\mathcode`j

\mathcode`\j="8000

\catcode`\j=\active

\NewDocumentCommand{j}{ o }{%
    \oldletter
    \IfValueT{#1}{_{#1}}%
}

\catcode`\j=11

\begin{document}

\( j = j[1] \)

\end{document}

或者包装为命令形式:

\documentclass{article}



\def\mathdef#1{%
  \expandafter\mathchardef\csname old#1\endcsname\mathcode`#1 %
  \mathcode`#1="8000 %
  \begingroup
  \lccode`\~=`#1 %
  \lowercase{\endgroup\NewDocumentCommand~}}

\mathdef{j}{o}{\oldj\IfValueT{#1}{_{#1}}}

\begin{document}

\( j = j[1] \)

\end{document}

答案2

仍然没有 的expl3界面\mathchardef

\documentclass{article}

\ExplSyntaxOn

\cs_new_protected:Nn \gaussler_mathchardef:Nn
 {
  \tex_mathchardef:D #1 = #2 \scan_stop:
 }
\cs_generate_variant:Nn \gaussler_mathchardef:Nn { c }

\NewDocumentCommand{\RedefineMathLetter}{mmm}
 {% #1 = letter to redefine, #2 = args spec, #3 = replacement text
  % save the original math code
  \gaussler_mathchardef:cn { __gaussler_letter_#1: } { \char_value_mathcode:n { `#1 } }
  % define a new command to replace the letter
  \exp_args:Nc \NewDocumentCommand { __gaussler_letter_new_#1 } { #2 } { #3 }
  % define the active equivalent
  \char_set_active_eq:nc { `#1 } { __gaussler_letter_new_#1 }
  % at begin document set math code "8000
  \AtBeginDocument
   {
    \char_set_mathcode:nn { `#1 } { "8000 }
   }
 }
% in the replacement text, instead of the letter x, use \STD{x}
\NewDocumentCommand{\STD}{m}{ \use:c { __gaussler_letter_#1: } }

\ExplSyntaxOff

\RedefineMathLetter{J}{o}{\STD{J}\IfValueT{#1}{_{#1}}}

\begin{document}

$J+J[1]$

\end{document}

在此处输入图片描述

这个\STD{J}技巧可以避免无限循环。

相关内容