附录

附录

根据这个答案

您可以使用命令访问当前字体\font,即使用\the\font哪个扩展为例如\OT1/cmr/m/n/10正常电脑现代字型。

那么为什么以下 LaTeX 手稿在使用 pdfTeX(TeXLive 2017)编译时不会产生 pdf 文件?

\documentclass{article}
\begin{document}
\the\font
\end{documen‌​t}

答案1

原来,楼主的偏好是\expandafter\string\the\font

以下(可编译)示例比较了已提出的三种方法:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}



\begin{document}

Compare
\begin{center}
    \expandafter\meaning\the\font
\end{center}
with
\begin{center}
    \expandafter\string\the\font
\end{center}
and with
\begin{center}
    \fontname\font
\end{center}

\end{document}

输出为:

代码输出


附录

让我补充几点,只是为了澄清几点。

正如我在评论中指出的那样,在所谓的新的字体选择方案(NFSS)是 LaTeX2e 的一部分,选择字体的控制序列具有以下形式

\<encoding>/<family>/<series>/<shape>/<size>

不是这不是一个“幸福的事件”,但也是一个NFSS本身所严重依赖的精确的设计原则。

简单想想典型的“低级”字体选择

\fontfamily{cmdh}\fontseries{m}\fontshape{n}%
\selectfont

工作原理:首先,第一行中的三个声明设置相应的内部宏\f@family\f@series\f@shape;然后,该\selectfont命令使用更新的值来构建并随后调用适当的“字体选择”控制序列。事实上,LaTeX2e 内核定义\fontfamily\fontseries\fontshape如下:

\DeclareRobustCommand\fontfamily[1]{\edef\f@family{#1}}
\DeclareRobustCommand\fontseries[1]{\edef\f@series{#1}}
\DeclareRobustCommand\fontshape [1]{\edef\f@shape{#1}}

\fontencoding\fontsize稍微复杂一些,但它们所做的其他事情中,它们以类似的方式设置内部宏\f@encoding\f@size。另一方面,的定义\selectfont

\DeclareRobustCommand\selectfont
        {%
    \ifx\f@linespread\baselinestretch \else
      \set@fontsize\baselinestretch\f@size\f@baselineskip \fi
    \xdef\font@name{%
      \csname\curr@fontshape/\f@size\endcsname}%
    \pickup@font
    \font@name
    \size@update
    \enc@update
    }

与我们的讨论相关的是

    \xdef\font@name{%
      \csname\curr@fontshape/\f@size\endcsname}%
    \pickup@font
    \font@name

如您所见,宏\font@name被扩展为一个控制序列,其名称由 的完整扩展、 和 的完整扩展的连接而成\curr@fontshape; /因为\f@size\curr@fontshape(静态)定义为

\def\curr@fontshape{\f@encoding/\f@family/\f@series/\f@shape}

并且由于这个定义得到充分展开后,我们发现这个过程确实产生了如下形式的控制序列

\T1/cmdh/m/n/10

(例如)。\pickup@font宏确保此控件名称已定义,并且已加载正确的外部字体(这才是真正的“艰苦工作”发生的地方!),之后通过执行来调用刚刚构建的字体选择器\font@name

我们可以添加\size@update\enc@update简单的“钩子”,其中可以存储当字体大小和/或编码分别发生变化时需要执行的操作,并且提到的两行代码\baselinestretch考虑到用户直接修改这个过时的 LaTeX2.09 样式参数的可能性。

综上所述,OP 的建议我们可以用其他几种方法来补充我们原来的例子,以获取有关当前字体的信息:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}



\begin{document}

Compare
\begin{center}
    \expandafter\meaning\the\font
\end{center}
with
\begin{center}
    \expandafter\string\the\font
\end{center}
and with
\begin{center}
    \fontname\font
\end{center}
Other methods that use internal commands follow.

\makeatletter

Taking font components apart:
\begin{center}
    \begin{tabular}{ll}
        Encoding: & \f@encoding  \\
        Family:   & \f@family    \\
        Series:   & \f@series    \\
        Shape:    & \f@shape     \\
        Size:     & \f@size
    \end{tabular}
\end{center}
All in a row:
\begin{center}
    \selectfont % needed in order to get "\font@name" in sync
    \expandafter\string\font@name
\end{center}

\makeatother

\end{document}

相应的输出为:

第二个代码示例的输出

答案2

的用法\the\font是定义一个扩展到当前字体选择器的控制序列。

因此\edef\thisfont{\the\font}会使\thisfont扩展为,比如说\tenrm

单独使用时它只会生成字体选择器,因此没有输出。

您也可以这样做

\expandafter\let\expandafter\thisfont\the\font

并将\thisfont变得等同于当前字体的字体选择器。

也许您的意思是\fontname\font,扩展为与当前字体相对应的 TFM 文件的名称。

相关内容