我知道这不是你应该做的事情。但为了好玩,我尝试将所有\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}
技巧可以避免无限循环。