我当前的序言定义了以下字体设置
\usepackage{beton}
\usepackage[T1]{fontenc}
\usepackage[T1,euler-digits]{eulervm}
\DeclareFontSeriesDefault[rm]{bf}{sbc}
txfonts
现在我对包通过命令生成的符号很感兴趣\varmathbb
,但是,导入包时它也会更改默认的数学和文本字体。我该如何避免这种情况并仍然获得使用该\varmathbb
命令的能力?
答案1
我们txfonts.sty
发现
\DeclareMathSymbol{\m@thbbch@rA}{\mathord}{lettersA}{129}
\DeclareMathSymbol{\m@thbbch@rB}{\mathord}{lettersA}{130}
[...other similar lines...]
\DeclareMathSymbol{\m@thbbch@rY}{\mathord}{lettersA}{153}
\DeclareMathSymbol{\m@thbbch@rZ}{\mathord}{lettersA}{154}
\DeclareMathSymbol{\varBbbk}{\mathord}{lettersA}{171}
\long\def\DoLongFutureLet #1#2#3#4{%
\def\@FutureLetDecide{#1#2\@FutureLetToken
\def\@FutureLetNext{#3}\else
\def\@FutureLetNext{#4}\fi\@FutureLetNext}
\futurelet\@FutureLetToken\@FutureLetDecide}
\def\DoFutureLet #1#2#3#4{\DoLongFutureLet{#1}{#2}{#3}{#4}}
\def\@EachCharacter{\DoFutureLet{\ifx}{\@EndEachCharacter}%
{\@EachCharacterDone}{\@PickUpTheCharacter}}
\def\m@keCharacter#1{\csname\F@ntPrefix#1\endcsname}
\def\@PickUpTheCharacter#1{\m@keCharacter{#1}\@EachCharacter}
\def\@EachCharacterDone \@EndEachCharacter{}
\DeclareRobustCommand*{\varmathbb}[1]{\gdef\F@ntPrefix{m@thbbch@r}%
\@EachCharacter #1\@EndEachCharacter}
我们还发现
\DeclareSymbolFont{lettersA}{U}{txmia}{m}{it}
\SetSymbolFont{lettersA}{bold}{U}{txmia}{bx}{it}
\DeclareFontSubstitution{U}{txmia}{m}{it}
那是什么? 的字母表\varmathbb
不在标准 ASCII 位置(它们是为 Fraktur 字母保留的),因此该包定义了一个例程,用于将类似于的内容转换\varmathbb{ABC}
为从右侧插槽中获取的符号序列。
可以使用更先进的工具来简化设置。插槽相对于 ASCII 码有 64 的偏移量,对于参数中的每个字母,我们需要生成数学码,该数学码的第一个十六进制数字是\symlettersA
,后面跟着 64 加上字母的 ASCII 码(同样是十六进制)。
\documentclass{article}
\usepackage{beton}
\usepackage[T1]{fontenc}
\usepackage[T1,euler-digits]{eulervm}
\DeclareFontSeriesDefault[rm]{bf}{sbc}
\DeclareSymbolFont{lettersA}{U}{txmia}{m}{it}
\SetSymbolFont{lettersA}{bold}{U}{txmia}{bx}{it}
\DeclareFontSubstitution{U}{txmia}{m}{it}
\DeclareMathSymbol{\varBbbk}{\mathord}{lettersA}{171}
\ExplSyntaxOn
\NewDocumentCommand{\varmathbb}{m}
{
\tl_map_function:nN { #1 } \richard_varmathbb:n
}
\cs_new_protected:Nn \richard_varmathbb:n
{
\mathchar \int_eval:n { \symlettersA * "100 + `#1 + 64 } \scan_stop:
}
\ExplSyntaxOff
\begin{document}
Abc $a+b=c$
$\varmathbb{ABC}+\varmathbb{D}+\varmathbb{EFGHIJKLMNOPQRSTUVWXYZ}$
\end{document}