根据这个答案,
您可以使用命令访问当前字体
\font
,即使用\the\font
哪个扩展为例如\OT1/cmr/m/n/10
正常电脑现代字型。
那么为什么以下 LaTeX 手稿在使用 pdfTeX(TeXLive 2017)编译时不会产生 pdf 文件?
\documentclass{article}
\begin{document}
\the\font
\end{document}
答案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 文件的名称。