测试当前字体是否为等宽字体

测试当前字体是否为等宽字体

我正在尝试定义一个命令,该命令应根据当前活动字体提供不同的输出,尤其是取决于字体是等宽字体还是衬线/无衬线字体。

我知道有\the\font获取当前活动字体的方法,在 LaTeX 中,它给出类似\OT1/cmr/m/n/10或 的内容\OT1/cmtt/m/n/10。可以将其拆分以提取cmr/cmtt部分并明确测试此字符串。但是,我想知道是否有一种更灵活的方法,不需要对字体名称进行硬编码。

使用 pdflatex,有没有办法测试当前字体是否任何等宽字体?如果没有,是否有内置选项可以测试当前字体是否等于默认等宽字体?

答案1

正如评论中提到的,这两项测试都可以相当容易地进行。

测试默认等宽字体,宏的展开\f@family可以与 的展开进行比较\ttdefault。请注意,两个宏的前缀 (\long在本例中) 不同,这在\ifx使用 时尤其重要。

测试任何等宽字体可以通过在两个水平盒子中各填充一个字符来完成,在比例字体中,每个水平盒子的宽度不同,然后比较盒子的宽度。.M对我来说似乎是合理的选择。

下面的代码通过定义测试\ifttdefault和演示了这个想法\iftt

\documentclass{article}

\makeatletter

\newcommand\ifttdefault{%
    \edef\@tempa{\f@family}%
    \edef\@tempb{\ttdefault}%
    \ifx\@tempa\@tempb
        \expandafter\@firstoftwo
    \else
        \expandafter\@secondoftwo
    \fi
}

\newcommand\iftt{%
    \begingroup
    \setbox0=\hbox{.}%
    \setbox1=\hbox{M}%
    \ifdim\wd0=\wd1
        \expandafter\endgroup\expandafter\@firstoftwo
    \else
        \expandafter\endgroup\expandafter\@secondoftwo
    \fi
}

\makeatother

\begin{document}
\frenchspacing

Default monospace font: \ifttdefault{yes}{no}\par
\texttt{Default monospace font: \ifttdefault{yes}{no}}\par
{\fontfamily{txtt}\selectfont Default monospace font: \ifttdefault{yes}{no}}\par
\medskip

Any monospace font: \iftt{yes}{no}\par
\texttt{Any monospace font: \iftt{yes}{no}}\par
{\fontfamily{txtt}\selectfont Any monospace font: \iftt{yes}{no}}\par

\end{document}

在此处输入图片描述

相关内容