为什么 fontspec 不能处理以点为单位的字体大小设置?

为什么 fontspec 不能处理以点为单位的字体大小设置?

我想设置 TeX 文档中字体的精确大小(以磅为单位)。仔细阅读文档后fontspec,我没有找到很多与设置字体大小相关的信息。所以我求助于谷歌。几篇帖子建议使用\fontsize与 结合使用\selectfont,包括:

我的问题有两个:

  • 为什么fontspec不处理这个?
  • \fontsize\selectfont从哪里来的?LaTeX 是原语吗?它们是库的一部分吗?

答案1

你问,“它们来自哪里\fontsize\selectfont它们是 LaTeX 原语吗?它们是库的一部分吗?”

  • 这两个宏均由 LaTeX2e 内核定义,或者格式。术语“原始” [命令] 在 TeX 和 LaTeX 圈子中具有特殊含义,因此将其称为“原始”是不明智\fontsize\selectfont

  • 就像原来的“Plain TeX”一样格式由一组基元(通常但并非普遍称为“Knuth TeX”)和一组基于这些基元构建的宏组成(基元和上述宏均在 TeXbook 中详细解释),LaTeX2e格式由一组基元(目前来自 eTeX,而不是 Knuth TeX)和一组在 LaTeX2e 内核中定义的宏组成。LaTeX 内核可以在文件中找到latex.ltx

  • 在当前版本latex.ltx(“LaTeX2e <2021-06-01> patch level 1”)中,该宏\fontsize定义在文件的第 7036 行和 7037 行,如下所示:

    \DeclareRobustCommand\fontsize[2]
       {\set@fontsize\baselinestretch{#1}{#2}}
    

    该宏\set@fontsize在第 7985 行至第 8002 行定义如下:

    \def\set@fontsize#1#2#3{%
        \@defaultunits\@tempdimb#2pt\relax\@nnil
        \edef\f@size{\strip@pt\@tempdimb}%
        \@defaultunits\@tempskipa#3pt\relax\@nnil
        \edef\f@baselineskip{\the\@tempskipa}%
        \edef\f@linespread{#1}%
        \let\baselinestretch\f@linespread
          \def\size@update{%
            \baselineskip\f@baselineskip\relax
            \baselineskip\f@linespread\baselineskip
            \normalbaselineskip\baselineskip
            \setbox\strutbox\hbox{%
              \vrule\@height.7\baselineskip
                    \@depth.3\baselineskip
                    \@width\z@}%
            \let\size@update\relax}%
      }
    
  • 而宏则\selectfont在第 7954 行至第 7985 行定义如下:

    \DeclareRobustCommand\selectfont
            {%
        \ifx\f@linespread\baselinestretch \else
          \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
        \ifx\delayed@f@adjustment\@empty
        \else
          \let\f@shape@saved\f@shape
          \let\f@series@saved\f@series
          \delayed@f@adjustment
          \maybe@load@fontshape
          \ifcsname \f@encoding/\f@family/\f@series/\f@shape \endcsname
          \else
            \let\f@shape\f@shape@saved
            \let\f@series\f@series@saved
            \let\delayed@merge@font@shape\merge@font@shape
            \let\delayed@merge@font@series\merge@font@series
            \delayed@f@adjustment
            \let\delayed@merge@font@shape\merge@font@shape@without@substitution
            \let\delayed@merge@font@series\merge@font@series@without@substitution
          \fi
          \let\delayed@f@adjustment\@empty
        \fi
        \@forced@seriesfalse
        \xdef\font@name{%
          \csname\curr@fontshape/\f@size\endcsname}%
        \pickup@font
        \font@name
        \UseHook{selectfont}%
        \size@update
        \enc@update
        }
    \NewHook{selectfont}
    
  • 正如代码所示,这两个宏都非常复杂,并且依赖大量的辅助宏来完成大部分工作。

  • 您还问:“为什么fontspec不处理这个问题?”正如@UlrikeFischer 和@Cicada 已经在评论中指出的那样,没有必要或合理的理由让执行现有的 LaTeX 宏和fontspec可以完美处理的任务。\fontsize\selectfont

相关内容