Textcomp 包覆盖 Gensymb 以获取度数符号

Textcomp 包覆盖 Gensymb 以获取度数符号

考虑一下代码

\documentclass{book}
\usepackage{amsthm,latexsym,amssymb,amsmath,verbatim}
\usepackage{gensymb}
%\usepackage{textcomp}
\begin{document}
\Huge
\noindent 45$\degree$ \\
45$^\circ$\\
%45\textdegree
\end{document}

产生输出

在此处输入图片描述

经检查,似乎45$\degree$45$^\circ$产生完全相同的字形。

现在,如果我取消注释%\usepackage{textcomp}上述%45\textdegree代码并运行它,我会得到

在此处输入图片描述

请注意,45$\degree$现在似乎渲染45\textdegree;但45$^\circ$似乎产生与以前相同的字形。

问题:还有其他符号可以textcomp“胜过”gensymb吗?有人能解释一下是什么原因造成的吗?也许,我可以如何覆盖它,以便如果我在序言中同时调用gensymb和包并调用文档中的命令---我会得到通常产生的结果?textcomp\degree\degree

谢谢。

答案1

如果我编译

\documentclass{book}
\usepackage{gensymb}
\usepackage{textcomp}

\begin{document}

$45\degree$

$45^\circ$

45\textdegree

\end{document}

textcomp使用 TeX Live 2012,在内核中包含之前,我得到

在此处输入图片描述

\textdegree如果我注释掉 ,会出现错误\usepackage{textcomp}。前两行的输出变为

在此处输入图片描述

因此的目标gensymb总是如果可能的话,一直使用较小的字形textcomp

它通过以下方式实现此目的:

\AtBeginDocument{%
  \@ifpackageloaded{textcomp}
    {\gns@setupmathcomp\gns@usetcsymbols}%
    {\gns@usefakedsymbols}
  [...]
}

不幸的是,该软件包尚未更新以跟上textcomp内核的包含,因此\textdegree即使textcomp没有加载,它实际上也没有意识到可以使用。如果您加载它,则输出与作者预期的一致gensymb

我不确定你为什么认为textcomp“王牌” gensymb:这种行为是通缉

说实话,我会避免加载gensymb那些没有提供其他方式可用的东西。无论如何,你可以gensymb通过以下方式缩短加载时间:

\documentclass{book}

\makeatletter
\DeclareSymbolFont{gns@font}{TS1}{\familydefault}{m}{n}
\ifx\mv@bold\@undefined\else
  \SetSymbolFont{gns@font}{bold}{TS1}{\familydefault}{\bfdefault}{n}
\fi
\DeclareMathSymbol{\tccelsius}{\mathord}{gns@font}{137}     % {'211}
\DeclareMathSymbol{\tcdegree}{\mathord}{gns@font}{176}      % {'260}
\DeclareMathSymbol{\tcperthousand}{\mathord}{gns@font}{135} % {'207}
\DeclareMathSymbol{\tcmu}{\mathord}{gns@font}{181}          % {'265}
\DeclareMathSymbol{\tcohm}{\mathord}{gns@font}{87}          % {'127}
\DeclareRobustCommand{\degree}{%
  \ifmmode\tcdegree\else\textdegree\fi}
\DeclareRobustCommand{\celsius}{%
  \ifmmode\tccelsius\else\textcelsius\fi}
\DeclareRobustCommand{\perthousand}{%
  \ifmmode\tcperthousand\else\textperthousand\fi}
\DeclareRobustCommand{\ohm}{\ifmmode\tcohm\else\textohm\fi}
\DeclareRobustCommand{\micro}{\ifmmode\tcmu\else\textmu\fi}
\makeatother


\begin{document}

$45\degree$

$45^\circ$

45\textdegree

\degree,\celsius,\perthousand,\ohm,\micro

\end{document}

在此处输入图片描述

如果你只是需要\degree,那么浪费一个数学组是没有意义的:

\documentclass{book}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand{\degree}{}
 {
  \mode_if_math:TF
   {
    \text
     {
      \normalfont
      \str_if_eq:vnT { math@version } { bold } { \bfseries }
      \textdegree
     }
   }
   {
    \textdegree
   }
 }

\ExplSyntaxOff

\begin{document}

$45\degree$

$45^\circ$

45\textdegree

\boldmath $45\degree$

\end{document}

在此处输入图片描述

答案2

  1. \usepackage{amsthm,latexsym,amssymb,amsmath,verbatim}似乎不相关。
  2. 根据https://ctan.org/pkg/textcomp, 这textcomp软件包已过时现在“部分LATEX 分布“。
  3. 下面改编的代码展示了(对我来说)预期的行为。

在此处输入图片描述

\documentclass{book}
%\usepackage{amsthm,latexsym,amssymb,amsmath,verbatim}
\usepackage{gensymb}
%\usepackage{textcomp}
\begin{document}
\Huge
\noindent 45$\degree$ \texttt{\textbackslash degree} (math mode)\\
45$^\circ$ \texttt{\textbackslash circ} (math mode)\\
45\textdegree\ \texttt{\textbackslash textdegree} (text mode)
\end{document}

在此处输入图片描述


PS:我使用 Overleaf 编译了此文件,设置如下。当我改用 pdfLaTeX 时,结果看起来会有些不同。

在此处输入图片描述

在此处输入图片描述

相关内容