我正在尝试定义一个命令,该命令应根据当前活动字体提供不同的输出,尤其是取决于字体是等宽字体还是衬线/无衬线字体。
我知道有\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}