使用 \mathrm{} 时的空间规则

使用 \mathrm{} 时的空间规则

我正在使用 CAS 系统自动生成的 Latex 代码。它使用\mathrm{ln}{\mathrm e}

问题在于,与\mathrm使用 no 相比,这个字母与它前面的字母之间的间距较大。在以下情况下,空格会丢失:\mathrm{ln}

以下是一个例子

\documentclass[12pt]{book}
\usepackage{amsmath}
\usepackage{mleftright}  
\mleftright

\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
                      
\[
4 e^{3 x}+3 \ln\left(x \right)
\]                                                                                                              
\end{document}

使用 lualatex 编译,得到

在此处输入图片描述

我更喜欢第二种。前面的空间\mathrm e没有改变。但是前面的空间\mathrm{ln}丢失了。

为什么?那么使用 是否mathrm不合适ln

TL 2020

答案1

您的自动生成代码很糟糕,抱歉。在

3\mathrm{ln}\left(x\right)

有三个原子,即

  1. 3类型为 Ord
  2. \mathrm{ln}类型为 Ord
  3. \left(x\right)内部类型

在两个 Ord 类型的原子之间,TeX 不插入空格。

与此相反的,

    3\ln\left(x\right)

又包含三个原子,但有一个很大的区别,即

  1. 3类型为 Ord
  2. \lnOp 类型
  3. \left(x\right)内部类型

\thinmuskipTeX在 Ord 原子和 Op 原子之间插入一个细小的空间(大小为)。

抱歉,但“垃圾进,垃圾出”。如果软件能够识别ln要以直排方式输入的字符串,它完全可以主动输出,\ln而不是输出错误的\mathrm{ln}

顺便说一句,和\left\right不合适。有趣的是,“e”被翻译成{\mathrm e}而不是更正确的\mathrm{e}(如果你真的坚持把欧拉常数直立打印出来。

一个修复。

\documentclass[12pt]{book}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{amsmath}
\usepackage{mleftright}  

\mleftright

\ExplSyntaxOn
\NewCommandCopy{\latexmathrm}{\mathrm}

\RenewDocumentCommand{\mathrm}{m}
 {
  \str_case:nnF { #1 }
   {
    {e}{e}
    {i}{i}
    {ln}{\ln}
    {log}{\log}
    {sin}{\sin}
    % ... add to the list
   }
   { \latexmathrm{#1} }
 }
\ExplSyntaxOff

\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
                      
\[
4 e^{3 x}+3 \ln\left(x \right)
\]                                                                                                              
\end{document}

在此处输入图片描述

对于 LuaLaTeX 和unicode-math,解决方法必须有所不同。

\documentclass[12pt]{book}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{amsmath}
\usepackage{mleftright}  
\usepackage[mathit=sym,bold-style=ISO]{unicode-math}
\setmathfont{Asana Math}[Scale=MatchLowercase]
\setmainfont{Baskervaldx}[
  UprightFont=*-Reg,
  ItalicFont=*-Ita,
  BoldFont=*-Bol,
  BoldItalicFont=*-BolIta,
]

\mleftright

\ExplSyntaxOn
\AtBeginDocument
 {
  \NewCommandCopy{\latexmathrm}{\mathtextrm}
  \RenewDocumentCommand{\mathtextrm}{m}
   {
    \str_case:nnF { #1 }
     {
      {e}{e}
      {ln}{\ln}
      {log}{\log}
      {sin}{\sin}
      % ... add to the list
     }
     { \latexmathrm{#1} }
   }
 }% end of \AtBeginDocument
\ExplSyntaxOff

\begin{document}
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
                      
\[
4 e^{3 x}+3 \ln\left(x \right)
\]                                                                                                              
\end{document}

在此处输入图片描述

请注意,使用Baskervaldx.sty时并不是正确的选择。fontspec

答案2

在这种情况下,ln就是所谓的类对数运算符。

您可以使用\ln\operatorname{ln}\mathop{\mathrm{ln}}获得像 这样的间距。如果您不喜欢在显示模式下下标和上标位于上方和下方的方式,\log您还可以添加。\nolimits

如果amsmath尚未定义它,您可以编写\providecommand\ln{\operatorname{ln}}一个\ln可以在源中使用的命令,并能够在一个易于找到的地方进行调整。

相关内容